데이터베이스 연결 풀이 필요한 이유는 무엇입니까?

in #kr-dev2 years ago

여러분, 안녕하세요. 이 기사에서는 데이터베이스 연결수명 주기를 살펴보겠습니다 . 그런 다음 연결 풀 과 그 내부를 살펴보고 이를 사용해야 하는 이유를 살펴보겠습니다. 그런 다음 연결 풀을 배치할 위치에 대한 디자인 패턴을 살펴보겠습니다 . 그런 다음 데이터베이스 연결 풀에서 발생할 수 있는 성능 문제 를 살펴보고 Java에서 사용되는 일반적인 연결 풀 프레임워크를 살펴보는 것으로 기사를 마무리하겠습니다 . 시작하자.

[

](https://www.java67.com/2019/04/top-10-spring-mvc-and-rest-annotations-examples-java.html)

데이터베이스 연결이란 무엇입니까?

모든 소프트웨어 응용 프로그램은 데이터베이스에 데이터를 저장해야 하며 응용 프로그램이 데이터베이스 서버 와 상호 작용하려면 데이터베이스 연결이 필요합니다 . 데이터베이스 연결은 애플리케이션 소프트웨어가 데이터베이스 서버 소프트웨어와 상호 작용하는 방법일 뿐이며 연결을 사용하여 데이터베이스에 명령(SQL)을 보내고 결과 집합 의 형태로 데이터베이스에서 응답을 얻습니다 .

[

](http://javarevisited.blogspot.sg/2016/10/how-to-check-if-resultset-is-empty-in-Java-JDBC.html)

이미지 출처: https://softcover.s3.amazonaws.com/14738/python_book/images/connect_database3.jpg

데이터베이스 응용 프로그램은 일반적으로 응용 프로그램 서버와 다른 데이터베이스 서버 라는 전용 서버 에서 실행됩니다. 데이터베이스 응용 프로그램은 응용 프로그램 서버가 명령을 보내고 데이터를 받을 수 있는 데이터베이스 서버의 특정 포트에서 실행됩니다. 예: MySQL 데이터베이스 응용 프로그램은 데이터베이스 서버 시스템의 기본 포트 3306에서 실행됩니다. 이는 포트 8080에서 실행되는 백엔드 애플리케이션과 정확히 동일한 방식입니다.

브라우저나 모바일과 같은 클라이언트가 백엔드 애플리케이션에서 데이터를 요청할 때마다 백엔드 애플리케이션은 데이터를 검색하고 클라이언트에 응답하기 위해 데이터베이스와 통신해야 합니다.

백엔드 응용 프로그램이 데이터베이스 서버 응용 프로그램에 연결하려면 데이터베이스 서버 IP 및 포트 정보와 연결 자격 증명과 함께 TCP-IP 프로토콜을 통해 호출해야 합니다 . 응용 프로그램 서버가 데이터를 얻기 위해 데이터베이스 서버에 연결하는 프로세스는 데이터베이스 연결 이라는 메커니즘을 통해 이루어집니다 .

데이터베이스 연결을 구축하려면 아래와 같이 호스트, 포트 및 데이터베이스 이름, 드라이버, 사용자 이름 및 암호를 포함하는 서버 URL 과 같은 정보를 제공해야 합니다.

db_url       = jdbc:mysql://HOST/DATABASE db_driver    = com.mysql.jdbc.Driver db_username = 사용자 이름 db_password = PASSWORD

데이터베이스에 대한 연결이 생성되면 언제든지 열고 닫을 수 있으며 시간 초과를 설정할 수도 있습니다.

열린 연결이 없으면 데이터베이스 와 통신 할 수 없습니다. 데이터베이스 연결 생성은 많은 단계가 필요하므로 비용이 많이 드는 작업입니다. 데이터베이스 연결을 처리하는 방법은 전체 응용 프로그램을 만들거나 끊을 수 있으며 전체 응용 프로그램을 정지시킬 수도 있습니다.

데이터베이스 연결의 수명 주기

위의 데이터베이스 연결에 대해 자세히 살펴보았으므로 연결의 수명 주기 , 즉 응용 프로그램 서버에서 데이터베이스에 대한 연결을 생성하는 단계를 살펴보겠습니다.

이미지 출처: https://vladmihalcea.com/wp-content/uploads/2014/04/connectionlifecycle.gif

  1. 연결 문자열을 사용하여 데이터베이스에 대한 연결 열기
  2. 연결을 설정하기 전에 연결 문자열에 제공된 사용자 자격 증명 인증
  3. 데이터 읽기/쓰기를 위한 TCP 소켓 생성 및 열기
  4. 소켓을 통한 데이터 송수신
  5. 데이터베이스 연결 닫기
  6. TCP 소켓 닫기

여러 단계가 포함된 데이터베이스 시스템과의 연결을 생성하는 것은 비용과 시간이 많이 소요되는 작업이며 , 즉시 연결을 생성하면 응용 프로그램이 중단되고 사용자는 페이지 로딩 속도가 느려집니다. 또한 애플리케이션에 대규모 사용자가 있고 모든 요청에 대해 연결을 열면 동시 연결 수가 증가하여 CPU 및 메모리 리소스가 증가하여 매우 위험합니다.

이것이 매번 새 연결을 만들지 않고 기존 연결을 재사용하는 연결 풀이 있는 이유입니다 . 연결 풀이 없으면 각 클라이언트에 대해 새 데이터베이스 연결이 생성됩니다.

데이터베이스 연결이 생성될 때마다 어떤 일이 발생하는지 살펴보겠습니다.

이미지 출처: https://raw.githubusercontent.com/practicalli/graphic-design/live/practicalli-clojure-webapps-database-postgres-no-connection-pool.png

위의 다이어그램에서 RDMS 데이터베이스에 대한 새 연결이 생성되는 것을 볼 수 있습니다. 포스트그레스

백엔드 애플리케이션이 PostgreSQL 데이터베이스에 연결되면 데이터베이스 서버의 상위 프로세스가 새로 생성된 연결을 수신 대기하는 작업자 프로세스를 생성합니다. 매번 작업 프로세스를 생성하면 데이터베이스 서버에 추가 오버헤드가 발생합니다. 동시 연결 수가 증가함에 따라 데이터베이스 서버의 CPU 및 메모리 리소스도 증가하여 데이터베이스 서버가 충돌할 수 있습니다.

데이터베이스 연결 풀이란 무엇입니까?

위에서 응용 프로그램이 데이터베이스와 상호 작용해야 할 때마다 데이터베이스 연결을 생성, 사용 및 닫는 것은 비효율적임을 보았습니다. 연결 풀은 즉시 연결 생성과 관련된 문제를 해결하고 시스템 성능을 개선하는 데 도움이 되는 기술입니다.

이미지 출처: https://raw.githubusercontent.com/practicalli/graphic-design/live/practicalli-clojure-webapps-database-postgres-connection-pool.png

연결 풀은 응용 프로그램 시작 시 미리 만든 다음 데이터베이스에 액세스해야 하는 응용 프로그램 간에 연결을 공유( 새 연결을 만드는 대신 )할 수 있는 데이터베이스 연결 풀 입니다.

응용 프로그램이 초기화되면 제공자는 제공된 기본 연결을 생성합니다 (예: 서버 인스턴스당 10개) . 이를 풀에 유지합니다. 이 DB 연결 풀은 Application Server의 메모리에 상주합니다. 응용 프로그램에 연결이 필요한 경우 모든 요청에 대해 새 연결을 만드는 것은 비용이 많이 드는 작업이므로 풀의 이러한 연결은 재활용됩니다.

연결 풀에서 얻은 연결 개체는 실제 데이터베이스 연결을 둘러싼 래퍼 이며 풀의 연결을 사용하는 응용 프로그램은 기본 복잡성에서 숨겨집니다. 이러한 연결은 연결 풀 내부의 연결 수명 주기 관리를 담당하는 풀 연결 관리자 에 의해 관리됩니다 .

연결 풀의 접근 방식은 필요할 때만 응용 프로그램에서 연결을 열고 응용 프로그램의 전체 수명 동안 연결을 열린 상태로 유지하지 않고 작업이 완료되는 즉시 닫도록 권장합니다. 이 접근 방식을 사용하면 상대적으로 적은 수의 연결로 많은 수의 요청을 처리할 수 있으며 이를 다중화 라고도 합니다 .

연결 풀 의 개념은 서버 스레드 풀 또는 이미 생성된 객체의 재사용성을 촉진하여 객체를 다시 생성하는 오버헤드를 줄여 애플리케이션 성능을 향상시키는 문자열 풀 과 유사합니다 .

연결 풀에서 데이터베이스 연결을 어떻게 재사용합니까?

아래 다이어그램은 클라이언트가 풀의 연결을 사용하는 방법을 명확하게 나타냅니다.

이미지 출처: https://ejbvn.files.wordpress.com/2008/11/95.jpg?w=529

연결 풀이 필요한 이유는 무엇입니까?

데이터베이스 연결은 여러 가지 이유로 풀링됩니다.

  • 데이터베이스 연결은 생성하는 데 상대적으로 비용이 많이 들기 때문에 즉석에서 생성하는 대신 미리 생성하여 데이터베이스에 액세스해야 할 때마다 사용하도록 선택합니다.
  • 데이터베이스는 공유 리소스이므로 연결 풀을 만들고 모든 비즈니스 트랜잭션에서 공유하는 것이 좋습니다.
  • 데이터베이스 연결 풀은 데이터베이스에 보낼 수 있는 로드의 양을 제한합니다.

데이터베이스 연결 풀을 어디에 배치합니까?

아래와 같이 데이터베이스 연결 풀을 배치하는 두 가지 일반적인 방법이 있습니다.

  1. 클라이언트 수준의 데이터베이스 연결 풀

이것은 데이터베이스 연결 풀이 서버/마이크로 서비스 애플리케이션의 메모리에 상주하는 기본 접근 방식입니다. 특정 서버가 가동될 때마다 지정된 연결을 생성하고 메모리 내의 풀에 배치합니다. 이러한 연결은 이 서버 인스턴스에 도달하는 요청에만 사용할 수 있으며 다른 마이크로 서비스에서는 사용할 수 없습니다. 마찬가지로 모든 마이크로 서비스 인스턴스에는 자체 연결 풀이 있습니다.

[

](https://www.java67.com/2021/02/microservices-interview-questions-answers-java-spring.html)

장점

  • 풀이 요청자와 동일한 상자에 있기 때문에 대기 시간이 짧습니다.
  • 연결이 하나의 클라이언트로 제한되므로 보안이 향상됩니다.

단점

  • 마이크로서비스를 너무 많이 사용하면 연결을 모니터링하고 제어하기 어려울 수 있습니다.

2. 별도의 미들웨어로서의 공유 데이터베이스 연결 풀

이 접근법에서 우리는별도의 미들웨어에 있는 연결 풀또는 데이터베이스 서버 인스턴스에서 데이터베이스 연결 풀을 중앙 집중식으로 관리합니다.

연결은 PgBouncer 와 같은 소프트웨어에 의해 연결 풀에서 생성되며 모든 마이크로 서비스 인스턴스가 이를 공유합니다.

[

](https://javarevisited.blogspot.com/2015/07/how-to-solve-javalangclassnotfoundexception-sun.jdbc.odbc.jdbcodbcdriver.html)

장점:

  • 유연성 — 데이터베이스 교체 가능
  • 연결을 보다 쉽게 모니터링하고 제어할 수 있는 중앙 집중식 연결 제어

단점:

  • 새로운 레이어를 소개합니다. 대기 시간을 추가할 수 있음
  • 모든 클라이언트에서 데이터베이스 호출에 대한 단일 실패 지점
  • 레이어 간에 연결을 공유하므로 잠재적인 보안 문제

연결 풀을 배치할 위치 선택은 특정 요구 사항에 따라 다릅니다. 애플리케이션이 작은 경우 첫 번째 접근 방식을 사용하여 마이크로 서비스 인스턴스 내부에 배치하고 애플리케이션이 커지면 연결 풀을 중앙 집중식 위치로 이동하여 쉽게 관리할 수 있습니다.

연결 풀의 성능 문제

데이터베이스에 대한 부하를 줄이기 위해 연결을 풀링합니다. 그렇지 않으면 너무 많은 부하로 데이터베이스가 포화되어 중단될 수 있기 때문입니다. 요점은 연결 풀을 원할 뿐만 아니라 풀 크기도 올바르게 구성 해야 한다는 것입니다.

연결이 충분하지 않은 경우 비즈니스 트랜잭션은 처리를 계속하기 전에 연결이 사용 가능해질 때까지 기다려야 합니다.

그러나 연결이 너무 많으면 데이터베이스 에 너무 많은 부하를 보내고 있을 수 있으며 모든 애플리케이션 서버의 모든 비즈니스 트랜잭션이 데이터베이스 성능 저하로 인해 어려움을 겪을 수 있습니다. 트릭은 중간 지점을 찾는 것입니다

크기가 너무 작은 데이터베이스 연결 풀의 주요 증상은 대부분의 비즈니스 트랜잭션이 대기 중인 여러 비즈니스 트랜잭션에서 응답 시간이 증가하고 크기가 너무 큰 데이터베이스 연결 풀의 증상은 여러 비즈니스에서 응답 시간이 증가하는 것입니다. 대부분의 비즈니스 트랜잭션이 쿼리의 응답을 기다리고 있고 데이터베이스 시스템의 높은 리소스 사용률이 있습니다.

연결 풀이 오버플로되면 응용 프로그램 오류가 발생합니다. 이것은 응용 프로그램이 연결을 요청할 때 풀의 모든 연결이 사용 중인 경우에 발생할 수 있습니다. 예를 들어 너무 많은 클라이언트가 웹 사이트에 액세스하려고 시도하거나 하나 이상의 작업이 차단되거나 단순히 비효율적인 경우 응용 프로그램이 연결을 너무 오래 사용할 수 있습니다.

연결 풀은 CPU 및 메모리 사용량을 줄이는 데 도움이 되지만 효율적으로 사용해야 합니다. 고정된 연결 집합을 풀 크기 라고 하며 통합 테스트 중에 사용되는 풀 크기를 테스트하여 응용 프로그램별 또는 서버 인스턴스별 최적 값을 찾는 것이 좋습니다.

Java용 연결 풀 구현

다음은 Java용 데이터베이스 연결 풀 구현 중 일부입니다. 애플리케이션 내에서 라이브러리로 사용될 때 이러한 프레임워크는 애플리케이션의 연결 풀을 관리합니다.

  • Apache Commons DBCP2 — Commons Pool 2 기반 JDBC 프레임워크로 JDBC 드라이버를 통해 더 나은 데이터베이스 연결 성능을 제공하고 JMX 지원 등의 기능을 제공합니다.
  • Tomcat JDBC — 고도의 동시 환경과 멀티 코어/CPU 시스템을 지원합니다.
  • pgBouncer — PostgreSQL용 경량 오픈 소스 미들웨어 연결 풀입니다.
  • HikariCP — 빠르고 간단하며 가볍고 안정적입니다. 이는 Java를 사용하는 Spring Boot 애플리케이션의 기본 설정입니다. 라이브러리의 크기는 130Kb에 불과합니다.
  • c3p0 — 기존 JDBC 드라이버를 만들기 위한 사용하기 쉬운 라이브러리

다른 언어에 대한 다양한 연결 풀 라이브러리도 있습니다. 또한 필요한 경우 고유한 연결 풀을 구축할 수도 있습니다.

요약

이 기사에서는 데이터베이스 연결과 수명주기가 무엇인지 살펴 보았습니다 . 그런 다음 즉시 연결 생성의 단점을 확인한 다음 데이터베이스 연결 풀을 사용해야 할 필요성을 확인했습니다 . 또한 연결 풀을 배치할 위치에 대한 디자인 패턴도 살펴보았습니다. 그런 다음 데이터베이스 연결 풀에서 발생할 수 있는 성능 문제를 살펴보고 Java에서 사용되는 일반적인 연결 풀 프레임워크를 살펴보는 것으로 기사를 마무리했습니다.

https://medium.com/javarevisited/why-do-we-need-a-database-connection-pool-every-programmer-must-know-9f90e7c8e5af

Sort:  

[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.