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


312

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

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

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

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

답변:


181

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

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

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

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

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

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


2
감사! 제안 된 Proxool 대안은 어떻습니까? Hibernate의 현재 버전은 c3p0과 Proxool과 함께 제공됩니다.
Dema

우리는 Proxool을 시도하지 않은하지만 난 :) 지금 확인하시기 바랍니다 수 있습니다
J의 pimmel

5
c3p0에는 몇 가지 단점이 있습니다. 연결 피크를 처리하지 못하는 경우가 있습니다.
Janning

3
이 답변을 처음 게시 한 4 년 이후 많은 것이 바뀌 었습니다. 가능한 경우 현재 시나리오를 공유하는 업데이트를 추가 할 수 있습니까?
Rajat Gupta

13
나는 HikariCP를 강력히 추천 하지만 작성하는 데 도움을 주었다.
brettw

177

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을 소유하지 않습니다


1
BoneCP를 Tomcat 데이터 소스로 사용하여 문제를 해결하고 싶습니다. 내가 가진 주요 문제는 tomcat의 lib 디렉토리뿐만 아니라 log4j 및 google 클래스의 BoneCP 클래스가 필요하다는 것입니다. 이 만든 연결 풀의 일을 - ... dealbreaker이었다 응용 프로그램에서 전혀 그러나 그것은 톰캣의 Log4j의 설정과 충돌하고 로그 출력을 방지 - (그것은 전쟁 동안 일을하지 않았다)
J의 pimmel

1
이것은 무엇보다 log4j 문제처럼 들립니다. forum.jolbox.com에 한 줄을 남겨 주시면 최대한 빨리 추적 할 수 있도록 도와 드리겠습니다.
wwadge 2016 년

3
1, BoneCP는 훌륭합니다. C3P0에서 전환되었습니다. 심지어 log4jdbc-remix에 대한 의존성을 제거 할 수있었습니다.
subes

68
더 이상 쓰지 않은 것에 대한 업데이트 +1!
CorayThan

1
@AndrewScottEvans v0.7.1로 되돌리려면 아마도 최고의
wwadge

16

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

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

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


14

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

validationQuery="Some Query"

testOnBorrow=true

문서관련 하여 testOnBorrow기본값이 true있으므로 validationQuery정의 된 경우 DBCP는 모든 연결을 테스트하여 애플리케이션에 전달합니다.
dma_k


12

현재 프로덕션 환경에서 몇 년 동안 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");

8

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


4
단일 스레드 환경에서 더 빠를 수 있습니다.

7

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

왜 기본 연결 풀 구현을 위해 Hibernate 번들 c3p0을 번들로 제공하는지 알아낼 수 있을까요?


7

불행히도 그들은 모두 구식입니다. DBCP는 최근 약간 업데이트되었으며 다른 두 개는 2-3 세이며 많은 버그가 있습니다.


C3PO의 마지막 릴리스 (0.9 시험판)는 2007 년 5 월부터입니다. Proxool의 최신 릴리스 (0.9 시험판)는 2008 년 8 월입니다. DBCP의 마지막 릴리스도 2007 년 4 월입니다. 적어도 안정적인 1.2 릴리스. 실제로 유지되는 것이 있습니까?
Guss

4
공정하게 말하면 이것이 큰 프로젝트는 아니므로 C3P0 / DBCP의 업데이트가 점점 줄어들고 시간이 지남에 따라야합니다.
wwadge

7

제대로 구성된 경우 Dbcp는 프로덕션 준비 상태입니다.

예를 들어 하루에 350000 방문자의 상거래 웹 사이트와 200 개의 연결 풀로 사용됩니다.

올바르게 구성하면 시간 초과가 매우 잘 처리됩니다.

버전 2가 진행 중이며 많은 생산 문제가 해결되어 신뢰할 수있는 배경이 있습니다.

우리는 배치 서버 솔루션에 사용하며 데이터베이스의 수백만 줄에서 작동하는 수백 개의 배치를 실행했습니다.

tomcat jdbc pool에서 실행 한 성능 테스트는 cp30보다 성능이 우수함을 보여줍니다.


