关于SQLite Database is Locked 的一点处理技巧
好吧说主题,由于SQLite 过于简单,所以它的并发性确实让人抓狂,今天就碰到了,并且无所适从,因为刚开始觉得,我要操作同一数据库中的多个表,并且在不同的地方,所以感觉见多个数据库链接很正常,所以就做了,然后就是Database is Locked。(发现这个问题实在VS下调试时报的)。并且我一边用数据库管理工具操作,一边在写C#代码处理数据库,也包同样的错误,所以……
也就是这样:
//同时有两个数据库链接,此时分别对同一个数据库操作时就会出现这个问题 SQLiteConnection conn1; SQLiteConnection conn2;
最后想到了一种方法,将数据库链接变量设为:static。
想法来自 设计模式,这是一门睡得天晕地暗的课,20多种设计模式吧(不知道这个数据记得对不对),就会这一个,单件,单件是什么,自己读娘或者看《大话设计模式》这本书吧。
具体就是,将数据库链接变量(以后都用conn)设为static即可。
C#代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data.SQLite;//应如的数据库驱动,去官网下,
//注意.net,vs,SQLite,windows位数这些东西,当时搞死我了 namespace ConsoleApplication1 { class SQLite {
string connectString; static SQLiteConnection conn; static bool isopen=false;//同样是Static,标记数据库是否已经打开 public SQLite() { if (!isopen) { connectString = @"Data Source=E:\inf.db;Pooling=true;FailIfMissing=false"; conn = new SQLiteConnection(connectString); conn.Open(); isopen = true; } } public SQLiteConnection getConn()//通过这个函数得到数据库链接变量 { return conn; }
}
}
//此时这让做如下操作,就没有任何问题了
SQLite sql=new SQLite();
SQLiteConnection conn1=sql.getConn();
SQLiteConnection conn2=sql.getConn();