Java 结果集被重用
好的,我有一段代码,叫做多次。然而,在一些测试中,我注意到我的结果集根据数据库返回错误。经过进一步的调查,我注意到它以某种方式被重复使用。值得一提的是,当我重新启动程序时,它会得到正确的结果。SQL总是一样的 我的代码:Java 结果集被重用,java,mysql,jdbc,resultset,Java,Mysql,Jdbc,Resultset,好的,我有一段代码,叫做多次。然而,在一些测试中,我注意到我的结果集根据数据库返回错误。经过进一步的调查,我注意到它以某种方式被重复使用。值得一提的是,当我重新启动程序时,它会得到正确的结果。SQL总是一样的 我的代码: PreparedStatement ps = connection.prepareStatement(sql); ps.setInt(1, packet.getUserId()); ResultSet dbResult = ps.executeQuery(); while(d
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获取一次行并获得正确的结果-确定
- 删除上面特定sql使用的表中的所有行,这意味着ResultSet下次不应返回任何内容
- 再次尝试获取(现在它应该返回0行),但它返回的行与步骤1中的行完全相同,即使数据库表为空
我希望您已关闭连接的自动提交 据我所知,这个小代码示例将演示您的问题
package org.yi.happy.mysql;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class RepeatQuery {
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver").newInstance();
setupDatabase();
System.out.println("opening database...");
Connection connection = openConnection();
connection.setAutoCommit(false);
queryDatabase(connection);
deleteRecords();
queryDatabase(connection);
connection.close();
}
private static Connection openConnection() throws SQLException {
return DriverManager.getConnection("jdbc:mysql://localhost/test", null,
null);
}
private static void setupDatabase() throws SQLException {
Connection conn = openConnection();
System.out.println("doing insert on another connection...");
PreparedStatement stmt = conn
.prepareStatement("insert into strings(id, value) values(?, ?)");
stmt.setInt(1, 1);
stmt.setString(2, "test");
stmt.execute();
stmt.setInt(1, 2);
stmt.setString(2, "data");
stmt.execute();
stmt.close();
conn.close();
}
private static void deleteRecords() throws SQLException {
Connection conn = openConnection();
System.out.println("doing delete on another connection...");
PreparedStatement stmt = conn.prepareStatement("delete from strings");
stmt.execute();
stmt.close();
conn.close();
}
private static void queryDatabase(Connection connection)
throws SQLException {
System.out.println("doing query...");
PreparedStatement ps = connection
.prepareStatement("select id, value from strings");
ResultSet dbResult = ps.executeQuery();
while (dbResult.next()) {
int id = dbResult.getInt(1);
String value = dbResult.getString(2);
System.out.println(id + " <=> " + value);
}
}
}
阅读
connection.setAutoCommit(true);
输出变为
doing insert on another connection...
opening database...
doing query...
2 <=> data
1 <=> test
doing delete on another connection...
doing query...
正在另一个连接上执行插入操作。。。
正在打开数据库。。。
正在执行查询。。。
2数据
1试验
正在另一个连接上执行删除。。。
正在执行查询。。。
这就是您所期望的。您可能处于事务中,如果提交或回滚当前事务,您将看到数据库的当前状态 试试看 或
在查询之前,或启用自动提交。您省略了代码中的重要部分,显示了如何删除行并重新发出查询,以及连接上的选项(可重复读取等)。没有这些细节,我们只是猜测。我不会从代码中删除它们,我会在程序外部手动删除。发布创建连接的代码。但是,您的代码是否会在执行外部更改后终止并重新启动,还是会继续运行并重新发出查询?此代码位于服务器端,这意味着每次客户端调用此信息时,都会运行此代码(顶部的函数)
connection.setAutoCommit(false);
connection.setAutoCommit(true);
doing insert on another connection...
opening database...
doing query...
2 <=> data
1 <=> test
doing delete on another connection...
doing query...
connection.rollback();
connection.commit();