JDBC DAO 객체에서, 다음과 같은 코드를 짤 수 있다.
`// JdbcTemplate.java public void insert(String query) throws SQLException { Connection connection = getConnection(); PreparedStatement statement = connection.prepareStatement(query); setParameters(statement); statement.executeUpdate(); }`
연결을 수립하고, PreparedStatement를 준비한 다음 파라메터를 탑재하고 Insert를 수행하는 이 코드는 구조상 문제가 없어 보이지만 닫아야 하는 Connection
, PreparedStatement
를 닫지 않았다.
따라서 Connection
을 수동으로 닫지 않거나 중간에 exception 발생 등으로 닫히는 로직이 실행되지 않게 되면, 많은 쿼리를 짧은 시간에 처리해야 하는 경우 Connection이 풀로 반환되지 않아 프로그램이 다운될 수 있다.
이럴 때 사용할 수 있는 방법이 try-with-resources를 사용하는 방법이다. 자바 7에서 추가된 try-with-resources는 기존에 finally를 이용하는 방법보다 더 간단하게 자원을 해제할 수 있다.
AutoClosable을 상속받은 클래스의 객체라면 무엇이든 try-with-resources로 자동 해제시킬 수 있다.
`public interface Connection extends Wrapper, AutoCloseable { //... }`
사용법은 이렇다.
`try ( //Connection이나 Statement 등... ) { //로직... } catch(Exception e) { //예외 처리... }`
맨 위의 코드를 try-with-resources로 리팩토링 한다면…
`// JdbcTemplate.java public void insert(String query) throws SQLException { try ( Connection connection = getConnection(); PreparedStatement statement = connection.prepareStatement(query) ) { setParameters(statement); statement.executeUpdate(); } }`
참고자료
- https://blog.benelog.net/1898928.html JDBC에서 Connection, Statement,ResultSet의 close
Comments powered by Disqus.