解决网站使用sqlite时并发问题的一个经验

前几天在CSDN上看到有人使用sqlite+tomcat实现一个web应用,并发操作引起数据库锁定,在发帖求助。这才想起自己以前做的一个web应用也有相同问题,顺便把自己解决方法写下来,供大家参考。

当时我的应用是给单位做一个月度工作计划的上报并生成WORD文件供排版、打印。考虑到数据量不大,没有现成数据库系统可用,并且当时自己已经为sqlite写了一个很好的辅助系统(当时叫SqliteHelper,就是现在xqk.data数据框架的原始版本,呵呵),就决定用sqlite数据库+asp.net来实现。

应用实现起来很简单,但是在上线试运行时,发现经常出项sqlite被锁定,不能读写的错误。也就是CSDN网友提到的并发问题。经过检查,发现问题出DbConnecting上。
在这个应用中,我是在每个aspx页面的Page_Load里打开sqlite数据库,等相关操作完成后再关闭。大概的代码是:
void Page_Load(Object sender,EventArgs e)
{
    DbConnector db = SqliteHelper.Connector(Application["dbfile"]);
    Plans[] plans = db.SelectAll();
    ......
}
这个问题解决的过程记得不是很清楚了,但是最终的解决方法是:
先在Application_Start的时候把数据库打开
void Application_Start(Object sender,EventArgs e)
{
    DbConnector db = SqliteHelper.Connector(Application["dbfile"]);
    Application["db"] = db;
}
然后在Page_load里直接使用这个db:
void Page_Load(Object sender,EventArgs e)
{
    DbConnector db =(DbConnector)Application["db"]);
    Plans[] plans = db.SelectAll();
    ......
}
哈哈,就这样解决的。我分析了一下,可能是由于Sqlite使用文件锁的原因。在一个sqlite数据库文件在打开的时候,会在磁盘上建立一个.db-journal文件,表示数据库文件已被打开,其它进程就不能在打开该文件了,必须等到.db-journal文件删除后,才能打开。理论上讲,.db-journal的生存期也就是一个aspx页面的生存期,但是操作系统也许对文件的建立、删除没有理论上那么快,造成并发的时候经常出现文件被锁定无法打开的问题。


 

你可能感兴趣的:(解决网站使用sqlite时并发问题的一个经验)