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에 접근할 수 있음 )

    • 대신 퍼포먼스가 막힐 수 있는 단점이 있다.

  • 이러한 이유로 커넥션 풀을 사용한다.

  • 하지만, 요즘은 커넥션 풀을 증가하거나 하여 관리하기 보다는 그냥 서버를 증설하는 추세이다.






results matching ""

    No results matching ""