1、多进程操作数据库被锁的解决方案
SQLite对于整个数据库文件进行读取/写入锁定。这意味着如果任何进程读取了数据库中的某一部分, 其他所有进程都不能再对该数据库的任何部分进行写入操作。同样的, 如果任何一个进程在对数据库进行写入操作, 其他所有进程都不能再读取该数据库的任何部分。 对于大多数情况这不算是什么问题。在这些情况下每个程序使用数据库的时间都很短暂, 并且不会独占, 这样锁定至多会存在十几毫秒。但考虑到项目应用会有多个进程同时操作数据库,所以为了防止因数据库被锁造成读写数据失败的情况,需做以下几点。
1、 所有对数据库读写操作都要设置等待超时时间,这是解决数据库被锁问题最好的解决方案。
2、 尽可能的减少每次对数据库操作的时间。
1、 对于插入数据操作,如果一次需插入10条以上的记录,需使用事务的方式。
2、 对于读取数据操作,需对关键字段建立索引以加快查询速度。如果请求数据量较多,需分步读取数据(每次读取不超过96条记录),以减少每次读取数据的时间以及存储数据的内存。
2、数据完整性
SQLite保证任何对数据的修改都是原子的,既要么数据修改成功,要么数据恢复到末修改时的状态。其原理是对数据库进行修改时会对数据库上锁,此时其它进程只能查询数据而不能修改,且在修改数据库文件之前,SQLite会生成一个单独的回滚日志文件,并在其中写进将会被修改的页的原始数据。如果修改失败(可能是突然断电或系统崩溃造成的),数据库的恢复进程会在下次启动数据库时根据日志文件回滚,将数据库文件恢复到原始状态的数据。虽然SQLite的原子提交机制已经被证明是健壮的,但还是需要考虑数据库文件被破坏的情况,最好的办法是通过数据库备份机制。因SQLite数据库实际是一个文件,只需使用cp 命令就能完成数据库的备份,所以数据库备份既简单又快。