私はSQLite DBを照会するためにJavaプログラムを使用しています。私は現在、開発テストの状態にあり、特定の選択クエリをテストしたいと考えています。私はすべての私のDBコマンド(プロデューサ)と結果セットを処理する消費者スレッドを発行するために呼び出すスレッドがあります。たDbCommandスレッド(プロデューサー)だけの結果セットを取得し、共有キューに入れ、そのような接続を閉じ、それを、DB接続を開く新しいクエリを作成し、発行します:ResultSetが既に要求されています
String url = "jdbc:sqlite:" + Configuration.getInstance().getDbPath();
// create a connection to the database
conn = DriverManager.getConnection(url);
try
{
if (conn.isValid(DB_TIMEOUT))
{
Statement stmt;
try
{
errorLog.info("Query Issued to Database: " + query);
stmt = conn.createStatement();
stmt.execute(query);
ResultSet rs = stmt.getResultSet();
if (rs != null)
{
try
{
TrendApp.resultSetProcQueue.put(new QueryResult(request, stmt.getResultSet()));
} catch (InterruptedException e)
{
errorLog.error("Failed to capture result set from query: " + e);
}
} else
{
try
{
TrendApp.resultSetProcQueue.put(new QueryResult(request, null));
} catch (InterruptedException e)
{
errorLog.error("Failed to capture result set from query: " + e);
}
errorLog.info(stmt.getUpdateCount() + " rows updated.");
}
} catch (SQLException e)
{
errorLog.error("Failed to issue database command: " + e);
}
}
} catch (SQLException e)
{
errorLog.error("Database connection is not valid.");
}
closeDB();
} else
{
errorLog.info("Database query is empty. No action performed.");
}
}
マインドあなたがポイントこのプログラムの目的は、既に存在するより大きなテーブルセットから要素を取り出し、簡単なアクセスのために作成した新しいテーブルにサブセットを追加することです。だから私は新しいテーブルを照会するとき、私はエラー "ResultSetが既に要求"を取得します。コンシューマ側では、現在のところ、まだ結果セットの処理はありません(まだコードは書かれていません)。このエラーはプログラムの再起動時にも発生します。私の新しいテーブルへの最初のクエリ以来、それは働いていません。
[INFO] 2017年5月17日9時27分41秒[プール-2-スレッド-4] DBExtend - データベースに発行したクエリ:TrendPredef1111は異なるタイムスタンプ、machineId、IOTYPE、IOID、サブフィールド、値を選択WHERE machineId = 1111とIOTYPE = 2、IOID = "25" およびタイムスタンプ< = 1495027659000000000とタイムスタンプ> = 1494943059000000000
[ERROR] 2017年5月17日9時27分41秒[プール-2-スレッド-4] DBExtend - データベースコマンドを発行できませんでした:java.sql.SQLException:ResultSetが既に要求されています
私は間違って何をしていますか?
'stmt.getResultSet()'を2回呼び出していますが、これは禁止されています。 – Berger