1

Springアプリケーション内に次のように構成されたデータソース(mySQL)があります。

<bean id="dataSource"
        class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName">
            <value>${db.driver}</value>
        </property>
        <property name="url">
            <value>${db.url}</value>
        </property>
        <property name="username">
            <value>${db.username}</value>
        </property>
        <property name="password">
            <value>${db.password}</value>
        </property>
        <property name="defaultAutoCommit">
        <value>${db.con.defaultAutoCommit}</value>
        </property>
        <property name="initialSize" value="12"/>
        <property name="maxActive"  value="10"/>
        <property name="maxIdle" value="2"/>
    </bean>

コード内でjdbcTemplateをフェッチし、以下のようにいくつかの挿入ステートメントを実行します:`

<bean id="doTransaction" class="com.lch.spring.BusinessComponents.DoTransaction">
        <property name="jdbcTemplate"><ref bean="jdbcTemplate"/></property>
        <property name="namedParameterJdbcTemplate"><ref bean="namedParameterJdbcTemplate"/></property>
    </bean>`

挿入ステートメントを実行するコードは次のとおりです。

public int insertLCH_BUSINESS(LCH_BUSINESS lchBusiness) {
    int businessId = -1;
    try {
        log.info("Start Doing Transaction - Business");
        KeyHolder keyHolder = new GeneratedKeyHolder();
        SqlParameterSource parametersSource = new BeanPropertySqlParameterSource(
                lchBusiness);
        getNamedParameterJdbcTemplate().update(
                SQLQueries.INSERTLCH_BUSINESS, parametersSource, keyHolder);
        businessId = keyHolder.getKey().intValue();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return businessId;
}

問題:この挿入コードを数回実行すると、プール枯渇エラーが発生します。

     org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, pool exhausted
 ...............

        Caused by: org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, pool exhausted
            at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:103)
            at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:540)
            at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:111)
            at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:77)
            ... 38 more
        Caused by: java.util.NoSuchElementException: Timeout waiting for idle object
            at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:756)
            at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:95)
            ... 41 more

以下のように、SpringによってJdbc ConnectionがDataSourceに返されると、ログで確認できます。

[http-8080-2] DEBUG [JdbcTemplate.java              : 570 ][Dec 17 2012 00:43:09.531] Executing prepared SQL statement [INSERT INTO `addressinfo` (`address1`,`address2`,`city`,`state`,`country`,`zipcode`,`landmark`) VALUES (?,?,?,?,?,?,?)]
[http-8080-2] DEBUG [DataSourceUtils.java           : 110 ][Dec 17 2012 00:43:09.532] Fetching JDBC Connection from DataSource
[http-8080-2] DEBUG [JdbcTemplate.java              : 860 ][Dec 17 2012 00:43:09.564] SQL update affected 1 rows and returned 1 keys
[http-8080-2] DEBUG [DataSourceUtils.java           : 332 ][Dec 17 2012 00:43:09.565] Returning JDBC Connection to DataSource


運が悪かったので、C3P0とBounreCPを使ってみました。接続を明示的に閉じる必要がありますか?私がドキュメントで読んだように、jdbcTemplateがそれを行うと信じています。
誰かがここで助けることができますか?

ありがとう
Gopiwww.allibilli.com
_

4

0 に答える 0