데이터베이스 작업을 처리하기 위해 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
JDBC 템플릿이 없으면 수동으로 데이터 소스에 액세스하지 않습니까? – axtavt
연결이 풀에있을 때 여전히 열려있을 수 있습니다. 가장 먼저해야 할 일은 maxPoolSize가 데이터베이스에서 허용하는 동시 연결 수보다 크지 않도록하는 것입니다. – mrembisz
모든 데이터베이스 활동은 스프링 보안 (로그인 할 때 사용자 유효성 검사를 처리하고 연결이 끊어지지 않도록 처리합니다)을 제외하고 jdbc 템플릿을 사용하여 수행됩니다. 이러한 연결이 제대로 처리되고 있다고 가정합니다. 언뜻보기에 나의 구성은 좋은 것 같습니다. –