[java] JDBC를 사용한 연결 풀링 옵션 : DBCP vs C3P0

Java / JDBC에 사용 가능한 최상의 연결 풀링 라이브러리는 무엇입니까?

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

나는 블로그와 다른 포럼에서 그들에 대해 많이 읽었지만 결정을 내릴 수 없었습니다.

이 두 가지에 대한 대안이 있습니까?



답변

DBCP가 오래되었으며 프로덕션 등급이 아닙니다. 얼마 전 우리는 두 가지에 대한 사내 분석을 수행하여 실제 조건에서 적합성을 평가하기 위해 두 가지에 대한 부하와 동시성을 생성하는 테스트 픽스처를 만들었습니다.

DBCP는 지속적으로 테스트 애플리케이션에 예외를 생성하고 C3P0가 예외없이 처리 할 수있는 성능 수준에 도달하기 위해 고심했습니다.

C3P0은 또한 재개시 DB 연결 해제 및 투명 재 연결을 강력하게 처리했지만 DBCP는 연결을 끊어도 연결을 복구하지 못했습니다. 더 나쁜 것은 여전히 ​​DBCP가 기본 전송이 중단 된 응용 프로그램으로 Connection 객체를 반환하고 있다는 것입니다.

그 이후로 우리는 4 가지 주요로드 소비자 웹 앱에서 C3P0을 사용했으며 결코 되돌아 보지 않았습니다.

업데이트 : 수년 동안 선반에 앉아서 Apache Commons 사람들이 DBCP를 휴면 상태에서 벗어 났으며 다시 한 번 적극적으로 개발 된 프로젝트입니다. 따라서 원래 게시물이 오래되었을 수 있습니다.

그럼에도 불구하고, 나는이 새로운 업그레이드 된 라이브러리의 성능을 아직 경험하지 않았으며 최근의 앱 프레임 워크에서 실제로는 들리지 않았습니다.


답변

BoneCP 를 사용해보십시오. 무료이며 오픈 소스이며 사용 가능한 대안보다 빠릅니다 (벤치 마크 섹션 참조).

면책 조항 : 나는 저자이므로 편견이라고 말할 수 있습니다 🙂

업데이트 : 2010 년 3 월 현재, 새로 작성된 Apache DBCP ( “tomcat jdbc”) 풀보다 약 35 % 더 빠릅니다. 벤치 마크 섹션의 동적 벤치 마크 링크를 참조하십시오.

업데이트 # 2 : (Dec ’13) 최상위 4 년 후, 훨씬 빠른 경쟁 업체가 있습니다 : https://github.com/brettwooldridge/HikariCP

업데이트 # 3 : SEP (’14)은 BoneCP가 될 생각하세요 되지 로 전환하는 것이 좋습니다,이 시점에서 HikariCP .

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


답변

연결 시간이 초과되어 c3p0을 시험해 보았을 때 DBCP에 문제가있었습니다. 나는 이것을 프로덕션으로 공개하려고했지만 성능 테스트를 시작했다. c3p0이 끔찍하게 수행되었다는 것을 알았습니다. 전혀 잘 수행하도록 구성 할 수 없습니다. DBCP보다 두 배 느립니다.

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

이것은 c3p0보다 두 배 빠르며 DBCP와 관련된 다른 문제를 해결했습니다. 3 개의 풀을 조사하고 테스트하는 데 많은 시간을 보냈습니다. Tomcat에 배포하는 경우 조언은 새로운 Tomcat JDBC 풀을 사용하는 것입니다.


답변

DBCP의 자동 재 연결 문제에 대해 다음 두 가지 구성 매개 변수를 사용해 보셨습니까?

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”에 대한 내용도 참조하십시오.