一种多进程安全访问sqlite的方法与流程

文档序号:16330866发布日期:2018-12-19 06:11阅读:4712来源:国知局
一种多进程安全访问sqlite的方法与流程

本发明涉及数据库技术领域,尤其是一种多进程安全访问sqlite的方法。

背景技术

sqlite,是一款轻型的数据库,是遵守acid的关系型数据库管理系统,它包含在一个相对小的c库中。它是d.richardhipp建立的公有领域项目。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百k的内存就够了。不像常见的客户-服务器范例,sqlite引擎不是个程序与之通信的独立进程,而是连接到程序中成为它的一个主要部分。所以主要的通信协议是在编程语言内的直接api调用。这在消耗总量、延迟时间和整体简单性上有积极的作用。整个数据库(定义、表、索引和数据本身)都在宿主主机上存储在一个单一的文件中。它的简单的设计是通过在开始一个事务的时候锁定整个数据文件而完成的。sqlite的锁机制是粗粒度的,它允许多个读,但是一次只允许一个写。写锁会在写期间排他地锁定数据库,其他人在此期间不能访问数据库。

目前多进程访问sqlite的方法,可以采用文件锁的方式,创建一个全局的文件锁,每个进程创建自己独立的连接去连接数据库。每个进程访问数据库之前,去获取文件锁,获得锁资源后,再去访问数据库。

该方法的缺点为:

1.该方法采用进程间的文件锁,当访问量很大时,锁的竞争会很激烈,系统开销变的很大,导致系统运行很慢甚至死机。

2.该方法没有将数据库的访问类型区分,无法做到数据库操作的优先级区别,同时没有将数据库的同类型操作当做一个事务处理,导致数据库操作效率低下。

3.若某个数据库操作耗时很长,其它数据库操作需要一直等待,导致系统无法继续运行,无法做到资源的充分利用。



技术实现要素:

本发明要解决的技术问题是提供一种多进程安全访问sqlite的方法,能够解决现有技术的不足,创建了一个独立的数据库访问通道,解决数据库并发访问的问题,避免出现数据库lock而无法访问的情况。

为解决上述技术问题,本发明所采取的技术方案如下。

一种多进程安全访问sqlite的方法,包括以下步骤:

a、对数据库的访问分为读线程、写线程和文件线程;

b、步骤a中所述进程在访问数据库之前,查询数据库锁的状态,若数据库被锁住,则准备访问数据库的线程处于等待状态,等锁被释放后,准备访问数据库的线程获取锁的控制权对数据库进行操作;

c、上述线程采用先到先得的原则进行锁的获取,线程对数据库的操作完成后,释放锁,其它线程此时获取锁状态然后对数据库进行操作。

作为优选,在每次数据库操作语句前添加一个随机码,服务器返回结果时也带上这个随机码,若随机码对应,则认为返回值是此次的数据库读取结果。

作为优选,客户端每个有数据库访问的线程,均建立一个独立的socket来和服务端通信。

作为优选,所述写线程包括以下步骤:

w1、客户端发送sql命令;

w2、将sql命令写入接收进程;

w3、接收进程将命令放入数据队列,数据队列用于存储sql命令和客户端的地址;

w4、处理进程从数据队列读取命令,根据不同的操作划分命令;

w5、根据不同的命令对数据库进行插入操作或删除修改操作。

作为优选,当进行插入操作时,当请求时间超过3s或请求次数超过100次后,执行插入操作;当进行删除修改操作时,出现请求时立即执行删除修改操作。

作为优选,所述读线程包括以下步骤:

r1、客户端发送sql命令;

r2、将sql命令写入接收进程;

r3、接收进程将命令放入数据队列,数据队列用于存储sql命令和客户端的地址;

r4、处理进程从数据队列读取命令;

r5、直接访问数据库,得到结果集;

r6、根据客户端的地址,将结果集返回给客户端;

