> 데이터 베이스 > MySQL 튜토리얼 > Java에서 'java.sql.SQLException: ResultSet이 닫힌 후 작업이 허용되지 않음' 예외를 해결하는 방법은 무엇입니까?

Java에서 'java.sql.SQLException: ResultSet이 닫힌 후 작업이 허용되지 않음' 예외를 해결하는 방법은 무엇입니까?

DDD
풀어 주다: 2024-12-10 07:22:09
원래의
403명이 탐색했습니다.

How to Resolve a

작업이 허용되지 않음: Java의 ResultSet Closed Exception

특정 SQL 쿼리를 실행할 때 개발자는 "java.sql.SQLException: ResultSet이 닫힌 후에는 작업이 허용되지 않습니다." 예외가 발생했습니다. 이 오류는 일반적으로 동일한 명령문 개체에서 여러 ResultSet를 동시에 시도할 때 발생합니다.

이 문제를 보여주는 다음 코드 조각을 고려하세요.

// Problem code: using the same statement object to create multiple ResultSets

try {
    // Execute the first query and obtain ResultSet rs
    ResultSet rs = statement.executeQuery("SELECT `name` FROM `user` WHERE `id` = " + userId + " LIMIT 1;");

    // Execute the second query and obtain ResultSet rs2
    ResultSet rs2 = statement.executeQuery("SELECT `id` FROM  `profiles` WHERE `id` =" + profId + ";");

    // Prepare a new statement and attempt to use rs2
    PreparedStatement pst = (PreparedStatement)connection.prepareStatement("INSERT INTO `blah`............");

    // Process data from rs2 and update the database using pst
    while(rs2.next()) {
        int id = rs2.getInt("id");
        int stuff = getStuff(id);

        pst.setInt(1, stuff);
        pst.addBatch();
    }

    pst.executeBatch();
} catch (Exception e) {
    e.printStackTrace();
}
로그인 후 복사

이 코드에서 두 개의 ResultSet(rs 및 rs2)는 동일한 명령문 객체(명령문)에서 생성됩니다. 그러나 rs는 명시적으로 닫히지 않지만 두 번째 쿼리가 실행되어 rs2를 얻을 때 암시적으로 닫힙니다. rs2가 닫힌 ResultSet에서 작업을 시도하기 때문에 예외가 발생합니다.

해결 방법:

이 문제를 해결하려면 사용하기 전에 모든 ResultSet를 닫는 것이 중요합니다. 새로운 ResultSet을 얻기 위해 동일한 명령문 객체를 사용합니다. 이는 예외가 발생하더라도 ResultSet가 닫히도록 try-finally 블록을 사용하여 달성할 수 있습니다.

// Corrected code: closing the ResultSet objects
try {
    // Execute the first query and obtain ResultSet rs
    ResultSet rs = statement.executeQuery("SELECT `name` FROM `user` WHERE `id` = " + userId + " LIMIT 1;");

    // Use rs to retrieve data
    if(rs.next()) {
        String name = rs.getString("name");
    }

    // Close rs
    rs.close();

    // Execute the second query and obtain ResultSet rs2
    ResultSet rs2 = statement.executeQuery("SELECT `id` FROM  `profiles` WHERE `id` =" + profId + ";");

    // Use rs2 to retrieve data
    while(rs2.next()) {
        int id = rs2.getInt("id");
        int stuff = getStuff(id);

        pst.setInt(1, stuff);
        pst.addBatch();
    }

    // Close rs2
    rs2.close();

    pst.executeBatch();
} catch (Exception e) {
    e.printStackTrace();
}
로그인 후 복사

위 내용은 Java에서 'java.sql.SQLException: ResultSet이 닫힌 후 작업이 허용되지 않음' 예외를 해결하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