2012-04-02 18 views
3

JPAプロバイダとしてHibernateを使用するようSpringアプリケーションを構成しました。アプリケーションコンテキストは次のようになります。Spring/Hibernate/JPAで動作するc3p0を取得できません

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

+0

私はすでにそれらのほとんどを見てきましたが、本当に助けにはなりませんでした。古いバージョンの接続とMySqlを扱うものが多く、Oracleからの新しい接続(アプリケーションの起動時)が得られます。また、これはc3p0をオフにしても正常に動作しますが、一度有効にするとアプリケーションが起動しなくなります。 – Greg

答えて

5

私はこれを理解しました。私はlog4jをオンにしてしまい、JDBCドライバからNullPointerExceptionが出てきたのを見ました...これは、私が以前に見ていた例外にスタックを投げ込まれることはありませんでした。私はそうのような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 [Hibernate-specific notes](http://www.mchange.com/projects/c3p0/index.html#hibernate-specific) HibernateのC3P0ConnectionProviderは、c3p0.propertiesファイルに設定されている可能性のある設定を上書きする、休止状態の設定に基づいて、7つのc3p0設定プロパティを明示的に設定します。 "* – Arjan

+0

(ちなみに少し異なるプロパティ名を使用します) – Arjan

関連する問題