SQL Server 데이터베이스와 너무 많이 통신하는 Java Webapp가 있습니다. 이 DB에 대한 연결을 효율적으로 관리하는 방법을 결정하고 싶습니다. 마음에 드는 첫 번째 옵션은 연결 풀링 타사를 사용하는 것입니다. 내가 C3P0와 DBCP를 선택하고 다음과 같이 이러한 접근 방식을 비교하기 위해 몇 가지 테스트 케이스를 준비 :SQL Server 용 JDBC 연결 풀링 : DBCP와 C3P0 및 풀링 없음
없음 풀링 :
public static void main(String[] args) {
long startTime=System.currentTimeMillis();
try {
for (int i = 0; i < 100; i++) {
Connection conn = ConnectionManager_SQL.getInstance().getConnection();
String query = "SELECT * FROM MyTable;";
PreparedStatement prest = conn.prepareStatement(query);
ResultSet rs = prest.executeQuery();
if (rs.next()) {
System.out.println(i + ": " + rs.getString("CorpName"));
}
conn.close();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Finished in: "+(System.currentTimeMillis()-startTime)+" milli secs");
}
DBCP :
public static void main(String[] args) {
long startTime=System.currentTimeMillis();
try {
for (int i = 0; i < 100; i++) {
Connection conn = ConnectionManager_SQL_DBCP.getInstance().getConnection();
String query = "SELECT * FROM MyTable;";
PreparedStatement prest = conn.prepareStatement(query);
ResultSet rs = prest.executeQuery();
if (rs.next()) {
System.out.println(i + ": " + rs.getString("CorpName"));
}
conn.close();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Finished in: "+(System.currentTimeMillis()-startTime)+" milli secs");
}
C3P0 :
public static void main(String[] args) {
long startTime=System.currentTimeMillis();
try {
for (int i = 0; i < 100; i++) {
Connection conn = ConnectionManager_SQL_C3P0.getInstance().getConnection();
String query = "SELECT * FROM MyTable;";
PreparedStatement prest = conn.prepareStatement(query);
ResultSet rs = prest.executeQuery();
if (rs.next()) {
System.out.println(i + ": " + rs.getString("CorpName"));
}
conn.close();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Finished in: "+(System.currentTimeMillis()-startTime)+" milli secs");
}
그리고 결과는 다음과 같습니다.
0 1,236,489,146,624,418,196,406,463,210Max Pool size for c3p0 and dbcp=100
c3p0: 4937 milli secs
dbcp: 4798 milli secs
No Pooling: 2660 milli secs
하나는 이러한 테스트 케이스의 결과에 영향을 미칠 수있는 라이브러리를 풀링의 초기화 및 시작 시간을 말할 수 __. 루프에서 큰 숫자로 반복했으며 결과는 거의 같습니다.
놀랍게도 풀링없는 방법은 연결 풀링 방법보다 훨씬 빠릅니다. 우리가 물리적으로 연결을 닫을 때 나는 생각하지만, 새로운 연결을 얻는 것은 더 많은 시간을 소비해야합니다.
여기에 무슨 일이 발생합니까?
EDIT_01 : C3P0와 DBCP 구성
C3P0 :
cpds.setMinPoolSize(5);
cpds.setAcquireIncrement(5);
cpds.setMaxPoolSize(100);
cpds.setMaxStatements(1000);
DBCP :
basicDataSource.setMinIdle(5);
basicDataSource.setMaxIdle(30);
basicDataSource.setMaxTotal(100);
basicDataSource.setMaxOpenPreparedStatements(180);
구성의 나머지는 기본값으로 남아 있습니다. 모든 연결은 localhost의 DB에 대해 설정된다는 것에 주목해야합니다.
한 번에 하나의 연결 만 사용하므로 연결 풀의 유용성이 줄어 듭니다. 또한 연결 풀 구성을 표시하지 않았습니다 (예 : 제한 시간, 최소/최대 크기, 로컬 호스트 연결 또는 원격 서버 등). –
@MarkRotteveel Edit_01을 확인하십시오. –