2012-05-03 9 views
2

私はテストで正常に動作していますが、今はプロダクションサーバに移動してスイッチを投げる準備ができています。Hibernate/Springトランザクションで古くなったデータベース接続をうまく処理する

アプリケーションが約15分間アイドル状態になると、SpringトランザクションサービスのDB接続が切断されます。あなたがあなたのブラウザでF5をヒットした場合それが起こる後にアプリに来る最初の人は、それが再接続し、うまく動作します、この

org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.exception.JDBCConnectionException: Cannot open connection 
    org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:596) 
    org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:371) 
    org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:335) 
    org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:105) 
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
    org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:621) 
    parity.persistence.DataAccess$$EnhancerByCGLIB$$921ef13.find(<generated>) 
    parity.model.Configuration.getConfiguration(Configuration.java:84) 
    parity.model.Configuration.getSetting(Configuration.java:46) 
    parity.model.Configuration$$FastClassByCGLIB$$8355c3d0.invoke(<generated>) 
    net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) 
    org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:617) 
    parity.model.Configuration$$EnhancerByCGLIB$$5e96e8b9.getSetting(<generated>) 
    parity.model.OnlineStatus.getSiteStatus(OnlineStatus.java:50) 
    parity.action.site.SiteStatusInterceptor.intercept(SiteStatusInterceptor.java:16) 
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248) 
    org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52) 
    org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:498) 
    org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:434) 
root cause 

で迎えています。それは春が最初の要求の行に沿って何かをしているように見えます、eekに行きました、私は死んで、そしてdieingの過程で、データベースに再接続します。確信はないけど。

私はこれを解決する方法を探していましたが、私がc3p0またはweblogicを使用していない限り、誰もが無知です。これを修正する方法はありますか?ここに私の設定ファイルがある

はhibernate.cfg.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 

    <session-factory> 
     <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property> 
     <property name="hibernate.connection.driver_class">org.postgresql.Driver</property> 
     <property name="connection.autocommit">false</property> 
     <property name="show_sql">false</property> 
     <property name="use_sql_comments">false</property> 

    </session-factory> 
</hibernate-configuration> 

トランザクション-service.xmlに:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" 
    xsi:schemaLocation=" 
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx-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/context 
    http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

    <bean id="boardingSessionFactory" 
     class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
     <property name="configLocations"> 
      <list> 
       <value>classpath:hibernate/boarding-hibernate.cfg.xml</value> 
       <value>classpath:boarding-hibernate.cfg.xml</value> 
      </list> 
     </property> 
     <property name="configurationClass"> 
      <value>org.hibernate.cfg.AnnotationConfiguration</value> 
     </property> 
    </bean> 

    <bean id="boardingTransactionManager" 
     class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="boardingSessionFactory" /> 
     <qualifier value="boarding" /> 
    </bean> 

    <tx:advice id="boardingTxAdvice" transaction-manager="boardingTransactionManager"> 
     <tx:attributes> 
      <tx:method name="get*" read-only="true" /> 
      <tx:method name="*" /> 
     </tx:attributes> 
    </tx:advice> 
</beans> 

ノート、私の休止は2つのファイル、グローバル扱うAPIの1を使用していますアプリケーション固有の設定を持つアプリケーション自体に1つ、ここでの目的のためには、グローバルなものがすべて重要です。

答えて

1

Hibernate documentationは言う:

をHibernateのコネクションプールアルゴリズムは、しかし、非常に初歩的な です。これは、本番システムでの使用を目的としたものではなく、 テストのためのもので、 の使用を目的としていません。最高のパフォーマンスを得るにはサードパーティのプールを使用し、安定性は にする必要があります。

したがって、答えは簡単です。実際の接続プールを使用し、接続をテストしてアプリケーションに渡すように設定します。

+0

私は、春のトランザクションサービスが接続プーリングを処理しているという印象を受けました。プーリングを処理する実際の休止状態であることを教えてください。 – scphantm

+0

Springのドキュメントのこのセクションを読む:http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/htmlsingle/spring-framework-reference.html#jdbc-datasource、これです。 Spring内で接続プールを使用してDataSourceをコンフィグレーションしない場合、LocalSessionFactoryBeanは、LocalSessionFactoryBean javadocで説明されているように、Hibernateコンフィグレーションファイルでコンフィグレーションしたものを使用します。http://static.springsource.org/spring/docs /3.1.x/javadoc-api/org/springframework/orm/hibernate3/LocalSessionFactoryBean.html –

+0

ええ、私は本当にテストでこれを見つけてください。ああ、少なくともc3p0の実装は、それほど大きな取引ではありません。 – scphantm

関連する問題