2012-04-02 75 views
3

我已經將Spring應用程序配置爲使用Hibernate作爲JPA提供程序。應用上下文看起來像這樣:無法使c3p0與Spring/Hibernate/JPA一起工作

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:util="http://www.springframework.org/schema/util" 
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd 
     http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd 
     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd 
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> 

    <context:component-scan base-package="com.med.persistence.magic.*"/> 
    <aop:aspectj-autoproxy /> 

    <!-- Load DB config file --> 
    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
     <property name="ignoreResourceNotFound" value="true" /> 
     <property name="ignoreUnresolvablePlaceholders" value="true" /> 
     <property name="searchSystemEnvironment" value="true" /> 
     <property name="systemPropertiesMode"> 
      <util:constant 
       static-field="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer.SYSTEM_PROPERTIES_MODE_OVERRIDE" /> 
     </property> 
     <property name="locations"> 
      <list> 
       <value>classpath:dev.db.properties</value> 
<!--    <value>file:///usr/share/tomcat6/conf/hx_db.conf</value>--> 
      </list> 
     </property> 
    </bean> 

    <tx:annotation-driven transaction-manager="transactionManager"/> 

    <bean id="transactionManager" class = "org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactory"/> 
    </bean> 

    <bean id="jpaAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
     <property name="showSql" value="true" /> 
    </bean> 

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="persistenceUnitName" value="MagicPersistenceUnit" /> 
     <property name="jpaVendorAdapter" ref="jpaAdapter" /> 
     <property name="jpaDialect"> 
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/> 
     </property> 
     <property name="jpaProperties"> 
      <props> 
       <prop key="hibernate.hbm2ddl.auto">validate</prop> 
       <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop> 
<!--    <prop key="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</prop>--> 
<!--    <prop key="hibernate.c3p0.maxSize">25</prop>--> 
<!--    <prop key="hibernate.c3p0.minSize">1</prop>--> 
<!--    <prop key="hibernate.c3p0.acquireIncrement">1</prop>--> 
<!--    <prop key="hibernate.c3p0.idleTestPeriod">300</prop>--> 
<!--    <prop key="hibernate.c3p0.maxStatements">0</prop>--> 
<!--    <prop key="hibernate.c3p0.timeout">300</prop>--> 
<!--    <prop key="hibernate.c3p0.checkoutTimeout">0</prop>--> 
<!--    <prop key="hibernate.c3p0.preferredTestQuery">SELECT * FROM dual</prop>--> 
      </props> 
     </property> 
    </bean> 

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="${JDBC.Driver}"/> 
     <property name="url" value="${JDBC.ConnectionURL}"/> 
     <property name="username" value="${JDBC.Username}"/> 
     <property name="password" value="${JDBC.Password}"/> 
    </bean> 

</beans> 

當運行一個簡單的單元測試,需要花費大約150秒來連接和驗證數據庫表。但是,當我取消註釋c3p0屬性時,約90秒後出現以下異常。我想我需要讓更多時間打開連接,但我無法弄清楚如何做到這一點。

org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: Cannot open connection 
     at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:382) 
     at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:371) 
     at org.springframework.test.context.transaction.TransactionalTestExecutionListener$TransactionContext.startTransaction(TransactionalTestExecutionListener.java:507) 
     at org.springframework.test.context.transaction.TransactionalTestExecutionListener.startNewTransaction(TransactionalTestExecutionListener.java:269) 
     at org.springframework.test.context.transaction.TransactionalTestExecutionListener.beforeTestMethod(TransactionalTestExecutionListener.java:162) 
     at org.springframework.test.context.TestContextManager.beforeTestMethod(TestContextManager.java:374) 
     at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:73) 
     at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:82) 
     at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72) 
     at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:240) 
     at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47) 
     at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) 
     at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) 
     at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) 
     at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) 
     at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) 
     at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 
     at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) 
     at org.junit.runners.ParentRunner.run(ParentRunner.java:300) 
     at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:180) 
     at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:35) 
     at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:115) 
     at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:97) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
     at java.lang.reflect.Method.invoke(Method.java:597) 
     at org.apache.maven.surefire.booter.ProviderFactory$ClassLoaderProxy.invoke(ProviderFactory.java:103) 
     at $Proxy0.invoke(Unknown Source) 
     at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:150) 
     at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcess(SurefireStarter.java:91) 
     at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:69) 
