我敢肯定我錯過了一些非常明顯的事情,但我不能爲我的生活停止我的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次更新。這大大減少了鎖定發生的時間,不到一個小時,而不是每分鐘一次左右。我想我可以進一步確保我寫數據的時間在我讀取其他腳本中的數據時偏移了幾秒鐘,但基本上我正在解決一個問題,因爲我認識到它,使得不需要超時,看起來不錯。助教。
您的意思是關閉整個數據庫?我很好地鎖定了一個鎖,但是兩個腳本都沒有等待足夠長的時間來釋放鎖。 – 2010-04-08 09:57:24
是的,我的意思是從正在進行寫入的連接到數據庫的緊密連接。 – Almad 2010-04-08 12:56:59
那麼我每隔幾秒就向數據庫寫信,確實關閉它不會真的改變什麼?在開幕式和閉幕式上還有額外的工作,所以這不會使情況變得更糟?而且,如果我在結束之前提交更改,那麼無論如何都無法關閉它,因爲它不再被鎖定。 – 2010-04-08 20:45:28