학습(구)/Java(구)

자바 성능 튜닝 - DB사용

잉아당 2021. 6. 8. 17:00
728x90

JDBC 관련 API는 인터페이스 입니다.

 

1. 드라이버 로드 

2. DB서버의 DriverManager 클래스의 getConnection 메서드를 사용해 Connection 객체 생성

3. Connection으로 부터 PreparedStatement 객체 받음

4. executeQuery를 수행해 결과로 ResultSet 객체를 받아 데이터 처리

5. 모든 데이터 처리후 finally 구문을 사용해 ResultSet, PreparedStatement, Connection 객체를 예외처리하며 close

 

주로 Connection을 생성하는 부분에서 성능이 저하됩니다. 그러므로 Connection Pool을 이용합니다. DataSource를 이용해 Connection Pool을 생성합니다.

 

Statement와 PreparedStatement의 큰 차이점은 캐시 사용 여부 입니다.

Statement와 PreparedStatement처음 사용시 

1. 쿼리 문장 분석

2. 컴파일 

3. 실행

=> 여기서 차이점은 Statement는 매번 이 과정을 거치고 PreparedStatement는 처음에 수행 후 캐시에 담아 재사용하여 PreparedStatement 성능이 좋습니다.

 

쿼리 수행 메서드

 - executeQuery() : Select 관련 쿼리를 수행하며 결과로 ResultSet을 리턴합니다.

- executetUpdate() : DML, DDL 쿼리를 수행하며 int형태로 수행된 레코드의 수를 리턴합니다.

- execute() : 쿼리의 종류와 관계 없이 수행하며 boolen 형태로 데이터를 리턴합니다. 데이터가 있을 경우 true를 리턴하여 getResultSet() 메서드를 통해 결과 값을 받을 수 있습니다. 그렇지 않는 false의 경우 변경된 행의 개수를 확인하기 위해 getUpdateCount()를 이용해 확인 할 수 있습니다.

- ResultSet의 경우 여러 데이터가 넘어와 next() 메서드를 사용해 데이터의 커서를 다음으로 옮기면서 처리할 수 있고 first()나 last() 메서드를 이용해 처음 혹은 마지막 커서로 이동할 수 있습니다.

 

JDBC 사용 후 리소르를 닫아 주어야 하는데 GC가 처리해 주지만 close()를 사용하는 이유는 자동으로 호출되기 전 관련된 DB와 JDBC 리소스를 해제하여 DB서버의 부담을 줄이기 위해서 입니다.

Connection Pool을 사용하고 있더라도 GC가 처리하기 전에 close()를 통해 닫아주어야 합니다.

모두 한곳에 몰아 넣어 처리를 하면 에러 발생시 롤백 되어 닫히지 않기 때문에 각 예외 처리를 해주어 닫아주어야 합니다.

 

JDK7에서 AutoClosable 인터페이스가 등장했습니다.

try블록이 시작될 때 소괄호에 close()메서드 호출이 필요한 객체를 생성하면 자동적으로 close()를 수행해줍니다.

 

rs.last()는 주로 전체 레코드의 수를 반환 받기 위해 사용되는데 레코드의 수가 많을 수록 부하가 많이 걸리므로 count(*) 쿼리를 사용해서 레코드 수를 반환 받는것이 성능면에서 좋습니다.

 

- setAutoCommit() : 꼭 필요할 때만 사용하는 것이 좋은데 여러 개의 쿼리를 동시에 작업할 때 성능에 영향을 주기 때문입니다.

- executeBatch() : 배치성 작업은 해당 메서드를 사용하는 것이 좋은데 여러 개의 쿼리를 한번에 수행할 수 있기 때문에 JDBC 호출 횟수가 감소되어 성능이 좋아집니다.

- setFetchSize() : 한번에 가져올 데이터의 수가 정해져 있을 경우 setFetchSize() 메서드를 사용해 원하는 개수를 정의하여 더 빠르게 가져오게 할 수 있지만 너무 많은 수를 지정하면 서버에 많은 부하를 주게 됩니다.

- 한건만 필요할 때는 한건만 가져오도록 쿼리를 지정하는 것이 좋습니다.