首页 文章

数据库连接未关闭

提问于
浏览
4

我正在使用spring 3.0(jdbcTemplate),Tomcat,MySQL和C3p0来处理我的数据库活动 . 我正在使用jdbctemplate和simplejdbctemplate,它将负责创建和关闭连接,语句,结果集等 . 我正在使用C3p0进行连接池,但是连接仍然保持打开状态,最终应用程序将耗尽连接 .

这是我的数据源的配置:

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close" >
        <property name="driverClass" value="${jdbc.driverClassName}"></property>
        <property name="jdbcUrl" value="${jdbc.url}"></property>
        <property name="user" value="${jdbc.username}"></property>
        <property name="password" value="${jdbc.password}"></property>
        <property name="initialPoolSize" value="5"></property>
        <property name="maxPoolSize" value="100"/>
        <property name="minPoolSize" value="5"/>
        <property name="maxIdleTime" value="30"/>
        <property name="maxIdleTimeExcessConnections" value="30"/>
        <property name="maxConnectionAge" value="30"/>
        <property name="checkoutTimeout" value="100"/>
        <property name="maxStatements" value="50"></property>
        <property name="automaticTestTable" value="C3P0_TEST_TABLE"></property>
        <property name="testConnectionOnCheckin" value="true"></property>
        <property name="idleConnectionTestPeriod" value="30"></property> 
    </bean>

我也使用spring提供的TransactionManagement - 这是配置:

<!-- enable the configuration of transactional behavior based on annotations -->
   <tx:annotation-driven transaction-manager="txManager"/>

   <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
   </bean>

以下是数据源配置的其余部分:

<bean id="simpleJdbcTemplate" class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate">
        <constructor-arg><ref bean="dataSource"/></constructor-arg>
   </bean>
   <bean id="userDAO" class="com.Test.dao.UserDAOImpl">
        <property name="jdbcTemplate"><ref bean="jdbcTemplate"/></property>
   </bean>

最后,这是一种将记录更新到数据库的方法:

@Transactional(readOnly=false)
public void updateBenchMarkCumulative(List<BenchMarkCumulative> bmCumulativeList)
{
    List<Object[]> parameters = new ArrayList<Object[]>();
    for(BenchMarkCumulative bmCumulative : bmCumulativeList)
    {
        parameters.add(new Object[]{bmCumulative.getCumulativeAmt(), bmCumulative.getPkBenchMarkCumulative()});
    }
    this.simpleJdbcTemplate.batchUpdate(UPDATE_BENCHMARK_CUMULATIVE, parameters);
}

我的配置中是否存在我做错的事情,或者我是否遗漏了需要添加到配置或编码中的内容?

这是抛出的异常:

INFO [http-8080-1] (AbstractPoolBackedDataSource.java510) - Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ java.beans.IntrospectionException: java.lang.reflect.InvocationTargetException [numThreadsAwaitingCheckoutDefaultUser] ]


org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establishment of connection,  message from server: "Too many connections"

先感谢您 . 基思

1 回答

  • 0

    我同意axtavt . 我处于类似的情况,有几个地方我手动打开连接但没有关闭它们(iSeries的存储过程调用) . 请确认您是否有这种斑点 .

相关问题