【问题标题】:Second Query says, that resultset is closed第二个查询说,结果集已关闭
【发布时间】:2015-10-24 22:02:29
【问题描述】:

我有 2 节课。问题是,如果我尝试执行第二个查询,我得到一个结果集已关闭异常。第二个查询rs.next 返回真。你能告诉我我在哪个位置关闭了错误的资源吗?如果我从 releaseResources() 方法中删除 this.queryResult.close()this.statement.close(),错误是“连接已关闭。我不是在每次调用时创建一个新的连接实例、preparedstatement 和结果集吗?

主要:

public static void main(String[] args) throws ClassNotFoundException, SQLException, InstantiationException, IllegalAccessException, InterruptedException {
                DatabaseConnectionHelper con = new DatabaseConnectionHelper();
                ResultSet rs = con.executeQuery("SELECT * FROM [winfiler].[dbo].[customer_data]");
                System.out.println(rs.next());
                while(rs.next()){
                    System.out.println(rs.getString("name"));
                }
                con.releaseResources();
                ResultSet rs3 = con.executeQuery("SELECT * FROM [winfiler].[dbo].[customer_data]");
                System.out.println(rs3.next());
                while(rs3.next()){
                    System.out.println(rs.getString("name"));
                }
    }

数据库连接的帮助类:

public class DatabaseConnectionHelper {

    private Connection connection=null;
    private PreparedStatement statement=null;
    private ResultSet queryResult=null;

    public Connection connectToDatabase(){
        try {
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            connection = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;databaseName=******;user=********;password=********");
            return connection;
        } catch (ClassNotFoundException ex) {
            MessageHelper.createClassNotFoundExceptionMessage("Eine exception ist aufgetreten", "Classe konnte nicht gefunden werden (Verbindung zur Datenbank)", ex.getMessage());
        } catch (SQLException ex) {
            MessageHelper.createSQLExceptionMessage("Eine exception ist aufgetreten", "Probleme beim der Datenabfrage - DatabaseConnectionHelper", ex.getMessage());
        }
            return null;
    }

    public ResultSet executeQuery(String query){
        try{
            statement = connectToDatabase().prepareStatement(query);
            queryResult = statement.executeQuery();


            return queryResult;
        }catch (SQLException ex) {
            MessageHelper.createSQLExceptionMessage("Eine exception ist aufgetreten", "Probleme beim der Datenabfrage - DatabaseConnectionHelper", ex.getMessage());
        }
        return null;
    }

    public boolean releaseResources(){
        try {
            this.queryResult.close();
            this.statement.close();
            this.connection.close();
            return true;
        } catch (SQLException ex) {
            MessageHelper.createSQLExceptionMessage("Eine exception ist aufgetreten", "Resourcen konnten nicht freigegeben werden - DatabaseConnectionHelper", ex.getMessage());
        }
        return false;
    }
}

【问题讨论】:

  • releaseResources() 称为connection.close()。所以,调用这个函数后连接关闭也就不足为奇了。

标签: java sql sql-server jdbc


【解决方案1】:

您的实际问题是您在第二个循环中调用rs.getString("name"); 而不是rs3.getString("name");

您的connectToDatabase() 创建了一个新连接。所以这不是问题,只要你不同时使用 DBConnectionHelper。

BTW1:您应该避免使用System.out(rs.next());,因为它有副作用并会跳过第一行。 BTW2:您的releaseResources() 可以改进:您应该忽略/单独捕获来自 RS 和状态的异常,或者至少在 finally 中关闭连接本身。

【讨论】:

    【解决方案2】:

    问题在于,当您调用 con.releaseResources() 时,就在第二个查询之前,您实际上是在释放连接对象。

    【讨论】:

    • 不,con.executeQuery() 分配一个新的。 (con 不是连接)。
    猜你喜欢
    • 1970-01-01
    • 2015-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多