解决网站使用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页面的生存期,但是操作系统也许对文件的建立、删除没有理论上那么快,造成并发的时候经常出现文件被锁定无法打开的问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值