1

我有一个非常简单的测试,它适用于 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 - 从 DataSource 获取 JDBC 连接
12:17:18,809 DEBUG DataSourceUtils:327 - 返回到 DataSource 的 JDBC 连接
12:17:18,809 DEBUG JdbcTemplate:881 - 执行 SQL 批量更新 [从 SOMETABLE 中删除 ROWID = ?]
12:17:18,824 DEBUG JdbcTemplate:570 - 执行准备好的 SQL 语句 [从 SOMETABLE 中删除,其中 ROWID = ?]
12:17:18,824 DEBUG DataSourceUtils:110 - 从 DataSource 获取 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 调试 JdbcTemplate:435 - 执行 SQL 查询 [从 SOMETABLE 中选择 ROWID,其中 rownum <= 100 用于更新跳过锁定]
12:17:18,902 调试 DataSourceUtils:110 - 从数据源获取 JDBC 连接
12:17:18,934 调试 DataSourceUtils :327 - 返回到数据源的 JDBC 连接
12:17:18,934 调试 JdbcTemplate:881 - 执行 SQL 批量更新 [从 SOMETABLE 中删除,其中 ROWID = ?]
12:17:18,934 调试 JdbcTemplate:570 - 执行准备好的 SQL 语句 [从 SOMETABLE 中删除ROWID = ?]
12:17:18,934 DEBUG DataSourceUtils:110 - 从 DataSource 获取 JDBC 连接
12:17:18,934 DEBUG JdbcUtils:362 - JDBC 驱动程序支持批量更新
12:17:18,934 DEBUG DataSourceUtils:327 - 返回到 DataSource 的 JDBC 连接
12:17:18,934 调试 JdbcTemplate:435 - 执行 SQL 查询 [从 SOMETABLE 中选择 ROWID,其中 rownum <= 100 用于更新跳过锁定]
12:17:18,934 调试 DataSourceUtils:110 - 从数据源获取 JDBC 连接
12:17:18,981 调试 DataSourceUtils :327 - 返回到数据源的 JDBC 连接
12:17:18,981 调试 JdbcTemplate:881 - 执行 SQL 批量更新 [从 SOMETABLE 中删除,其中 ROWID = ?]
12:17:18,981 调试 JdbcTemplate:570 - 执行准备好的 SQL 语句 [从 SOMETABLE 中删除ROWID = ?]
12:17:18,981 DEBUG DataSourceUtils:110 - 从 DataSource 获取 JDBC 连接
12:17:18,981 DEBUG JdbcUtils:362 - JDBC 驱动程序支持批量更新
12:17:18,996 DEBUG DataSourceUtils:327 - 返回到 DataSource 的 JDBC 连接
12:17:18,996 调试 JdbcTemplate:435 - 执行 SQL 查询 [从 SOMETABLE 中选择 ROWID,其中 rownum <= 100 用于更新跳过锁定]
12:17:18,996 调试 DataSourceUtils:110 - 从数据源获取 JDBC 连接
12:17:19,012 调试 DataSourceUtils :327 - 返回到数据源的 JDBC 连接
12:17:19,012 调试 JdbcTemplate:881 - 执行 SQL 批量更新 [从 SOMETABLE 中删除,其中 ROWID = ?]
12:17:19,012 调试 JdbcTemplate:570 - 执行准备好的 SQL 语句 [从 SOMETABLE 中删除ROWID = ?]
12:17:19,012 DEBUG DataSourceUtils:110 - 从 DataSource 获取 JDBC 连接
12:17:19,012 DEBUG JdbcUtils:362 - JDBC 驱动程序支持批量更新

4

0 回答 0