UBIK LOAD PACK-DBCP 1.4를 사용하고 있으며 10000 개의 레코드가있는 단일 배치의 끊김 현상이 발생합니다. 우리는 Spring Batch + JSR 352를 사용하고 HikariCP 로의 전환을 생각하고 있습니다. 100 개의 배치가 원활하게 실행된다고 말하면 DBCP 2.x 또는 다른 버전으로 실행되고 있습니까? 또한 구성을 공유 하시겠습니까? 구성은 maxActive = 150, minIdle = 15, maxIdle = 75, initialSize = 15이지만 중단이 보이지 않습니다. 우리는 validationQuery 또는 testOnBorrow / testOnReturn을 사용하지 않습니다. 그것을 사용하는 것이 좋습니다?
Yogendra

4

DBCP로 하루 반을 낭비했습니다. 최신 DBCP 릴리스를 사용하고 있지만 j pimmel 과 동일한 문제가 발생했습니다 . DBCP를 전혀 권장하지 않습니다. 특히 DB가 사라질 때 풀에서 연결을 끊는 문제, DB가 돌아올 때 다시 연결할 수 없음 및 연결 개체를 풀에 동적으로 다시 추가 할 수 없음 (영원히 중단됨) 사후 JDBCconnect I / O 소켓 읽기)

지금 C3P0으로 전환하고 있습니다. 나는 이전 프로젝트에서 그것을 사용했고 그것은 매력처럼 작동하고 수행했습니다.


4

c3p0은 mutithreading 프로젝트를 사용할 때 좋습니다. 우리 프로젝트에서는 DBCP를 사용하여 여러 스레드 실행을 동시에 사용했으며 더 많은 스레드 실행을 사용하면 연결 시간이 초과되었습니다. 그래서 우리는 c3p0 구성으로 갔다.


3

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

"시간 기반 만료, 명령문 캐싱, 연결 검증 및 풀 관리자를 사용한 쉬운 구성을 지원하는 Java 기반 데이터베이스 연결 풀링 유틸리티입니다."

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


DBPool과 BoneCP를 벤치마킹했습니다. DBPool는 다른 것들 사이에 동기화의 getConnection ()를하게하고 멀리까지 느린 BoneCP (참조 :보다 jolbox.com/forum/viewtopic.php?f=3&t=175을 ).
wwadge

3

우리는 연결 풀을 도입 해야하는 상황을 겪었고 우리 앞에 4 가지 옵션이있었습니다.

  • DBCP2
  • C3P0
  • 톰캣 JDBC
  • 히카리 CP

우리는 기준에 따라 몇 가지 테스트와 비교를 수행했으며 HikariCP로 가기로 결정했습니다. HikariCP를 선택한 이유를 설명하는 이 기사 를 읽으십시오 .


1

가장 좋은 방법으로 C3P0을 구현하려면 이 답변확인하십시오.

C3P0 :

엔터프라이즈 응용 프로그램의 경우 C3P0이 가장 좋습니다. C3P0은 jdbc3 스펙 및 jdbc2 std 확장에 설명 된대로 연결 및 명령문 풀링을 구현하는 데이터 소스를 포함하여 JNDI 바인딩 가능 데이터 소스를 사용하여 기존 (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 poolsize 는 연결 범위를 정의하여이 응용 프로그램의 최소 및 최대 연결 수를 의미합니다.MaxIdleTime()유휴 연결을 해제 할 시점을 정의합니다.

DBCP :

이 방법도 좋지만 연결 시간 초과 및 연결 실현과 같은 몇 가지 단점이 있습니다. C3P0은 mutithreading 프로젝트를 사용할 때 좋습니다. 우리 프로젝트에서는 DBCP를 사용하여 여러 스레드 실행을 동시에 사용했으며 더 많은 스레드 실행을 사용하면 연결 시간이 초과되었습니다. 그래서 우리는 c3p0 구성으로 갔다. DBCP를 전혀 권장하지 않습니다. 특히 DB가 사라질 때 풀에서 연결을 끊는 문제, DB가 돌아올 때 다시 연결할 수 없음 및 연결 개체를 풀에 동적으로 다시 추가 할 수 없음 (영원히 중단됨) 사후 JDBCconnect I / O 소켓 읽기)

감사 :)


1

내 추천은

히카리> 드루이드> UCP> c3p0> DBCP

그것은 내가 테스트 한 것을 기반으로합니다-20190202, 로컬 테스트 환경 (docker / pool의 4GB mac / mysql minSize = 1, maxSize = 8)에서 hikari는 1024 스레드 x 1024 번 서비스를 제공하여 각 스레드의 평균 시간을 얻습니다. c3p0은 256 스레드 x 1024 배만 제공 할 수 있으며 각 스레드의 평균 시간은 이미 2 천 2 백만 초입니다. (512 스레드 실패).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.