わかりましたので、何度か呼び出されるコードがあります。ただし、いくつかのテスト中に、データベースに従って 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 が正当であることは保証できますが、2 回目に呼び出されたときに ResultSet がそこから作成されているようには見えません。
EDIT (接続初期化コード)
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());
}
}