2012-06-21 11 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

古いアプリケーションプロセスがまだ実行されている可能性がありますか?これはまだ再起動後に来るのですか?なぜなら、私が知っている限り、1つのスレッドではなく埋め込みDBごとに1つのプロセスだからです。 – Thihara

+0

[java.sql.SQLException:database locked]の可能な複製(http://stackoverflow.com/questions/2578623/java-sql- –

+0

@灰原:すべてのJavaプロセスを 'kill -9'しました。まだ –

答えて

2

だと思いhttp://www.sqlite.org/lockingv3.html

の詳細な説明を見つけることができます私は私が殺すことができませんでした奇妙なJavaプロセスを持っていたことに気づきました。私は走った:

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

しかし、それらのプロセスは(同じPIDで)まだここにあった。

私は再起動し、問題はもう表示されません。これは理にかなっていません。なぜなら、クラッシュせずにたくさんのDB呼び出しを行うことができたからです。私は何が起こったのか全然理解していないが、私はもはやこの問題を抱えていない。

任意回答歓迎。

+1

あなたに伝えました:-私はいくつかの古い実行から残っているいくつかの不正なプロセスがあったと思います。これは数回も私に起こった。しかし、それは私がメインのJFrameにEXIT_ON_CLOSEアプリを設定することを忘れてしまったGUIアプリケーションにありました。その理由は私はLinuxの教祖ではない。あなたがSuperUserでより良い運を持つことができるかもしれません。 – Thihara

+0

あなたは正しいと思った。私は、実行可能ファイルが '/ java/executable/-arg1-arg2 ...'ではなく '/ java/java /'のみであったので、私のアプリケーションに影響しているとは思わなかった。それはMac OSだが、Linuxではない! Unix;) –

0

「の話題java.sql.SQLException: database locked

から引用SQLiteデータベースを読み、共有へのロック状態を設定し、 。複数のリーダーを同時にアクティブにすることができます。

SQLiteデータベースに書き込むと、ロック状態が「排他」に設定されます。その時点で他のプロセスをアクティブにすることはできません。

あなたは、私はこれがあなたの問題

+1

これはどうすれば私の問題になりますか?実際、DBへの接続は私がもう必要でなくなるとすぐに閉じられ、私のアプリケーションがシングルスレッドなので同時アクセスはできません。 –

0

私のケースでは、SQLite Database Browser(データベースのロックを保持しているようです)で開いている間に、Javaからデータベースを更新しようとしたために問題が発生しました。

関連する問題