Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 结果集被重用_Java_Mysql_Jdbc_Resultset - Fatal编程技术网

Java 结果集被重用

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

好的,我有一段代码,叫做多次。然而,在一些测试中,我注意到我的结果集根据数据库返回错误。经过进一步的调查,我注意到它以某种方式被重复使用。值得一提的是,当我重新启动程序时,它会得到正确的结果。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获取一次行并获得正确的结果-确定
  • 删除上面特定sql使用的表中的所有行,这意味着ResultSet下次不应返回任何内容
  • 再次尝试获取(现在它应该返回0行),但它返回的行与步骤1中的行完全相同,即使数据库表为空
使用后是否应该关闭结果集或执行其他操作,或者我缺少什么? 我从ResultSet中获得结果,即使数据库中没有任何内容。我可以保证SQL是合法的,但结果集似乎不是在第二次调用时从它创建的

编辑(连接初始化代码)


我希望您已关闭连接的自动提交

据我所知,这个小代码示例将演示您的问题

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();