2012-06-21 92 views
5

我有一個單線程應用程序,它在本地文件系統上的3個不同文件中使用3個SQLite數據庫。爲什麼我會得到SQLException:數據庫被鎖定在我的JDBC SQLite數據庫上?

我創建了一個DbAdapter幫助程序類,它打開與SQLite數據庫文件的連接。在這個類中,我有一個創建連接的方法open,和一個釋放所有內容的方法close

這3個數據庫是從派生出DbAdapter的類訪問的。

在我的程序中的每個數據庫的訪問是這樣的:

MyDbAdapter DB = new MyDBAdapter(); 
int stuff = DB.getStuff(); // queries the database 
DB.close(); 
// now do something with `stuff` 

我已經登錄到stdout到​​和DbAdapter.close所有通話。每當有一個open(),一個close()緊隨其後。
我也小心關閉我所有的Statement(這將導致關聯的ResultSet也被關閉)。

所以我想我的數據庫訪問是乾淨的,因爲我試圖讓他們儘可能短,並且我在不再需要它們時立即釋放所有資源。

然而,我仍然得到java.sql.SQLException: database is locked

有沒有什麼我不正確的做法?我知道我沒有顯示任何代碼,但是我不得不發佈很多代碼,它不會相關。我只是問我是否在這裏使用最佳實踐,因爲我認爲我這樣做,而且我仍然遇到例外情況。

這是與Java 1.6,Xerial.org的sqlite的-JDBC-3.7.2驅動程序,在Mac OS 10.6的x64

+0

可能是舊的應用程序正在運行嗎?重新啓動後這仍然會出現嗎?因爲據我所知這是每個嵌入式數據庫的一個進程不是一個線程.... – Thihara

+0

可能重複[java.sql.SQLException:數據庫鎖定](http://stackoverflow.com/questions/2578623/java-sql- sqlexception-database-locked) –

+0

@Thihara:我已經'kill'了所有的java進程,仍然 –

回答

2

我注意到,我有奇怪的Java進程,我不能殺了。我跑了:

ps aux | grep java | grep -v grep | awk '{print$2}' | xargs sudo kill -9 

但這些進程仍然在這裏(具有相同的PID)。

我重新啓動,問題不再出現。這沒有意義,因爲我能夠在沒有任何崩潰的情況下進行大量的數據庫調用,只有一個調用導致異常。我不明白髮生了什麼,但我不再有這個問題。

任何回答歡迎。

+1

告訴你:-P我認爲有一些舊的流程遺留下來的一些流氓流程。這在我身上也發生過幾次。但是,在那些忘記將EXIT_ON_CLOSE應用程序設置爲主JFrame的GUI應用程序中。至於我不是Linux大師的原因。可能是你在SuperUser會有更好的運氣。 – Thihara

+0

是的,你是對的。我不認爲它們影響我的應用程序,因爲可執行文件只是'(java)'而不是'/ path/to/java/executable -arg1 -arg2 ...'。這就是Mac OS,但不是Linux! Unix;) –

0

從話題java.sql.SQLException: database locked

引用「讀SQLite數據庫設置鎖定狀態共享。多個閱讀器可以同時處於活動狀態。

寫入SQLite數據庫會將鎖定狀態設置爲Exclusive。當時沒有其他進程可以處於活動狀態。

你可以找到http://www.sqlite.org/lockingv3.html詳細的解釋「

我覺得這是你的問題

+1

這怎麼可能是我的問題?事實上,一旦我不再需要它,連接到數據庫就會關閉,並且因爲我的應用程序是單線程的,所以無法進行併發訪問。 –

0

在我的情況下,這個問題是由於嘗試從Java更新數據庫,同時讓它在SQLite數據庫瀏覽器中打開(它似乎對數據庫持有一個鎖)。