解决网站使用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官网上的文章File Locking And Concurrency In SQLite Version 3后,发现原有分析有错,特此删除。谢谢沉默杨仔。