我使用java程序查询SQLite数据库。我目前处于开发测试状态,并希望测试特定的选择查询。我有一个线程,我调用它来发出我的所有数据库命令(生产者)和一个消费者线程来处理结果集。 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 - 向数据库发出查询:从TrendPredef1111中选择不同的时间戳,machineId,ioType,ioId,子字段,值WHERE machineId = 1111 AND ioType = 2 AND ioId =" 25" AND时间戳< = 1495027659000000000 AND时间戳> = 1494943059000000000
[ERROR] 05-17-2017 09:27:41 [pool-2-thread-4] DBExtend - 无法发出数据库命令:java.sql.SQLException:已请求ResultSet
任何想法我做错了什么?
答案 0 :(得分:3)
您正在发出两个结果集请求。
首先是在创建Resultset对象时。
创建QueryResult对象时的第二个。
通过" rs"而不是对象。