2015-10-28 187 views
0

我在一個CPU上並行運行兩個python文件,這兩個文件都使用相同的sqlite3數據庫。我正在使用sqlalchemy處理sqlite3數據庫,我的理解是sqlalchemy處理一個應用程序中的所有線程數據庫問題。我的問題是如何處理來自兩個不同應用程序的訪問? 我的兩個程序之一是燒瓶應用程序,另一個是不時更新數據庫的cronjob。 似乎即使在sqlite數據庫的只讀任務鎖定數據庫,這意味着如果兩個應用程序想同時讀取或寫入,我會得到一個錯誤。sqlite3:避免「數據庫鎖定」衝突

OperationalError: (sqlite3.OperationalError) database is locked 

讓我們假設我的cronjob應用程序每5分鐘運行一次。我怎樣才能確保我的兩個應用程序之間沒有衝突?我可以在訪問數據庫之前將一些讀取標誌寫入一個文件中,但在我看來應該有一個標準的方法來執行此操作? 而且我正在我的gunicorn應用程序,並在原則上也可以運行多個工作,所以,我最終還是要爲我燒瓶應用 感謝 超過2個並行作業......卡爾

+1

你可以使用一個鎖文件,但您的問題將有經常訪問數據庫的線程數量的增加。我建議使用數據庫服務器(MySQL,PostgresQL ...)而不是SQlite。 –

+0

是的SQLite並不是真正爲這個用例設計的。 @KlausD。是正確的,你需要更換它。 –

+0

我使用Flask + sqlite和一個也沒有問題地與db交談的任務隊列。 SQLite可以從多個線程/進程中使用。 – coleifer

回答

-1

這是真的。 Sqlite不是爲這種應用程序構建的。 Sqlite真的是用於輕量級單線程,單實例應用程序。

每個實例都有一個Sqlite連接,如果您開始進入某種線程化多路複用器(請參閱https://www.sqlite.org/threadsafe.html),這將是可能的,但它比它的價值更麻煩。還有其他的解決方案可以提供這個功能 - 看看Postgresql或MySQL。這些數據庫是開源的,有充分的文檔記錄,得到很好的支持,並且支持您需要的併發性。

+1

這是不正確的。 http://charlesleifer.com/blog/sqlite-small-fast-reliable-choose-any-three-/ – coleifer

0

我不確定SQLAlchemy如何處理連接,但如果您使用的是Peewee ORM,那麼解決方案非常簡單。

當您的Flask應用程序啓動請求時,您將打開到數據庫的連接。然後當Flask發送響應時,關閉數據庫。

同樣,在您的cron腳本中,當您開始使用數據庫時打開一個連接,然後在該過程完成時關閉它。

您可能會考慮的另一件事是在WAL模式下使用SQLite。這可以提高併發性。您在打開連接時使用PRAGMA查詢來設置日誌模式。

欲瞭解更多信息,請參閱http://charlesleifer.com/blog/sqlite-small-fast-reliable-choose-any-three-/