CN106598748B - 避免sqlite数据库并发访问时产生文件死锁的方法 - Google Patents
避免sqlite数据库并发访问时产生文件死锁的方法 Download PDFInfo
- Publication number
- CN106598748B CN106598748B CN201611199734.2A CN201611199734A CN106598748B CN 106598748 B CN106598748 B CN 106598748B CN 201611199734 A CN201611199734 A CN 201611199734A CN 106598748 B CN106598748 B CN 106598748B
- Authority
- CN
- China
- Prior art keywords
- sqlite
- sqlite database
- software
- different
- file
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/10—File systems; File servers
- G06F16/17—Details of further file system functions
- G06F16/176—Support for shared access to files; File sharing support
- G06F16/1767—Concurrency control, e.g. optimistic or pessimistic approaches
- G06F16/1774—Locking methods, e.g. locking methods for file systems allowing shared and concurrent access to files
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/52—Program synchronisation; Mutual exclusion, e.g. by means of semaphores
- G06F9/524—Deadlock detection or avoidance
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/23—Updating
- G06F16/2308—Concurrency control
- G06F16/2336—Pessimistic concurrency control approaches, e.g. locking or multiple versions without time stamps
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/25—Integrating or interfacing systems involving database management systems
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Software Systems (AREA)
- Databases & Information Systems (AREA)
- Data Mining & Analysis (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开一种避免sqlite数据库并发访问时产生文件死锁的方法,在软件设计阶段将客户端sqlite数据库由一个拆分为两个或多个,每一个sqlite数据库对应软件系统中某一类型的写入操作的需求。将软件系统中所有的数据表按照不同类型的写入操作分别归类,并放置在不同的sqlite数据库文件中。这样可保证不同类型的写入操作分别对应于不同的文件,当应用软件中的多个线程在同一时间产生了写入操作时,由于分别写入的是不同的物理磁盘文件,从而规避了一个sqlite数据库文件不能同时由多个线程并发写入的问题。
Description
技术领域
本发明属于数据库领域,特别涉及一种商业应用软件中避免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数据库中,如果在此期间发生意外导致程序异常结束(客户端电脑掉电等不可抗因素),则会导致这部分缓存的数据丢失,而用户则会以为已经保存成功。在商业应用软件中,用户的业务数据通常都非常重要,因此这一情况是不允许发生的。
发明内容
本发明的主要目的是提供一种商业应用软件中避免sqlite数据库在并发访问时产生文件死锁的方法,旨在保证客户端sqlite数据库与服务器端高频率的数据交换的情况下,不与用户对软件的操作而产生的数据写入发生冲突,同时也不大幅增加应用软件开发的复杂程度。
本发明提出一种避免sqlite数据库在并发访问时产生文件死锁的方法,其特征在于,所述方法包含下述步骤:
S1:在软件设计阶段,将软件中对sqlite数据库的不同需求类型的读操作和写操作,分别进行归类,并依据不同的读、写操作类型,设计对应的多个sqlite数据库;
S2:在软件设计阶段,将软件系统中使用到的所有数据表,依据不同的读写操作类型,分别进行归类,并放置在S1中对应的多个sqlite数据库中;
S3:在软件的编码实现阶段,增设一个对sqlite数据库进行统一操作的逻辑模块,通过该模块将软件中对sqlite数据库的所有读写操作,自动定向到S1中对应的多个sqlite数据库中,最终将多个不同的物理sqlite数据库在逻辑层面上统一为一个sqlite数据库。
将客户端sqlite数据库由一个拆分为两个或多个,每一个sqlite数据库对应软件系统中某一类型的写入操作的需求。对于大部分软件系统而言,拆分为两个sqlite数据库即可,其中一个用于实现用户在软件系统中操作时的数据写入,另一个则用于实现客户端与服务器端进行数据交换时的数据写入。这样做的结果是将原本磁盘上的一个sqlite数据库文件拆分为多个文件,将原本一个文件在同一时间只能由一个线程写入的限制,变更为在同一时间允许由多个线程分别写入不同的文件,从而在根本上解决了sqlite数据库文件写入冲突的问题。
将软件系统中所有的数据表按照不同类型的写入操作分别归类,并放置在不同的sqlite数据库文件中。这样可保证不同类型的写入操作分别对应于不同的sqlite数据库文件,当应用软件中的多个线程在同一时间产生了写入操作时,由于分别写入的是不同的文件,从而规避了一个sqlite数据库文件不能同时由多个线程写入的问题。
本发明的避免sqlite数据库在并发访问时产生文件死锁的方法的有益效果为:
1.从根本上解决了一个sqlite数据库在同一时间点上不能被多个线程同时写入的冲突问题,且这一方法与前文所述的类似[降低服务器端与客户端进行数据交换频率]的方法而言,不存在原理上的漏洞,即:无论客户端sqlite数据库与服务器端的数据交换频率有多高(只要是在磁盘文件的写入速度极限之内),都不会与用户操作软件系统时产生的写入操作发生冲突。
2.相比较前文所述的[对sqlite数据库的写入操作采用缓存机制]的方法而言,本方法在数据写入时并不产生延迟时间,因此也就不存在类似用户数据丢失这样的副作用。
3.相比较前文所述的[对sqlite数据库的写入操作采用缓存机制]的方法而言,本方法的实现相对较为简单(只需要在设计和编码阶段做好不同类型读写操作的分类即可),并不存在实现缓存机制所需要的复杂技术、以及为保证缓存数据安全有效的额外代码。
附图说明
图1为本发明的避免sqlite数据库在并发访问时产生文件死锁的方法的步骤图。
本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。
具体实施方式
应当理解,此处所描述的具体实例仅仅用以解释本发明,并不用于限定本发明。
参照图1,阐述本发明的避免sqlite数据库在并发访问时产生文件死锁的方法,其步骤如下:
S1:在软件设计阶段,将软件中对sqlite数据库的不同需求类型的读操作和写操作,分别进行归类,并依据不同的读、写操作类型,设计对应的多个sqlite数据库;
S2:在软件设计阶段,将软件系统中使用到的所有数据表,依据不同的读写操作类型,分别进行归类,并放置在S1中对应的多个sqlite数据库中;
S3:在软件的编码实现阶段,增设一个对sqlite数据库进行统一操作的逻辑模块,通过该模块将软件中对sqlite的所有读写操作,自动定向到S1中对应的多个sqlite数据库文件中,最终将多个不同的物理sqlite数据库在逻辑层面上统一为一个sqlite数据库。
在软件设计阶段,将客户端sqlite数据库由一个拆分为两个或多个,每一个sqlite数据库对应软件系统中某一类型的写入操作的需求。对于大部分软件系统而言,拆分为两个sqlite数据库即可,其中一个用于实现用户在软件系统中操作时的数据写入,另一个则用于实现客户端与服务器端进行数据交换时的数据写入。
这样做的结果是将原本磁盘上的一个sqlite数据库文件拆分为多个文件,将原本一个文件在同一时间只能由一个线程写入的限制,变更为在同一时间允许由多个线程分别写入不同的文件,从而在根本上解决了sqlite数据库文件写入冲突的问题。
将软件系统中所有的数据表按照不同类型的写入操作分别归类,并放置在不同的sqlite数据库文件中。这样可保证不同类型的写入操作分别对应于不同的文件,当应用软件中的多个线程在同一时间产生了写入操作时,由于分别写入的是不同的文件,从而规避了一个sqlite数据库文件不能同时由多个线程写入的问题。
经过在客户环境中的实际验证,在软件系统中采用本方法后,客户端的sqlite数据库与服务器端的数据交换频率可达到1-15秒钟一次(根据用户的数据量不同,以及网络况不同,这一时间可能有所区别),且可以通过将数据交换操作放置在子线程中以实现静默操作的效果,从而不对用户使用软件产生任何影响。对于商业应用软件而言,这一频率已基本等同于客户端的数据与服务器端的数据保持了即时同步,极大的提高了用户的使用体验。
以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。
Claims (1)
1.一种避免sqlite数据库在并发访问时产生文件死锁的方法,其特征在于,所述方法包含下述步骤:
S1:在软件设计阶段,将软件中对sqlite数据库的不同需求类型的读操作和写操作,分别进行归类,并依据不同的读、写操作类型,设计对应的多个sqlite数据库;
S2:在软件设计阶段,将软件系统中使用到的所有数据表,依据不同的读写操作类型,分别进行归类,并放置在S1中对应的多个sqlite数据库中;
S3:在软件的编码实现阶段,增设一个对sqlite数据库进行统一操作的逻辑模块,通过该模块将软件中对sqlite数据库的所有读写操作,自动定向到S1中对应的多个sqlite数据库中,最终将多个不同的物理sqlite数据库在逻辑层面上统一为一个sqlite数据库。
Priority Applications (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611199734.2A CN106598748B (zh) | 2016-12-22 | 2016-12-22 | 避免sqlite数据库并发访问时产生文件死锁的方法 |
PCT/CN2017/076654 WO2018113107A1 (zh) | 2016-12-22 | 2017-03-14 | 一种避免sqlite数据库并发访问时产生文件死锁的方法 |
US16/404,790 US20190258609A1 (en) | 2016-12-22 | 2019-05-07 | Method for avoiding file deadlock during concurrent access of a sqlite database |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611199734.2A CN106598748B (zh) | 2016-12-22 | 2016-12-22 | 避免sqlite数据库并发访问时产生文件死锁的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN106598748A CN106598748A (zh) | 2017-04-26 |
CN106598748B true CN106598748B (zh) | 2019-11-08 |
Family
ID=58600936
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201611199734.2A Active CN106598748B (zh) | 2016-12-22 | 2016-12-22 | 避免sqlite数据库并发访问时产生文件死锁的方法 |
Country Status (3)
Country | Link |
---|---|
US (1) | US20190258609A1 (zh) |
CN (1) | CN106598748B (zh) |
WO (1) | WO2018113107A1 (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107066588B (zh) * | 2017-04-17 | 2021-04-20 | 星环信息科技(上海)股份有限公司 | 一种数据库及相应的方法与设备 |
CN109033359A (zh) * | 2018-07-26 | 2018-12-18 | 北京天地和兴科技有限公司 | 一种多进程安全访问sqlite的方法 |
CN111159156B (zh) * | 2019-12-31 | 2023-04-28 | 杭州迪普科技股份有限公司 | SQLite数据库的备份方法和装置 |
Family Cites Families (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN202443466U (zh) * | 2012-02-15 | 2012-09-19 | 南京上科机电工业有限公司 | 一种多用户sqlite数据库管理系统 |
CN102945195B (zh) * | 2012-11-26 | 2015-11-18 | 国电南瑞科技股份有限公司 | 一种基于SQLite数据库的主备冗余复制方法 |
CN104484456A (zh) * | 2014-12-29 | 2015-04-01 | 哈尔滨工业大学 | 一种基于多线程并行的SQLite数据库快速加载方法 |
CN104866577A (zh) * | 2015-05-26 | 2015-08-26 | 深圳市六度人和科技有限公司 | 一种基于嵌入式数据库的数据处理方法及装置 |
-
2016
- 2016-12-22 CN CN201611199734.2A patent/CN106598748B/zh active Active
-
2017
- 2017-03-14 WO PCT/CN2017/076654 patent/WO2018113107A1/zh active Application Filing
-
2019
- 2019-05-07 US US16/404,790 patent/US20190258609A1/en not_active Abandoned
Also Published As
Publication number | Publication date |
---|---|
CN106598748A (zh) | 2017-04-26 |
US20190258609A1 (en) | 2019-08-22 |
WO2018113107A1 (zh) | 2018-06-28 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Breitbart et al. | Overview of multidatabase transaction management | |
Levandoski et al. | Deuteronomy: Transaction support for cloud data | |
US9367363B2 (en) | System and method for integrating best effort hardware mechanisms for supporting transactional memory | |
CN106598748B (zh) | 避免sqlite数据库并发访问时产生文件死锁的方法 | |
US20070233970A1 (en) | Array comparison and swap operations | |
US7444267B2 (en) | System and method to synchronize and coordinate parallel, automated fault injection processes against storage area network arrays | |
CN101046821A (zh) | 通用数据库操纵器 | |
US11314719B2 (en) | Method for implementing change data capture in database management system | |
CN109947742B (zh) | 面向二阶段锁的多版本数据库并发控制方法和系统 | |
CN101556597B (zh) | 一种自适应乐观并发控制方法 | |
EP3822807A1 (en) | Techniques for application undo and redo using sql patchsets or changesets | |
CN110955672B (zh) | 面向乐观并发控制的多版本支持方法及系统 | |
US20090132534A1 (en) | Remote replication synchronizing/accessing system and method thereof | |
Dey et al. | Scalable distributed transactions across heterogeneous stores | |
Luiz et al. | Mitra: Byzantine fault-tolerant middleware for transaction processing on replicated databases | |
US8214560B2 (en) | Communications support in a transactional memory | |
US11392576B2 (en) | Distributed pessimistic lock based on HBase storage and the implementation method thereof | |
CN112612647A (zh) | 日志并行重演方法、装置、设备及存储介质 | |
Huang et al. | Fine-grained analysis on fast implementations of distributed multi-writer atomic registers | |
CN109635038A (zh) | 一种结构化数据异地双读写方法 | |
CN114398453A (zh) | 一种基于Redis缓存技术的数据存取方法 | |
Ouzzani et al. | Correctness Criteria Beyond Serializability. | |
Alomari | Ensuring serializable executions with snapshot isolation dbms | |
Ko et al. | Ultraverse: Efficient Retroactive Operation for Attack Recovery in Database Systems and Web Frameworks | |
Singla et al. | Concurrency Control in Distributed Database System |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |