私はdbcp接続プールで動作し、c3p0(0.9.2)で永久にハングする非常に単純なテストを持っています。
private String query="select ROWID from SOMETABLE " +
" where rownum <= 100 for update skip locked";
private String deleteQuery = "delete from SOMETABLE where ROWID = ?";
public void retrieve() throws Exception {
while (retrieveChunk() > 0){
//do nothing
}
}
@Transactional
private int retrieveChunk(){
final List<Object[]> delPar = new ArrayList<Object[]>(100);
template.query(query, new RowCallbackHandler() {
public void processRow(ResultSet rs) throws SQLException {
String rowid = rs.getString(1);
delPar.add(new String[]{rowid});
}
});
template.batchUpdate(deleteQuery, delPar);
return delPar.size();
}
春のコンテキスト:
<bean id="connPool" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="user" value="**"/>
<property name="password" value="**"/>
<property name="driverClass" value="oracle.jdbc.driver.OracleDriver"/>
<property name="jdbcUrl" value="jdbc:oracle:thin:@****"/>
<property name="initialPoolSize" value="0"/>
<property name="maxPoolSize" value="10"/>
<property name="minPoolSize" value="1"/>
<property name="acquireIncrement" value="1"/>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<constructor-arg>
<ref bean="connPool"/>
</constructor-arg>
</bean>
c3p0構成の何が問題になっていますか?
更新-log4j出力:
12:17:18,449 DEBUG JdbcTemplate:435 - Executing SQL query [select ROWID from SOMETABLE where rownum <= 100 for update skip locked]
12:17:18,465 DEBUG DataSourceUtils:110-データソースからJDBC接続を取得する
12:17:18,809 DEBUG DataSourceUtils:327-データソースにJDBC接続を返す
12:17:18,809 DEBUG JdbcTemplate:881-SQLバッチ更新を実行する=?]
12:17:18,824 DEBUG JdbcTemplate:570-準備されたSQLステートメントの実行[ROWID =?]
12:17:18,824 DEBUG DataSourceUtils:110-データソースからのJDBC接続のフェッチ
12:17:18,887 DEBUG JdbcUtils:362 -JDBCドライバーはバッチ更新をサポートします
12:17:18,902 DEBUG DataSourceUtils:327-データソースへのJDBC接続を返します
12:17:18,902 INFO PlainJdbcTableRetriever:36-JdbcTemplateRetrieverの取得が開始されました
12:17:18,902 DEBUG JdbcTemplate:435-SQLクエリの実行[更新スキップがロックされる場合はrownum <=100のSOMETABLEからROWIDを選択]
12:17:18,902 DEBUG DataSourceUtils:110-データソースからのJDBC接続のフェッチ
12:17:18,934 DEBUG DataSourceUtils :327-データソースにJDBC接続を返す
12:17:18,934 DEBUG JdbcTemplate:881-SQLバッチ更新を実行する[ROWID =?のSOMETABLEから削除]
12:17:18,934 DEBUG JdbcTemplate:570-準備されたSQLステートメントを実行する[SOMETABLEから削除ROWID =?]
12:17:18,934 DEBUG DataSourceUtils:110-データソースからのJDBC接続のフェッチ
12:17:18,934 DEBUG JdbcUtils:362-JDBCドライバーはバッチ更新をサポートします
12:17:18,934 DEBUG DataSourceUtils:327-データソースへのJDBC接続を返します
12:17:18,934 DEBUG JdbcTemplate:435-SQLクエリの実行[更新スキップがロックされる場合はrownum <=100のSOMETABLEからROWIDを選択]
12:17:18,934 DEBUG DataSourceUtils:110-データソースからのJDBC接続のフェッチ12:17:18,981
DEBUG DataSourceUtils :327-データソースへのJDBC接続の戻り
12:17:18,981 DEBUG JdbcTemplate:881-SQLバッチ更新の実行[ROWID =?のSOMETABLEからの削除]
12:17:18,981 DEBUG JdbcTemplate:570-準備されたSQLステートメントの実行[SOMETABLEからの削除ROWID =?]
12:17:18,981 DEBUG DataSourceUtils:110-データソースからのJDBC接続の取得
12:17:18,981 DEBUG JdbcUtils:362-JDBCドライバーはバッチ更新をサポートします
12:17:18,996 DEBUG DataSourceUtils:327-データソースへのJDBC接続を返します
12:17:18,996 DEBUG JdbcTemplate:435-SQLクエリの実行[更新スキップがロックされる場合はrownum <=100のSOMETABLEからROWIDを選択]
12:17:18,996 DEBUG DataSourceUtils:110-データソースからのJDBC接続のフェッチ
12:17:19,012 DEBUG DataSourceUtils :327-データソースにJDBC接続を返す
12:17:19,012 DEBUG JdbcTemplate:881-SQLバッチ更新を実行する[ROWID =?のSOMETABLEから削除]
12:17:19,012 DEBUG JdbcTemplate:570-準備されたSQLステートメントを実行する[SOMETABLEから削除ROWID =?]
12:17:19,012 DEBUG DataSourceUtils:110-データソースからのJDBC接続のフェッチ
12:17:19,012 DEBUG JdbcUtils:362-JDBCドライバーはバッチ更新をサポートします