안전하게 결과 세트 반환
데이터베이스 쿼리에서 결과 세트를 반환하는 것은 리소스 누출 위험으로 인해 복잡한 작업이 될 수 있습니다. 여기서는 데이터를 효율적으로 반환하기 위한 대체 접근 방식을 탐색하여 이 문제를 해결합니다.
문제:
결과 집합을 직접 반환하려고 하면 코드에서 오류가 발생합니다. 메소드 실행 후 결과 세트가 닫히기 때문에 java.sql.SQLException이 발생합니다.
해결책: 다음으로 매핑 JavaBeans
결과 세트 자체를 반환하는 대신 데이터를 JavaBeans 컬렉션에 매핑합니다. 이 접근 방식을 사용하면 결과 집합을 반복하는 동안 연결과 문을 열린 상태로 유지할 수 있습니다. 예는 다음과 같습니다.
public List<Biler> list() throws SQLException { Connection connection = null; PreparedStatement statement = null; ResultSet resultSet = null; List<Biler> bilers = new ArrayList<>(); try { connection = database.getConnection(); statement = connection.prepareStatement("SELECT id, name, value FROM Biler"); resultSet = statement.executeQuery(); while (resultSet.next()) { Biler biler = new Biler(); biler.setId(resultSet.getLong("id")); biler.setName(resultSet.getString("name")); biler.setValue(resultSet.getInt("value")); bilers.add(biler); } } finally { if (resultSet != null) try { resultSet.close(); } catch (SQLException ignore) {} if (statement != null) try { statement.close(); } catch (SQLException ignore) {} if (connection != null) try { connection.close(); } catch (SQLException ignore) {} } return bilers; }
Try-with-Resources 문
Java 7 이상을 사용하는 경우 try-with-resources를 활용할 수 있습니다. 자동 자원 폐쇄 명령문:
public List<Biler> list() throws SQLException { List<Biler> bilers = new ArrayList<>(); try ( Connection connection = database.getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT id, name, value FROM Biler"); ResultSet resultSet = statement.executeQuery(); ) { while (resultSet.next()) { Biler biler = new Biler(); biler.setId(resultSet.getLong("id")); biler.setName(resultSet.getString("name")); biler.setValue(resultSet.getInt("value")); bilers.add(biler); } } return bilers; }
추가 고려사항
연결, 명령문 및 결과 세트를 인스턴스 변수로 선언하지 않는 것이 중요합니다(스레드 안전성 문제). 또한 SQLException을 적절하게 처리하고 올바른 순서로 리소스를 닫는 것이 중요합니다. 이러한 지침을 따르면 리소스 관리를 유지하면서 효과적으로 결과 세트를 반환할 수 있습니다.
위 내용은 Java에서 데이터베이스 결과 세트를 안전하게 반환하고 리소스 누출을 방지하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!