programing

JDBC에서의 접속 풀링 옵션: DBCP와 C3P0

kingscode 2022. 9. 1. 23:56
반응형

JDBC에서의 접속 풀링 옵션: DBCP와 C3P0

Java/JDBC에 가장 적합한 연결 풀링 라이브러리는 무엇입니까?

다음 두 가지 주요 후보(무료/오픈 소스)를 고려하고 있습니다.

블로그나 다른 포럼에서 그들에 대해 많이 읽었지만 결정을 내리지 못했다.

이 두 가지에 대한 적절한 대안이 있나요?

DBCP는 구식이며 생산 등급도 아닙니다.얼마 전 우리는 이 두 가지를 자체 분석하여 실제 조건에서 적합성을 평가하기 위해 두 가지에 대한 부하와 동시성을 생성하는 테스트 픽스처를 만들었습니다.

DBCP는 항상 테스트 어플리케이션에 예외를 생성하여 C3P0이 예외 없이 처리할 수 있는 성능 수준에 도달하기 위해 노력했습니다.

또한 C3P0은 DB 절단 및 트랜스페어런트 재접속을 재개 시 확실하게 처리했지만 DBCP는 링크를 아래에서 분리해도 연결을 회복하지 못했습니다.더욱이 DBCP는 기본 전송이 중단된 응용 프로그램에 Connection 개체를 반환하고 있었습니다.

그 후, 4대 고부하 소비자용 Web 앱에 C3P0를 사용해, 지금까지 한 번도 돌아본 적이 없습니다.

업데이트: Apache Commons 사람들이 수년간 선반에 앉아 있다가 DBCP를 휴면상태에서 제외시킨 것으로 밝혀졌으며, 다시 한 번 활발하게 개발된 프로젝트입니다.따라서 제 원래 게시물은 오래된 것일 수 있습니다.

그렇다고는 해도, 이 새로운 업그레이드 라이브러리의 퍼포먼스를 경험해 본 적도 없고, 최근의 앱 프레임워크에서는 사실상의 퍼포먼스를 경험해 본 적도 없습니다.

무료 오픈 소스인 BoneCP를 사용해 보십시오(벤치마크 섹션 참조).

면책사항:저는 작가이기 때문에 편견이 있다고 할 수 있습니다:-)

업데이트: 2010년 3월 현재도 새로 고쳐 쓴 Apache DBCP('tomcat jdbc') 풀보다 약 35% 빠릅니다.벤치마크 섹션의 동적 벤치마크 링크를 참조하십시오.

업데이트 2: (2013년 12월)4년 만에 최고가 되었습니다.이보다 훨씬 빠른 경쟁사가 등장했습니다.https://github.com/brettwooldridge/HikariCP

