JavaBookStudy / JavaBook

책읽기 스터디
https://javabookstudy.github.io/
Apache License 2.0
19 stars 2 forks source link

[토비의 스프링] 2.3.2_dao에서 PreparedStatement실행 후 Connection을 꼭 닫아줘야 하나요? #107

Closed kjsu0209 closed 3 years ago

kjsu0209 commented 3 years ago
 Connection c = dataSource.getConnection();

PreparedStatement ps = c.prepareStatement("delete from users");

 ps.executeUpdate();

ps.close();
c.close();

예제 코드에서는 항상 ps실행시키고 커넥션을 닫습니다. 한 요청에서 여러 번의 ps가 수행될 때, 모두 한 connection에서 이루어진다고 알고 있는데 PreparedStatement 실행 후 connection을 꼭 닫아줘야 하나요?

DataSource가 캡슐화를 잘 해 줘서 내부에 connection 관리가 어떻게 되는지 잘 모르겠습니다.

daebalprime commented 3 years ago

https://stackoverflow.com/questions/25864235/why-we-should-close-the-connection-in-jdbc-if-we-dont-do-it-what-will-happen 꼭 닫아줘야 한다고 하네요.

당연히 개발자들이 똑똑한 만큼 일정기간 아무것도 안하면서 살아만 있는 Connection을 닫아주는 것들을 각종 기술에 구현해놨을 테지만 그 불필요한 시간을 감수할 필요는 없겠지요. close만 해주면 쉽게 끝날 일입니다. 영구적인 메모리 누수 뿐 아니라 아무 일도 안하면서 메모리만 차지하는 멍청한 커넥션들이 일시적으로 점유하는 메모리 또한 leak라고 볼 수 있습니다.

또한 드라이버의 구현체에 따라 Effective Java에서 다뤘던 Finalizer라던가 그런 것들을 구현한 것도 있을꺼고 아닌 것도 있을건데 마냥 GC에 맡기기에는 connection을 close 하지 않을 이유가 있을까 싶습니다.

마지막으로 커넥션 풀에 관하여 말씀 드리자면, 역시 커넥션 풀의 활용도를 위해서라도 빨리빨리 쓰고 반납하는게 옳은 것이라고 생각합니다.