[发明专利]避免sqlite数据库并发访问时产生文件死锁的方法有效
申请号: | 201611199734.2 | 申请日: | 2016-12-22 |
公开(公告)号: | CN106598748B | 公开(公告)日: | 2019-11-08 |
发明(设计)人: | 邹锦元;陈宏亮 | 申请(专利权)人: | 深圳市科脉技术股份有限公司 |
主分类号: | G06F9/52 | 分类号: | G06F9/52;G06F16/25 |
代理公司: | 暂无信息 | 代理人: | 暂无信息 |
地址: | 518000 广东省深圳市南山*** | 国省代码: | 广东;44 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 一种 避免 sqlite 数据库 并发 访问 产生 文件 死锁 方法 | ||
本发明公开一种避免sqlite数据库并发访问时产生文件死锁的方法,在软件设计阶段将客户端sqlite数据库由一个拆分为两个或多个,每一个sqlite数据库对应软件系统中某一类型的写入操作的需求。将软件系统中所有的数据表按照不同类型的写入操作分别归类,并放置在不同的sqlite数据库文件中。这样可保证不同类型的写入操作分别对应于不同的文件,当应用软件中的多个线程在同一时间产生了写入操作时,由于分别写入的是不同的物理磁盘文件,从而规避了一个sqlite数据库文件不能同时由多个线程并发写入的问题。
技术领域
本发明属于数据库领域,特别涉及一种商业应用软件中避免sqlite数据库在并发访问时产生文件死锁的方法。
背景技术
sqlite作为目前多种操作系统平台上常用的小型关系数据库,在PC机、手机、平板及其它移动设备上有着广泛的应用。但是在实际的项目中,通常需要在sqlite数据库与远程服务器之间进行数据交换。而sqlite作为一种文件数据库,并不具备多线程并发写入的能力,并且其也不具备大型关系数据库(如oracle、sybase、sqlserver等)提供的复杂的事务和锁机制来解决这一问题。因此在应用软件的实际开发过程中,通常会面临着这样一个问题:当客户端由于用户的操作正在对本地sqlite数据库写入数据时,如果此时正在与远程服务器进行双向数据交换的操作,会由于sqlite数据库已被锁住而导致数据交换操作无法正常运行,在多线程的环境中这个问题的发生则更为频繁。
在大多数的应用软件中,对sqlite的写入操作会来自两方面的需求:
a、用户的操作结果(例如用户输入了新的数据)需要写入sqlite进行保存。
b、服务器端有了新的数据需要同步到客户端的sqlite数据库中。
上述两方面的需求中,b发生的时间和频率是可以在软件系统内部进行控制的,而a操作发生的时间和频率是随机的(用户在任何时间都可能进行操作,不可预估),因此a和b两者在同一时间点上都企图对sqlite数据库进行写入操作的情况不可避免,而一旦发生这种情况则会导致软件系统出现故障。
目前在大多数商业应用软件中通常用以下一种方法或多种方法来解决这一问题:
1、尽量降低服务器端与客户端进行数据交换的频率,以减少并发写入的概率。
2、对sqlite数据库的写入操作采用缓存机制,即在写入前将数据先缓存在内存中,当检测到sqlite数据库文件已被其它线程锁住时,则等待直至锁被释放后再进行写入操作。
针对目前常用的解决sqlite并发写入冲突的两种方案,都存在一定的缺陷。
第1方案的缺陷在于:
其一:降低数据交换的频率只是减少了冲突发生的概率,但不能杜绝冲突,并未从根本上解决问题。
其二:这一方案是以在一段时间内牺牲客户端与服务器端的数据一致性为代价,在一些家用或娱乐产品中,这一缺陷的影响并不严重,但在商业软件系统中,往往会给用户的使用带来不便,甚至产生数据错误的严重后果。
第2方案的缺陷在于:
其一:极大的增加了软件设计和开发的难度,进而导致软件开发的成本上升,以及系统的稳定性下降。
其二:采用缓存机制也就意味着数据实际上是延迟写入到sqlite数据库中,如果在此期间发生意外导致程序异常结束(客户端电脑掉电等不可抗因素),则会导致这部分缓存的数据丢失,而用户则会以为已经保存成功。在商业应用软件中,用户的业务数据通常都非常重要,因此这一情况是不允许发生的。
发明内容
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于深圳市科脉技术股份有限公司,未经深圳市科脉技术股份有限公司许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201611199734.2/2.html,转载请声明来源钻瓜专利网。