2012-07-02 3 views
1

나는 봄 3.05 + MySQL을 사용하고, 프로그램을 실행 한 후, 나는 로그에서 예외를 많이 발견 :이 MySQL의에 의해 발생 알고이 dbcp 예외는 중요합니까?

books.log.6- 09:24:45 Closing JPA EntityManager -org.springframework.orm.jpa.EntityManagerFactoryUtils 
books.log.6- 09:24:45 about to close PreparedStatement (open PreparedStatements: 1, globally: 1) -org.hibernate.jdbc.AbstractBatcher 
books.log.6- 09:24:45 aggressively releasing JDBC connection -org.hibernate.jdbc.ConnectionManager 
books.log.6- 09:24:45 releasing JDBC connection [ (open PreparedStatements: 0, globally: 0) (open ResultSets: 0, globally: 0)] -org.hibernate.jdbc.ConnectionManager 
books.log.6- 09:24:45 Cannot release connection [???] -org.hibernate.util.JDBCExceptionReporter 
books.log.6: java.sql.SQLException: Already closed. 
books.log.6- at org.apache.commons.dbcp.PoolableConnection.close(PoolableConnection.java:114) 
books.log.6- at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.close(PoolingDataSource.java:191) 
books.log.6- at org.hibernate.connection.DatasourceConnectionProvider.closeConnection(DatasourceConnectionProvider.java:97) 
books.log.6- at org.hibernate.jdbc.ConnectionManager.closeConnection(ConnectionManager.java:474) 
books.log.6- at org.hibernate.jdbc.ConnectionManager.aggressiveRelease(ConnectionManager.java:429) 
books.log.6- at org.hibernate.jdbc.ConnectionManager.afterStatement(ConnectionManager.java:304) 
books.log.6- at org.hibernate.jdbc.AbstractBatcher.closePreparedStatement(AbstractBatcher.java:572) 
books.log.6- at org.hibernate.jdbc.AbstractBatcher.closeStatement(AbstractBatcher.java:291) 
books.log.6- at org.hibernate.jdbc.AbstractBatcher.closeQueryStatement(AbstractBatcher.java:307) 
books.log.6- at org.hibernate.jdbc.AbstractBatcher.closeQueryStatement(AbstractBatcher.java:234) 
books.log.6- at org.hibernate.loader.Loader.getResultSet(Loader.java:1967) 
books.log.6- at org.hibernate.loader.Loader.doQuery(Loader.java:802) 
books.log.6- at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274) 
books.log.6- at org.hibernate.loader.Loader.doList(Loader.java:2533) 
books.log.6- at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276) 
books.log.6- at org.hibernate.loader.Loader.list(Loader.java:2271) 
books.log.6- at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:452) 
books.log.6- at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:363) 
books.log.6- at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196) 
books.log.6- at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1268) 
books.log.6- at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102) 
books.log.6- at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:246) 
books.log.6- at com.tekelec.books.domain.BookInfo.findAllBooks_aroundBody4(BookInfo.java:238) 
books.log.6- at com.tekelec.books.domain.BookInfo.findAllBooks(BookInfo.java:1) 
books.log.6- at com.tekelec.books.web.BooksController.getBooks(BooksController.java:37) 
books.log.6- at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
books.log.6- at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
books.log.6- at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
books.log.6- at java.lang.reflect.Method.invoke(Method.java:616) 
books.log.6- at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:212) 

을 - 유휴 시간 후에는 initialy 폐쇄 연결은 여전히 ​​dbcp 측에서 생생하게 보입니다. MySQL은 여러 데이터베이스 인스턴스를 제공하고 있으므로 응용 프로그램 코드 측면에서 변경해야합니다.

제 질문은 예외입니까? 실패 후 JPA는 연결을 재 시도합니까?

감사합니다.

답변

0

DataSource에 유효성 확인 쿼리 (select 1)를 추가해야합니다. 봄과

<Resource name="jdbc/cfmediaarchive" type="javax.sql.DataSource" 
    driverClassName="com.mysql.jdbc.Driver" 
    url="jdbc:mysql://localhost:3306/mydb?useUnicode=true&amp;characterEncoding=utf8" 

    auth="Container" username="username" password="password" 

    maxIdle="3" maxActive="15" maxWait="10000" logAbandoned="true" removeAbandoned="true" removeAbandonedTimeout="60" 

    validationQuery="select 1" /> 

구성 :

spring.xml

<bean id="dataSource" 
    class="org.apache.commons.dbcp.BasicDataSource" 
    destroy-method="close"> 
    <property name="driverClassName" value="${driverClassName}" /> 
    <property name="url" value="${url}" /> 
    <property name="username" value="${username}" /> 
    <property name="password" value="${password}" /> 
    <property name="validationQuery" value="select 1"/> 
</bean> 

    <bean 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" 
    id="entityManagerFactory"> 
    <property name="persistenceUnitName" value="persistenceUnit" /> 
    <property name="dataSource" ref="dataSource" /> 
    <!-- this is important to connect JPA and JdbcTemplate transaction control --> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
      <property name="showSql" value="false" /> 
     </bean> 
    </property> 
</bean> 

의 persistence.xml 당신은 아마 근본 원인을 지적

<persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <properties> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" /> 
     <property name="hibernate.hbm2ddl.auto" value="validate" /> 
     <property name="hibernate.connection.charSet" value="UTF-8" /> 
     <property name="hibernate.show_sql" value="false" /> 

    </properties> 
</persistence-unit> 
+0

하지만, 난 봄 + JPA를 사용하므로 요처럼 데이터 소스 구성이 없습니다. 예를 들어. 사실 그것은 persistence.xml과 database.properties를 사용합니다. 어떻게하면 persistence.xml 또는 database.properties에 유효성 검사 절을 추가해야합니까? –

+0

나는 조금 봤 거든 persistence.xml에 대한 유효성 검사 속성을 찾지 못했습니다. 어쨌든 Spring을 사용하면 JPA를 사용하더라도 Sping (xml) 내에서 데이터 소스를 구성 할 수 있습니다. – Ralph