前几天在CSDN上看到有人使用sqlite+tomcat实现一个web应用,并发操做引发数据库锁定,在发帖求助。这才想起本身之前作的一个web应用也有相同问题,顺便把本身解决方法写下来,供你们参考。web
当时个人应用是给单位作一个月度工做计划的上报并生成WORD文件供排版、打印。考虑到数据量不大,没有现成数据库系统可用,而且当时本身已经为sqlite写了一个很好的辅助系统(当时叫SqliteHelper,就是如今xqk.data数据框架的原始版本,呵呵),就决定用sqlite数据库+asp.net来实现。sql
应用实现起来很简单,可是在上线试运行时,发现常常出项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页面的生存期,可是操做系统也许对文件的创建、删除没有理论上那么快,形成并发的时候常常出现文件被锁定没法打开的问题。数据库