r7、客户端收到结果集后对结果进行解压。

作为优选,数据库读取访问的超时时间设置为10s~20s。

作为优选,所述文件线程包括以下步骤,

f1、客户端发送sql命令;

f2、将sql命令写入接收进程;

f3、接收进程将命令放入数据队列,数据队列用于存储sql命令和客户端的地址;

f4、处理进程从数据队列读取命令;

f5、直接访问数据库,得到结果集,并将结果集生成对应的文件;

f6、根据客户端的地址,将生成的文件信息返回给客户端。

作为优选,数据库读取访问的超时时间设置为30s~60s。

采用上述技术方案所带来的有益效果在于:

1.提供了一种高效的,可靠的并行访问sqlite的方法,可以在保证数据库访问正常的同时,提供高性能的访问效率。

2.将数据库的读操作和写操作分离,避免了当出现大量插入请求的时候,无法响应读操作导致访问超时。

3.加入了随机数验证机制,避免出现数据接收混乱的情况。保证了数据的有序和有效性。

附图说明

图1是本发明一个具体实施方式的流程图。

图2是本发明一个具体实施方式中写线程的流程图。

图3是本发明一个具体实施方式中读线程的流程图。

图4是本发明一个具体实施方式中文件线程的流程图。

具体实施方式

参照图1-4,本发明一个具体实施方式包括以下步骤:

a、对数据库的访问分为读线程、写线程和文件线程;

b、步骤a中所述进程在访问数据库之前,查询数据库锁的状态,若数据库被锁住,则准备访问数据库的线程处于等待状态,等锁被释放后,准备访问数据库的线程获取锁的控制权对数据库进行操作;

c、上述线程采用先到先得的原则进行锁的获取,线程对数据库的操作完成后,释放锁,其它线程此时获取锁状态然后对数据库进行操作。

在每次数据库操作语句前添加一个随机码,服务器返回结果时也带上这个随机码,若随机码对应,则认为返回值是此次的数据库读取结果。

客户端每个有数据库访问的线程,均建立一个独立的socket来和服务端通信。

所述写线程包括以下步骤:

w1、客户端发送sql命令;

w2、将sql命令写入接收进程;

w3、接收进程将命令放入数据队列,数据队列用于存储sql命令和客户端的地址;

w4、处理进程从数据队列读取命令,根据不同的操作划分命令;

w5、根据不同的命令对数据库进行插入操作或删除修改操作。

当进行插入操作时,当请求时间超过3s或请求次数超过100次后,执行插入操作;当进行删除修改操作时,出现请求时立即执行删除修改操作。

所述读线程包括以下步骤:

r1、客户端发送sql命令;

r2、将sql命令写入接收进程;

r3、接收进程将命令放入数据队列,数据队列用于存储sql命令和客户端的地址;

r4、处理进程从数据队列读取命令;

r5、直接访问数据库,得到结果集;

r6、根据客户端的地址,将结果集返回给客户端;

r7、客户端收到结果集后对结果进行解压。

数据库读取访问的超时时间设置为10s~20s。

所述文件线程包括以下步骤,

f1、客户端发送sql命令;

f2、将sql命令写入接收进程;

f3、接收进程将命令放入数据队列,数据队列用于存储sql命令和客户端的地址;

f4、处理进程从数据队列读取命令;

f5、直接访问数据库,得到结果集,并将结果集生成对应的文件;

f6、根据客户端的地址,将生成的文件信息返回给客户端。

数据库读取访问的超时时间设置为30s~60s。

以上显示和描述了本发明的基本原理和主要特征和本发明的优点。本行业的技术人员应该了解,本发明不受上述实施例的限制,上述实施例和说明书中描述的只是说明本发明的原理,在不脱离本发明精神和范围的前提下,本发明还会有各种变化和改进,这些变化和改进都落入要求保护的本发明范围内。本发明要求保护范围由所附的权利要求书及其等效物界定。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1