2011-11-15 2 views
4

데이터베이스 작업을 처리하기 위해 spring 3.0 (jdbcTemplate), Tomcat, MySQL 및 C3p0을 사용하고 있습니다. 나는 jdbctemplate과 simplejdbctemplate을 모두 사용하여 connection, statement, resultsets 등을 생성하고 닫는 작업을 처리 할 것이다. 연결 풀링을 위해 C3p0을 사용하고 있지만 연결은 열려 있고 결국에는 응용 프로그램에 연결이 끊어 질 것이다. 나는 또한 스프링에 의해 제공 TransactionManagement을 사용하고데이터베이스 연결이 닫히지 않습니다.

<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> 

- 여기에의 구성입니다 : 여기

내 데이터 소스의 구성입니다 여기

<!-- 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" 

미리 감사드립니다. Keith

+0

JDBC 템플릿이 없으면 수동으로 데이터 소스에 액세스하지 않습니까? – axtavt

+1

연결이 풀에있을 때 여전히 열려있을 수 있습니다. 가장 먼저해야 할 일은 maxPoolSize가 데이터베이스에서 허용하는 동시 연결 수보다 크지 않도록하는 것입니다. – mrembisz

+0

모든 데이터베이스 활동은 스프링 보안 (로그인 할 때 사용자 유효성 검사를 처리하고 연결이 끊어지지 않도록 처리합니다)을 제외하고 jdbc 템플릿을 사용하여 수행됩니다. 이러한 연결이 제대로 처리되고 있다고 가정합니다. 언뜻보기에 나의 구성은 좋은 것 같습니다. –

답변

0

나는 axtavt에 동의합니다. 비슷한 상황에 있었고 연결을 수동으로 여는 몇 곳이 있지만 닫히지는 않았습니다 (iSeries 용 저장 프로 시저 호출). 그런 종류의 반점이 있는지 확인하십시오.