データベースへのアクセスを提供する単純な Java ライブラリを開発しています。現在、SQLite へのアクセスに取り組んでいます。インスタンスメソッドのみを実装する SQlite.java という名前のクラスがあります。以下は、いくつかのメソッドの実装です。
public ResultSet retrieve(String query) {
try {
if (this.connection != null) {
this.statement = this.connection.createStatement();
return this.statement.executeQuery(query);
}
} catch (Exception e) {
System.err.println("[ERROR] " + e.getMessage());
}
return null;
}
public ResultSet listTables() {
try {
return this.retrieve("SELECT name FROM sqlite_master WHERE type='table' ORDER BY name");
} catch (Exception e) {
System.err.println("[ERROR] " + e.getMessage());
}
return null;
}
public boolean hasTable(String tableName) {
try {
ResultSet rs = this.listTables();
while (rs.next()) {
if (rs.getString(1).equals(tableName)) {
return true;
}
}
} catch (Exception e) {
System.err.println("[ERROR] " + e.getMessage());
}
return false;
}
public void update(String query) {
try {
if (this.connection != null) {
this.statement = this.connection.createStatement();
this.statement.executeUpdate(query);
}
} catch (Exception e) {
System.err.println("[ERROR] " + e.getMessage());
}
}
public void dropTable(String tableName) {
try {
if (this.hasTable(tableName)) {
this.update("DROP TABLE " + tableName); // TEST!
} else {
System.err.println("[ERROR] Table '" + tableName + "' not found!");
}
} catch (Exception e) {
System.err.println("[ERROR] " + e.getMessage());
}
}
dropTable() メソッドをテストすると、「データベース テーブルがロックされています」という例外が発生します。これは、 hasTable() メソッドで呼び出される可能性のあるクローズされていない SELECT ステートメントが原因であると推測しています。私の知る限り、検索クエリが実行されてもデータベース テーブルはロックされているため、他のユーザーがデータを選択しようとしている間はテーブルを更新できません。しかし、これを解決する方法はわかりませんでした。何か案は?