Java에서 DB 사용시 발생할 수 있는 문제점들

📌 시작하기 앞서

웹 기반 시스템에서 주로 DB에서 가장 많이 소요된다. 이 글에서 DB 튜닝은 다루지 않지만, 발생할 수 있는 문제점에 대해 알아보려고 한다.

📌 Statement & PreparedStatement

캐시 여부

프로세스는 쿼리 문장 분석 → 컴파일 → 실행 순서로 진행된다.
Statement는 매번 쿼리를 수행할 때마다 각 단계를 거친다.
PreparedStatement는 처음 한 번만 거친 후, 캐시에 담아 재사용한다. 따라서 DB에 훨씬 적은 부하를 주고, 성능도 좋다.

📌 DB를 사용할 때 닫아야 하는 것들

close()

close() 메서드 호출, GC의 대상이 되어 GC되는 경우, 치명적인 에러가 발생하는 경우에 닫힌다.
리소스를 사용하면 close() 메서드를 호출해야 닫아줘야 한다.
GC로 자동으로 호출되기 전에 관련 리소스를 해제하기 위해 close() 메서드를 호출해줘야 한다. 조금이라도 빨리 닫아야 DB 서버의 부담이 적어지기 때문이다.

Connection Pool로 인해 close()는 빠르게 호출해주자

시스템이 기동되면 지정된 개수만큼 연결하고, 필요할 때 증가시키도록 되어 있다. 그러나 이 개수도 한정되어 있기 때문에 사용자는 더 이상 사용할 수 없다면 대기해야 하는 상황이 발생한다.
여기서 문제는 시간이 어느 정도 지나면 오류가 발생하는 문제가 생긴다. 따라서 close() 메서드를 호출하여 빠르게 연결을 닫아줘야 한다.

AutoClosable 인터페이스를 활용하자.

close() 메서드 하나만 선언되어 있다.
이를 활용하면 try-with-resources 문장으로 관리되는 객체에 대해 자동으로 close() 처리를 한다.
try-with-resources는 JDK 7부터 추가된 구문이다.
try (BufferedReader br = new BufferedReader(rreader)) { return br.readLine(); }
Java

📌 JDBC 사용하면서 유의할 점들

setAutoCommit() 메서드는 필요할 때만 사용하라.
자동 커밋 여부를 지정하는 작업은 반드시 필요할 때만 사용하라.
여러 쿼리를 동시에 작업할 때 성능에 영향을 준다.
배치성 작업은 executeBatch() 메서드를 사용하라.
여러 쿼리를 한 번에 수행할 수 있고, JDBC 호출 횟수가 감소될 수 있다.
setFetchSize() 메서드를 사용하여 데이터를 빠르게 가져와라.
원하는 개수를 지정해서 가져오자. 많이 가져오면 서버에 부하가 올 수 있다.
한 건만 필요할 때는 한 건만 가져오자.

📌 참고 자료

TOP