【发布时间】:2017-05-17 13:41:17
【问题描述】:
我正在使用 java 程序来查询 SQLite DB。我目前处于开发测试状态,想测试一个特定的选择查询。我有一个线程,我调用它来发出我的所有数据库命令(生产者)和一个消费者线程来处理结果集。 DBCommand 线程(生产者)将打开数据库连接,创建一个新查询,发出它,获取结果集并将其放入共享队列并关闭连接:
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] 05-17-2017 09:27:41 [pool-2-thread-4] DBExtend - 向数据库发出查询:选择不同的时间戳、machineId、ioType、ioId、子字段、来自 TrendPredef1111 的值 WHERE machineId = 1111 AND ioType = 2 AND ioId = "25" AND 时间戳 = 1494943059000000000
[ERROR] 05-17-2017 09:27:41 [pool-2-thread-4] DBExtend - 无法发出数据库命令:java.sql.SQLException:ResultSet 已请求
任何想法我做错了什么?
【问题讨论】:
-
你给
stmt.getResultSet()打了两次电话,这是禁止的。