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

Java에서 \'ResultSet이 닫힌 후 작업이 허용되지 않음\' 예외를 처리하는 방법은 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-10-29 14:21:02848검색

How to Handle

Java - "ResultSet이 닫힌 후 작업이 허용되지 않음" 예외 처리

MySQL 연결을 닫을 때 "작업이 허용되지 않음" 오류가 발생할 수 있습니다. ResultSet이 닫힌 후에 허용됩니다." 이는 JDBC가 쿼리 결과를 점진적으로 검색하여 연결이 닫히면 유효하지 않게 되는 ResultSet을 제공하기 때문에 발생합니다.

예외 원인

반환하는 ResultSet 귀하의 방법은 열린 연결에 의존합니다. finally 블록 내에서 연결을 닫으면 ResultSet을 사용할 수 없게 되어 예외가 발생합니다.

해결책

ResultSet을 반환하는 대신 다음을 사용하는 메서드를 생성하세요. 개체 또는 개체 컬렉션을 채우는 데 사용됩니다. 그런 다음 채워진 개체 또는 컬렉션을 반환합니다.

리팩터링된 코드

다음 코드는 메서드의 수정된 버전을 보여줍니다.

<code class="java">public static List<T> sqlquery(String query, RowMapper<T> rowMapper) throws SQLException {
    Connection connection = DriverManager.getConnection("databaseadress", "username", "password");
    Statement st = connection.createStatement();
    ResultSet rs = st.executeQuery(query);
    List<T> list = new ArrayList<>();
    while (rs.next()) {
        list.add(rowMapper.mapRow(rs));
    }
    try {
        rs.close();
        st.close();
        connection.close();
    } catch (SQLException e) {
        log.info(e);
    }
    return list;
}</code>

RowMapper 사용

RowMapper 인터페이스는 ResultSet의 각 행을 객체에 매핑하는 데 사용됩니다. 채우려는 객체를 기반으로 자신만의 RowMapper 구현을 생성할 수 있습니다.

이점

이 접근 방식은 다음과 같습니다.

  • 연결과 독립적인 재사용 가능한 객체를 다시 전달합니다.
  • ResultSet 또는 명령문 클로저 중에 발생한 예외가 연결 클로저를 방해하지 않도록 방지합니다.
  • SQL 주입을 방지하기 위해 쿼리의 매개변수화를 촉진합니다.

결론

"ResultSet이 닫힌 후 작업이 허용되지 않음" 예외를 방지하려면 RowMapper를 사용하여 개체나 컬렉션을 채우고 ResultSet 대신 이를 반환하도록 코드를 수정하세요. 이 접근 방식을 사용하면 연결이 종료된 후에도 메소드가 계속 작동하도록 보장합니다.

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

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.