解決網站使用sqlite時併發問題的一個經驗

前幾天在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頁面的生存期,可是操做系統也許對文件的創建、刪除沒有理論上那麼快,形成併發的時候常常出現文件被鎖定沒法打開的問題。數據庫

相關文章
相關標籤/搜索