5

ローカル ファイル システムの 3 つの異なるファイルで 3 つの SQLite データベースを使用するシングル スレッド アプリケーションがあります。

DbAdapterSQLite データベース ファイルへの接続を開くヘルパー クラスを作成しました。このクラスにはopen、接続を作成するcloseメソッドと、すべてを解放するメソッドがあります。

3 つのデータベースは、派生するクラスからアクセスされますDbAdapter

私のプログラムでは、すべてのデータベース アクセスは次のようになります。

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

stdoutと へのすべての呼び出しをDbAdapter.openログに記録しましたDbAdapter.close。がいるたびにopen()close()近くをフォローします。
また、すべての を閉じるように注意しますStatement(これにより、関連ResultSetする も閉じられます)。

したがって、データベースへのアクセスはできるだけ短くしようとしているので、クリーンであると思います。必要がなくなったらすぐにすべてのリソースを解放します。

それでも、私はまだ取得していjava.sql.SQLException: database is lockedます。

私が正しくやっていないことはありますか?コードを表示していないことはわかっていますが、大量のコードを投稿する必要があり、関連性がありません。ここでベストプラクティスを使用しているかどうかを尋ねているだけです。そうしていると思いますが、まだ例外が発生しているためです。

これは、Mac OS 10.6 x64 上の Java 1.6、Xerial.org の sqlite-jdbc-3.7.2 ドライバーを使用したものです。

4

3 に答える 3

2

強制終了できない奇妙な Java プロセスがあることに気付きました。私は走った:

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

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

再起動しましたが、問題は発生しなくなりました。クラッシュせずに多くの DB 呼び出しを行うことができたので、これは意味がありません。例外の原因となった呼び出しは 1 つだけでした。何が起こったのかまったくわかりませんが、この問題はもうありません。

本当答えは大歓迎です。

于 2012-06-21T09:45:15.087 に答える
1

私の場合、SQLite Database Browser でデータベースを開いているときに、Java からデータベースを更新しようとしたことが問題の原因でした (データベースのロックを保持しているようです)。

于 2013-09-13T09:02:47.053 に答える
-1

トピックからの引用java.sql.SQLException:データベースがロックされています

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

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

詳細な説明はhttp://www.sqlite.org/lockingv3.htmlにあります。

これがあなたの問題だと思います

于 2012-06-21T09:11:34.690 に答える