Caused by: javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: Cannot open connection 
     at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1235) 
     at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1168) 
     at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:1245) 
     at org.hibernate.ejb.TransactionImpl.begin(TransactionImpl.java:63) 
     at org.springframework.orm.jpa.DefaultJpaDialect.beginTransaction(DefaultJpaDialect.java:70) 
     at org.springframework.orm.jpa.vendor.HibernateJpaDialect.beginTransaction(HibernateJpaDialect.java:55) 
     at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:332) 
     ... 31 more 
Caused by: org.hibernate.exception.GenericJDBCException: Cannot open connection 
     at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:140) 
     at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:128) 
     at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) 
     at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:52) 
     at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:449) 
     at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167) 
     at org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:142) 
     at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:85) 
     at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1463) 
     at org.hibernate.ejb.TransactionImpl.begin(TransactionImpl.java:60) 
     ... 34 more 
Caused by: java.sql.SQLException: Connections could not be acquired from the underlying database! 
     at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:106) 
     at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:529) 
     at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:128) 
     at org.hibernate.connection.C3P0ConnectionProvider.getConnection(C3P0ConnectionProvider.java:78) 
     at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446) 
     ... 39 more 
Caused by: com.mchange.v2.resourcepool.CannotAcquireResourceException: A ResourcePool could not acquire a resource from its primary factory or source. 
     at com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1319) 
     at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:557) 
     at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:477) 
     at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:525) 
     ... 42 more 
+0

http://stackoverflow.com/questions/3465872 – 2012-04-02 19:54:48

+0

我已經通過的大多數人看,他們並沒有真正的幫助。其中大部分涉及陳舊的連接和MySql,我的問題是從Oracle獲得全新的連接(在應用程序啓動時)。此外,這可以很好地關閉c3p0,但一旦啓用它,應用程序將不再啓動。 – Greg 2012-04-02 20:10:00

回答

5

我想通了。我最終打開了log4j,並且看到一個NullPointerException異常從JDBC驅動程序中傳出......這從來沒有被拋到堆棧中,導致我之前看到的異常,所以沒有任何地方出現根本原因的蹤跡。我需要指定一個像這樣的JPA屬性裏面的連接參數:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="persistenceUnitName" value="MagicPersistenceUnit" /> 
    <property name="jpaVendorAdapter" ref="jpaAdapter" /> 
    <property name="jpaDialect"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/> 
    </property> 
    <property name="jpaProperties"> 
     <props> 
      <prop key="hibernate.hbm2ddl.auto">validate</prop> 
      <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop> 
      <prop key="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</prop> 
      <prop key="hibernate.connection.driver_class">${JDBC.Driver}</prop> 
      <prop key="hibernate.connection.url">${JDBC.ConnectionURL}</prop> 
      <prop key="hibernate.connection.username">${JDBC.Username}</prop> 
      <prop key="hibernate.connection.password">${JDBC.Password}</prop> 
      <prop key="hibernate.c3p0.maxSize">1</prop> 
      <prop key="hibernate.c3p0.minSize">1</prop> 
      <prop key="hibernate.c3p0.acquireIncrement">1</prop> 
      <prop key="hibernate.c3p0.idleTestPeriod">300</prop> 
      <prop key="hibernate.c3p0.maxStatements">0</prop> 
      <prop key="hibernate.c3p0.timeout">1800</prop> 
      <prop key="hibernate.c3p0.checkoutTimeout">0</prop> 
      <prop key="hibernate.c3p0.preferredTestQuery">SELECT * FROM dual</prop> 
     </props> 
    </property> 
</bean> 

我不知道爲什麼它不是從我給了EntityManager的數據源撿的參數了。

+0

我不是100%肯定,但我想這涉及到3CP0 [休眠專用票據(http://www.mchange.com/projects/c3p0/index.html#hibernate-specific),號稱*」 Hibernate的C3P0ConnectionProvider明確規定7個C3P0配置屬性,基於Hibernate配置,覆蓋,您可以在c3p0.properties文件中設置任何配置。「* – Arjan 2013-01-08 12:46:12

+0

(其中,順便說一下,使用稍有不同的屬性名稱。) – Arjan 2013-01-08 12:53:39

相關問題