加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

关闭SQLite3中的journal暂存档

发布时间:2020-12-12 19:35:34 所属栏目:百科 来源:网络整理
导读:最近经常碰到类似的sqlite文件损坏的问题,由于使用的是非WAL模式,而且是 PRAGMA journal_mode = DELETE。对于这种临时的备份文件如何影响的,这里摘一篇作为资料收集。 摘自:http://www.it165.net/database/html/201310/4691.html 相信很多使用SQLite3当

最近经常碰到类似的sqlite文件损坏的问题,由于使用的是非WAL模式,而且是PRAGMA journal_mode = DELETE。对于这种临时的备份文件如何影响的,这里摘一篇作为资料收集。


摘自:http://www.it165.net/database/html/201310/4691.html

相信很多使用SQLite3当做数据库的人都会一个现象,那就是当SQLite3有做写入的动作时,SQLite3会自动产生一个名为"数据库名称-journal"的暂存档。这是做什么用的呢?


答案是用来Rollback ,换句话说,就是当数据写入数据库有失败动作时,透过journal档案予以复原到未更动前(原始)数据,来确保数据完整与一致性。如果在每次写入的时间很长或频繁的进行数据库写入情况下,因系统(主机)电力不稳或突然断电时,那么下次重新启动,而journal档案若存在,则在开启SQLite数据库时,若发现有journal档案的存在,便会对数据库做Rollback 动作(还原)(详细内容:http://www.sqlite.org/atomiccommit.html)。但是有时候系统(主机)电力不稳或突然断电会导致journal档案损毁,因而造成SQLite数据库无法开启[问题1]。必须(手动)删除journal档案,SQLite数据库才能再度开启。


目前所知的方法有两种:

第一种方法:
在系统开机后第一次开启或每一次使用SQLite数据库时,先检查是否已经存在journal档案了,如果是则透过程序自动去删除该journal档案。
但是这有个问题,因为自动删除该journal档案,导致没有Rollback (还原)作用,无法保障数据完整与一致性。缺点二:有时候会发生程序无法自动删除(如:journal档案严重损毁),而导致上面的问题(无法开启数据库)[问题1]再度发生。

第二种方法:
使用"PRAGMA journal_mode = OFF"指令,这个指令能关闭自动产生journal暂存档动作。
但是如此一来当在写入数据库的过程,一旦发生意外状况,将会导致SQLite数据库无法保障数据完整与一致性。缺点二:journal_mode设定为OFF时,无法使用交易模式(Transaction)进行操作。

第二种方法的缺点二在如果需要使用交易模式(Transaction)进行操作时,可以透过"PRAGMA journal_mode = DELETE"指令,修改回原本的journal模式(journal_mode),就可以使用交易模式(Transaction)。

view source print ? 01. //请先引用 using System.Data.SQLite; 02. 03. conststringpath = @"C:testDB.db3"; 04. if(File.Exists(path))//判断档案是否存在。是 05. { 06. File.Delete(path); 07. } 08. 09. SQLiteConnection.CreateFile(path);//建立SQLite数据库档案 10. 11. using(SQLiteConnection conn =newSQLiteConnection("Data Source="+ path +";Version=3;"))//建立联机 12. { 13. 14. (SQLiteCommand comm = conn.CreateCommand()) 15. 16. conn.Open();//开启数据库 17. 18. comm.CommandText ="PRAGMA journal_mode=Off;";//journal mode 设定为 OFF(关闭journal模式) 19. comm.ExecuteNonQuery(); 20. //---下面便只能以journal_mode=Off方式,进行操作----- 21. 22. //---做一些操作------------------------------------- 23. "CREATE TABLE text_table(id int,value text);"//建立'text_table'数据表 24. comm.ExecuteNonQuery(); 25. 26. for(inti = 0; i < 10; ++i) 27. 28. //新增一笔(列)数据到数据表 29. "Insert INTO text_table (id,value) VALUES (0,'Hello World')"30. 31. 32. //--------------------------------------------------- 33. 34. }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读