2010-04-08 21 views
6

我敢肯定我錯過了一些非常明顯的事情,但我不能爲我的生活停止我的pysqlite腳本崩潰與數據庫鎖定錯誤。我有兩個腳本,一個用於將數據加載到數據庫中,另一個用於讀取數據,但這兩個腳本都會經常發生,並且會立即崩潰,這取決於其他人在任何給定時間對數據庫所做的操作。我有兩個腳本超時設置爲30秒:Python/SQLite - 數據庫鎖定,儘管大型超時

cx = sqlite.connect("database.sql", timeout=30.0) 

而且覺得我能看到,我得到超時的一些證據似乎是一個時間戳記(例如0.12343827e-06 0.1 - 以及如何停止打印?)偶爾在我的Curses格式化輸出屏幕中間傾倒,但沒有任何延遲在30秒暫停附近變得遙遠,但仍然有另一個因此而一次又一次地崩潰。我在64位4 CPU HS21 IBM刀片服務器上運行了RHEL 5.4,並且聽說過關於多線程問題的一些提及,我不確定這可能是否相關。正在使用的軟件包是sqlite-3.3.6-5和python-sqlite-1.1.7-1.2.1,升級到Red Hat官方規定之外的新版本對我來說不是一個好選擇。由於環境的原因,可能但不可取。

我以前在這兩個腳本中都使用過autocommit=1,但此後都禁用了這兩個腳本,而現在我使用插入腳本cx.commit()而不是在選擇腳本上提交。最終,因爲我只有一個腳本實際上做了任何修改,所以我不明白爲什麼會發生這種鎖定。我注意到,隨着時間的推移,數據庫變得越來越大,這種情況會更加嚴重。它最近在13 MB和3個相同大小的表中,這是大約1天的數據。創建一個新文件已經顯着改善了這一點,這似乎是可以理解的,但超時最終似乎並沒有被遵守。

任何指針非常讚賞。

編輯:因爲要求我已經能夠輕微地重構我的代碼,並使用信號週期性地每5秒在一個事務中寫入0到150次更新。這大大減少了鎖定發生的時間,不到一個小時,而不是每分鐘一次左右。我想我可以進一步確保我寫數據的時間在我讀取其他腳本中的數據時偏移了幾秒鐘,但基本上我正在解決一個問題,因爲我認識到它,使得不需要超時,看起來不錯。助教。

回答

0

SQLite使用數據庫鎖定爲每個寫入(更新/插入/刪除/ ...)。恕我直言,這個鎖持有,直到交易結束。這是跨線程/流程AFAIK持有的單一鎖。

因此,我會嘗試明確地結束編寫腳本的事務和連接,甚至在讀取腳本時嘗試調試併發問題。

+0

您的意思是關閉整個數據庫?我很好地鎖定了一個鎖,但是兩個腳本都沒有等待足夠長的時間來釋放鎖。 – 2010-04-08 09:57:24

+0

是的,我的意思是從正在進行寫入的連接到數據庫的緊密連接。 – Almad 2010-04-08 12:56:59

+1

那麼我每隔幾秒就向數據庫寫信,確實關閉它不會真的改變什麼?在開幕式和閉幕式上還有額外的工作,所以這不會使情況變得更糟?而且,如果我在結束之前提交更改,那麼無論如何都無法關閉它,因爲它不再被鎖定。 – 2010-04-08 20:45:28

0

SQLite沒有針對寫入繁重的工作負載進行優化,也沒有假裝(但它並不介意在一個事務中寫很多內容)。這對我來說聽起來像是你可能已經到了需要切換到MySQL,PostgreSQL,Oracle或DB2等另一個數據庫的地步。其中一些選項確實很昂貴,但對於某些您需要的工作負載而言。 (還要注意,寫繁重的工作往往與一個專用的數據庫服務器的解決方案,更好地做得太儘管上推部署成本和複雜性的事實。有些東西只是成本

+0

我當然寧願使用適當的數據庫,但它只是因爲各種原因不可用。 – 2010-07-06 09:22:46

+0

那麼,準備好一些事情會變得緩慢。它只是無法幫助。 – 2010-07-06 09:58:43

2

在pysqlite的早期版本,timeout參數到sqlite.connect顯然被解釋爲毫秒。所以你的timeout=30.0應該是timeout=30000