Java - JDBC & Connection Pool
JDBC란 ?
-
JDBC(Java Database Connectivity)는 자바 프로그램에서 데이터베이스에 접근하고 SQL 쿼리를 실행하기 위한 자바 API(애플리케이션 프로그래밍 인터페이스)이다.
-
JDBC를 사용하면 자바 언어로 작성된 응용 프로그램이 다양한 관계형 데이터베이스 시스템과 상호 작용할 수 있다.
-
각 DB별로 지원하는 JDBC가 있다. ( Class.forName(“com.mysql.jdbc.Driver”) )
Class.forName 이란?
-
컴파일 타임에 직접적인 참조 없이 런타임에 동적으로 클래스를 로드하기 위함이다.
-
Driver의 경우 로드만 하면 되지 객체 생성은 필요 없기 때문에, 동적으로 런타임시에 로드 하는 것이다.
JDBC에서 Statement 나, connection 등을 close하지 않으면 생기는 문제는?
-
커넥션을 닫지 않으면 데이터베이스와의 연결이 해제되지 않아, 해당 자원이 계속 사용 중인 상태로 남아있게 된다.
-
이는 시스템 자원을 소비하고, 나중에 더 이상 필요하지 않은 연결들이 누적될 수 있습니다.
-
그리고 커네션을 반환하지 않았기 때문에, 커넥션 풀이 고갈되어 더 이상 사용 가능한 커넥션이 없게된다.
-
그것들은 결국 성능 저하로 연결 된다.
Statement 대신 PreparedStatement를 사용하는 이유
-
성능
-
PreparedStatement는 쿼리의 구조를 미리 컴파일하고, 매번 실행될 때마다 새로운 값을 바인딩하여 실행할 수 있다.
-
Statement 는 불편한 연결 과정과, 처리를 쿼리마다 반복해야 된다. ( Connection 포함 )
-
이로 인해 동일한 쿼리를 반복해서 실행하는 경우에 성능이 향상된다.
-
또한, 일반적으로 Statement에 비해 더 효율적으로 동작하며 캐시 기능을 사용할 수 있어 반복적인 쿼리에서 성능이 높아진다.
-
-
보안
-
PreparedStatement는 쿼리가 컴파일 되고 캐시된 이후에 객체화가 된다. 그리고 문자열이 아닌 파라키터이기 때문에 공격자가 임의의 SQL을 넣을 수 없다.
-
그러므로 SQL Injection 을 방어할 수 있다.
-
커넥션 풀이란?
-
데이터베이스 커넥션을 효율적으로 관리하기 위한 기술이다.
-
데이터베이스와의 연결은 비용이 큰 작업 중 하나이며, 매번 새로운 커넥션을 생성하고 해제하는 것은 효율적이지 않다.
- 3hand shake도 계속 해야되는데, 그런 비용을 아낄 수 있음.
-
그리고 관리적인 측면에서도 좋다.
-
커넥션 풀로 정해진 만큼의 커넥션만 이루어져야 하기 때문에 얼마나 사용되고 있고 등의 관리가 좋다.
-
예를들어 커넥션이 계속 생성되면 DB가 부하를 받을 수 있는데 그걸 미리 갯수를 지정해주어 막을 수 있다. ( 20개만 지정해 놓으면, 최대 20개의 스레드만 동시에 DB에 접근할 수 있음 )
-
대신 퍼포먼스가 막힐 수 있는 단점이 있다.
-
-
이러한 이유로 커넥션 풀을 사용한다.
-
하지만, 요즘은 커넥션 풀을 증가하거나 하여 관리하기 보다는 그냥 서버를 증설하는 추세이다.