업데이트 3: (Sep '14) 현시점에서는 BoneCP가 권장되지 않습니다.HikariCP로의 전환을 권장합니다.

업데이트 4: (15년 4월) -- jolbox.com 도메인을 소유하지 않습니다.

접속이 타임아웃 되었을 때 DBCP에 문제가 있었기 때문에 c3p0을 테스트했습니다.저는 이것을 실전에 출시하려고 했지만, 그 후 성능 테스트를 시작했습니다.c3p0의 퍼포먼스가 형편없었습니다.전혀 잘 작동하도록 설정할 수 없었습니다.DBCP보다 두 배나 느리다는 걸 알았어요

그런 다음 Tomcat 연결 풀링을 시도했습니다.

이것은 c3p0보다 2배 빠르고 DBCP에서 발생한 다른 문제를 해결했습니다.저는 3개의 수영장을 조사하고 테스트하는 데 많은 시간을 소비했습니다.Tomcat에 전개하는 경우에는 새로운 Tomcat JDBC 풀을 사용하는 것이 좋습니다.

DBCP의 자동 재접속 문제에 대해 다음 2개의 설정 파라미터를 사용해 본 적이 있습니까?

validationQuery="Some Query"

testOnBorrow=true

또 다른 대안은 HikariCP입니다.

비교 벤치마크는 다음과 같습니다.

DBCP를 사용한 지 몇 년이 지났습니다.안정적이며 DB 서버를 재부팅해도 문제가 없습니다.올바르게 설정하기만 하면 됩니다.몇 개의 파라미터만 지정하면 되므로 게으름을 피우지 마십시오.다음으로 동작시키기 위해 명시적으로 설정한 파라미터를 리스트 한 시스템 생산 코드의 일부를 나타냅니다.

DriverAdapterCPDS driverAdapterCPDS = new DriverAdapterCPDS();
driverAdapterCPDS.setUrl(dataSourceProperties.getProperty("url"));
driverAdapterCPDS.setUser(dataSourceProperties.getProperty("username"));
driverAdapterCPDS.setPassword(dataSourceProperties.getProperty("password"));
driverAdapterCPDS.setDriver(dataSourceProperties.getProperty("driverClass"));

driverAdapterCPDS.setMaxActive(Integer.valueOf(dataSourceProperties.getProperty("maxActive")));
driverAdapterCPDS.setMaxIdle(Integer.valueOf(dataSourceProperties.getProperty("maxIdle")));
driverAdapterCPDS.setPoolPreparedStatements(Boolean.valueOf(dataSourceProperties.getProperty("poolPreparedStatements")));

SharedPoolDataSource poolDataSource = new SharedPoolDataSource();
poolDataSource.setConnectionPoolDataSource(driverAdapterCPDS);
poolDataSource.setMaxWait(Integer.valueOf(dataSourceProperties.getProperty("maxWait")));
poolDataSource.setDefaultTransactionIsolation(Integer.valueOf(dataSourceProperties.getProperty("defaultTransactionIsolation")));
poolDataSource.setDefaultReadOnly(Boolean.valueOf(dataSourceProperties.getProperty("defaultReadOnly")));
poolDataSource.setTestOnBorrow(Boolean.valueOf(dataSourceProperties.getProperty("testOnBorrow")));
poolDataSource.setValidationQuery("SELECT 0");

다음은 DBCP가 C3P0 또는 Proxool보다 훨씬 높은 성능을 가지고 있음을 보여주는 문서입니다.또, c3p0에는, 준비된 스테이트먼트 풀링등의 훌륭한 기능이 있어, DBCP보다 설정이 가능하지만, DBCP는, 지금까지 사용해 본 환경에서는 확실히 고속입니다.

dbcp와 c3p0의 차이점전혀 없어! (사카이 개발자 블로그) http://blogs.nyu.edu/blogs/nrm216/sakaidelic/2007/12/difference_between_dbcp_and_c3.html

블로그 투고의 코멘트에 있는 JavaTech 기사 「Connection Pool Showdown」도 참조해 주세요.

또 다른 대안인 Proxool이 이 기사에 언급되어 있습니다.

Hibernate 번들 c3p0이 기본 연결 풀 구현에 사용되는 이유를 알 수 있습니다.

불행히도 그것들은 모두 구식이다.DBCP는 최근 약간 업데이트되었으며, 나머지 2개는 2~3년 전의 것으로, 많은 미해결 버그가 있습니다.

Dbcp가 올바르게 설정되어 있으면, 실가동할 수 있습니다.

예를 들어 하루에 350,000명의 방문자가 있으며 200개의 접속 풀을 가진 커머스 웹사이트에서 사용됩니다.

올바르게 설정하면, 타임 아웃이 적절히 처리됩니다.

버전 2는 현재 진행 중이며 많은 프로덕션 문제가 해결되었기 때문에 신뢰할 수 있는 배경을 가지고 있습니다.

델에서는 배치 서버 솔루션에 사용하고 있으며, 데이터베이스 내의 수백만 회선에서 동작하는 수백 개의 배치를 실행하고 있습니다.

tomcat jdbc 풀에 의해 실행되는 퍼포먼스 테스트에서는 cp30보다 퍼포먼스가 우수합니다.

DBCP로 하루 반을 낭비하는 걸 막 끝냈어최신 DBCP 릴리즈를 사용하고 있는데 j pimmel과 같은 문제가 발생했습니다.DBCP는 전혀 권장하지 않습니다.특히 DB가 없어졌을 때 접속을 풀에서 꺼내는 요령, DB가 돌아왔을 때 재접속할 수 없고 접속 오브젝트를 풀에 동적으로 추가할 수 없습니다(JDBC Connect I/O소켓 읽기 후 영원히 행업).

지금 C3P0으로 전환합니다.이전 프로젝트에서 사용한 적이 있는데 아주 잘 작동했고 잘 작동했어요.

멀티스레딩 프로젝트를 사용할 때는 c3p0이 좋습니다.프로젝트에서는 DBCP를 사용하여 여러 스레드 실행을 동시에 수행했지만 스레드 실행을 더 많이 사용하면 연결 타임아웃이 발생하였습니다.그래서 c3p0 구성으로 했습니다.

사용하기 쉬운 좋은 대안이 DBPool입니다.

"Java 기반 데이터베이스 연결 풀링 유틸리티로 시간 기반 만료, 스테이트먼트 캐시, 연결 검증 및 풀 매니저를 사용한 간편한 구성을 지원합니다."

http://www.snaq.net/java/DBPool/

우리는 커넥션 풀을 도입해야 하는 상황에 직면했고, 우리는 4가지 옵션을 앞에 두고 있었습니다.

  • DBCP2
  • C3P0
  • Tomcat JDBC
  • HikariCP

우리의 기준에 따라 몇 가지 테스트와 비교를 실시하여 HikariCP로 결정하였습니다.HikariCP를 선택한 이유를 설명하는 이 기사를 읽어보십시오.

제가 추천하는 것은

hikari > druid > UCP > c3p0 > DBCP

테스트한 결과에 따르면 20190202는 로컬 테스트 환경(4GB mac/docker/pool minSize=1, maxSize=8)에서 hikari는 1024 스레드 x 1024 회에 걸쳐 연결을 실행할 수 있으며 각 스레드의 평균 완료 시간은 100만 초 또는 200만 초이며 각 스레드당 평균 처리 시간은 256 x 1024 회에 불과합니다.2100만 초 (실패)

C3P0 를 최적인 방법으로 실장하려면 , 다음의 회답을 확인해 주세요.

C3P0:

엔터프라이즈 애플리케이션에서는 C3P0이 최선의 접근법입니다.C3P0은 JNDI 바인딩 가능한 DataSources(jdbc3 및 jdbc2 std 확장에서 설명한 바와 같이 Connection 및 Statement Pooling을 구현하는 DataSources 포함)를 사용하여 기존(DriverManager 기반) JDBC 드라이버를 확장하기 위한 사용하기 쉬운 라이브러리입니다.또한 C3P0은 DB 절단 및 트랜스페어런트 재접속을 재개 시 확실하게 처리했지만 DBCP는 링크를 아래에서 분리해도 연결을 회복하지 못했습니다.

따라서 c3p0 및 기타 접속 풀에도 준비된 스테이트먼트 캐시가 있습니다.이것에 의해, 애플리케이션 코드로 이 모든 것을 회피할 수 있습니다.문은 보통 일부 제한된 LRU 풀에 보관되므로 일반 문은 PreparedStatement 인스턴스를 재사용합니다.

더욱이 DBCP는 기본 전송이 중단된 응용 프로그램에 Connection 개체를 반환하고 있었습니다.c3p0의 일반적인 사용 예는 Apache Tomcat에 포함된 표준 DBCP 연결 풀을 교체하는 것입니다.대부분의 경우 프로그래머는 접속이 DBCP 접속 풀에서 올바르게 재활용되지 않는 상황에 직면하게 됩니다.이 경우 c3p0은 중요한 대체품이 됩니다.

최신 업데이트에서는 C3P0에 몇 가지 뛰어난 기능이 있습니다.다음과 같이 제공됩니다.

ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setMinPoolSize();
dataSource.setMaxPoolSize();
dataSource.setMaxIdleTime();
dataSource.setMaxStatements();
dataSource.setMaxStatementsPerConnection();
dataSource.setMaxIdleTimeExcessConnections();

여기서 max 및 min pool size는 이 응용 프로그램의 최소 및 최대 연결을 의미하는 연결 경계를 정의합니다. MaxIdleTime()아이돌 접속을 해제하는 타이밍을 클릭합니다.

DBCP:

이 접근법도 좋지만 접속 타임아웃이나 접속 현실화 등의 단점이 있습니다.멀티스레딩 프로젝트를 사용할 때는 C3P0이 좋습니다.프로젝트에서는 DBCP를 사용하여 여러 스레드 실행을 동시에 수행했지만 스레드 실행을 더 많이 사용하면 연결 타임아웃이 발생하였습니다.그래서 c3p0 구성으로 했습니다.DBCP는 전혀 권장하지 않습니다.특히 DB가 없어졌을 때 접속을 풀에서 꺼내는 요령, DB가 돌아왔을 때 재접속할 수 없고 접속 오브젝트를 풀에 동적으로 추가할 수 없습니다(JDBC Connect I/O소켓 읽기 후 영원히 행업).

감사합니다:)

언급URL : https://stackoverflow.com/questions/520585/connection-pooling-options-with-jdbc-dbcp-vs-c3p0

반응형