好的,所以我有一段代码被多次调用。然而,在一些测试中,我注意到我的 ResultSet 根据数据库返回错误。经过进一步调查,我注意到它以某种方式被重复使用。值得一提的是,当我重新启动程序时,它会获取正确的结果。SQL 总是相同的。
我的代码:
PreparedStatement ps = connection.prepareStatement(sql);
ps.setInt(1, packet.getUserId());
ResultSet dbResult = ps.executeQuery();
while(dbResult.next())
{
System.out.println("There were items!" );
Item item = new Item();
item.setItemType(dbResult.getInt(1));
item.setFromUser(dbResult.getString(2));
item.setItemMessage(dbResult.getString(3));
toReturn.add(item);
}
这是我的测试顺序:
- 一次从 ResultSet 中获取行并获得正确的结果 - OK
- 从表中删除上面特定 sql 使用的所有行,这意味着 ResultSet 下次不应该返回任何内容。
- 再次尝试获取(现在它应该返回 0 行)但它返回与步骤 1 中完全相同的行,即使数据库表是空的。
ResultSet 应该在使用后关闭还是关闭,或者我错过了什么?即使数据库中没有任何内容,我也会从 ResultSet 中获得结果。我可以保证 SQL 是合法的,但 ResultSet 似乎不是在第二次调用时从它创建的。
编辑(连接初始化代码)
public class DBFactory
{
protected String databaseName = null;
protected String username = null;
protected String password = null;
protected Connection connection = null;
protected Statement statement = null;
protected DBFactory( String databaseName, String username, String password)
{
this.databaseName = databaseName;
this.username = username;
this.password = password;
}
protected void initConnection()
{
if (databaseName == null || username == null || password == null)
throw new IllegalStateException();
try
{
Class.forName("com.mysql.jdbc.Driver").newInstance();
this.connection = DriverManager.getConnection(this.databaseName, this.username, this.password);
this.statement = this.connection.createStatement();
}
catch (Exception e)
{
System.out.println("DBFactory " + e.getMessage());
}
}