Java / JDBC에 사용 가능한 최상의 연결 풀링 라이브러리는 무엇입니까?
두 가지 주요 후보 (무료 / 오픈 소스)를 고려하고 있습니다.
- 아파치 DBCP- http : //commons.apache.org/dbcp/
- C3P0- http: //sourceforge.net/projects/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 풀을 사용하는 것입니다.
또 다른 대안은 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"에 대한 내용도 참조하십시오.
불행히도 그들은 모두 구식입니다. DBCP는 최근 약간 업데이트되었으며 다른 두 개는 2-3 세이며 많은 버그가 있습니다.
제대로 구성된 경우 Dbcp는 프로덕션 준비 상태입니다.
예를 들어 하루에 350000 방문자의 상거래 웹 사이트와 200 개의 연결 풀로 사용됩니다.
올바르게 구성하면 시간 초과가 매우 잘 처리됩니다.
버전 2가 진행 중이며 많은 생산 문제가 해결되어 신뢰할 수있는 배경이 있습니다.
우리는 배치 서버 솔루션에 사용하며 데이터베이스의 수백만 줄에서 작동하는 수백 개의 배치를 실행했습니다.
tomcat jdbc pool에서 실행 한 성능 테스트는 cp30보다 성능이 우수함을 보여줍니다.
사용하기 쉬운 좋은 대안은 DBPool 입니다.
"시간 기반 만료, 명령문 캐싱, 연결 검증 및 풀 관리자를 사용한 쉬운 구성을 지원하는 Java 기반 데이터베이스 연결 풀링 유틸리티입니다."
가장 좋은 방법으로 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 소켓 읽기)
감사 :)