bigor
Jan 27th, 2007, 06:06 AM
Hi, I am using springframework with hibernate and c3p0 connection pool.
I also use spring transaction api.
The probem is that when application is idle for a long time, (few hours) I get exception from transaction manager that says connection is closed.
Here is the exception:
WARNING: Could not obtain connection metadata
java.sql.SQLException: Connections could not be acquired from the underlying database!
at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtil s.java:104)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool. checkoutPooledConnection(C3P0PooledConnectionPool. java:264)
at com.mchange.v2.c3p0.PoolBackedDataSource.getConnec tion(PoolBackedDataSource.java:94)
at org.hibernate.connection.C3P0ConnectionProvider.ge tConnection(C3P0ConnectionProvider.java:35)
at org.hibernate.cfg.SettingsFactory.buildSettings(Se ttingsFactory.java:72)
at org.hibernate.cfg.Configuration.buildSettings(Conf iguration.java:1463)
at org.hibernate.cfg.Configuration.buildSessionFactor y(Configuration.java:1004)
at org.springframework.orm.hibernate3.LocalSessionFac toryBean.newSessionFactory(LocalSessionFactoryBean .java:825)
at org.springframework.orm.hibernate3.LocalSessionFac toryBean.afterPropertiesSet(LocalSessionFactoryBea n.java:751)
at org.springframework.beans.factory.support.Abstract AutowireCapableBeanFactory.invokeInitMethods(Abstr actAutowireCapableBeanFactory.java:1091)
at org.springframework.beans.factory.support.Abstract AutowireCapableBeanFactory.createBean(AbstractAuto wireCapableBeanFactory.java:396)
at org.springframework.beans.factory.support.Abstract BeanFactory.getBean(AbstractBeanFactory.java:233)
at org.springframework.beans.factory.support.Abstract BeanFactory.getBean(AbstractBeanFactory.java:145)
at org.springframework.beans.factory.support.BeanDefi nitionValueResolver.resolveReference(BeanDefinitio nValueResolver.java:186)
at org.apache.catalina.core.StandardContext.loadOnSta rtup(StandardContext.java:4013)
at org.apache.catalina.core.StandardContext.start(Sta ndardContext.java:4357)
at org.apache.catalina.core.ContainerBase.start(Conta inerBase.java:1083)
at org.apache.catalina.core.StandardHost.start(Standa rdHost.java:789)
at org.apache.catalina.core.ContainerBase.start(Conta inerBase.java:1083)
<cut>
Caused by: com.mchange.v2.resourcepool.CannotAcquireResourceE xception: A ResourcePool could not acquire a resource from its primary factory or source.
at com.mchange.v2.resourcepool.BasicResourcePool.awai tAcquire(BasicResourcePool.java:972)
at com.mchange.v2.resourcepool.BasicResourcePool.chec koutResource(BasicResourcePool.java:208)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool. checkoutPooledConnection(C3P0PooledConnectionPool. java:260)
... 64 more
Now, I am not sure whrere is the problem, probably somewhere in my configuration, so here it is:
SessionFactory conf:
<bean id="sessionFactoryBean" class="org.springframework.orm.hibernate3.LocalSessionFac toryBean">
<property name="mappingResources">
<list>
<value>hr/klopa/hbm/MyClass.hbm.xml</value>
<value>hr/klopa/hbm/Vote.hbm.xml</value>
<value>hr/klopa/hbm/Video.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.c3p0.min_size">5</prop>
<prop key="hibernate.c3p0.max_size">20</prop>
<prop key="hibernate.c3p0.timeout">1800</prop>
<prop key="hibernate.c3p0.max_statements">50</prop>
<prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop>
<prop key="hibernate.connection.url">jdbc:mysql://127.0.0.1/dbName?useUnicode=true&characterEncoding=UTF8</prop>
<prop key="hibernate.connection.username">root</prop>
<prop key="hibernate.connection.password"></prop>
<prop key="hibernate.query.substitutions">true 1, false 0</prop>
</props>
</property>
</bean>
Transaction config:
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransa ctionManager">
<property name="sessionFactory" ref="sessionFactoryBean"/>
</bean>
<bean class="org.springframework.aop.framework.autoproxy.Defaul tAdvisorAutoProxyCreator" />
<bean class="org.springframework.transaction.interceptor.Transa ctionAttributeSourceAdvisor">
<property name="transactionInterceptor" ref="txInterceptor"/>
</bean>
<bean id="txInterceptor" class="org.springframework.transaction.interceptor.Transa ctionInterceptor">
<property name="transactionManager" ref="txManager"/>
<property name="transactionAttributeSource">
<bean class="org.springframework.transaction.annotation.Annotat ionTransactionAttributeSource"/>
</property>
</bean>
DAO bean config:
<bean id="myBean" class="MyDAOlmpl">
<property name="sessionFactory">
<ref bean="sessionFactoryBean" />
</property>
</bean>
and this is DAO method implementation:
public MyPojo getMyPojo(long id)
{
Session session = sessionFactory.getCurrentSession();
MyPojo pojo = (MyPojo) session.createQuery("from MyPojo as o where o.id="+id).uniqueResult();
return pojo;
}
in another app with same configuration it doesn't happen (everythin works OK all the time), and only difference is that this another app doesn't use sessionFactory.getCurrentSession() for obtaining Session, but SessionFactoryUtils.getSession(sessionFactory,true );
and SessionFactoryUtils.releaseSession(session,session Factory); at the end of method.
So, anybody has idea what is the cause of this probelm
I also use spring transaction api.
The probem is that when application is idle for a long time, (few hours) I get exception from transaction manager that says connection is closed.
Here is the exception:
WARNING: Could not obtain connection metadata
java.sql.SQLException: Connections could not be acquired from the underlying database!
at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtil s.java:104)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool. checkoutPooledConnection(C3P0PooledConnectionPool. java:264)
at com.mchange.v2.c3p0.PoolBackedDataSource.getConnec tion(PoolBackedDataSource.java:94)
at org.hibernate.connection.C3P0ConnectionProvider.ge tConnection(C3P0ConnectionProvider.java:35)
at org.hibernate.cfg.SettingsFactory.buildSettings(Se ttingsFactory.java:72)
at org.hibernate.cfg.Configuration.buildSettings(Conf iguration.java:1463)
at org.hibernate.cfg.Configuration.buildSessionFactor y(Configuration.java:1004)
at org.springframework.orm.hibernate3.LocalSessionFac toryBean.newSessionFactory(LocalSessionFactoryBean .java:825)
at org.springframework.orm.hibernate3.LocalSessionFac toryBean.afterPropertiesSet(LocalSessionFactoryBea n.java:751)
at org.springframework.beans.factory.support.Abstract AutowireCapableBeanFactory.invokeInitMethods(Abstr actAutowireCapableBeanFactory.java:1091)
at org.springframework.beans.factory.support.Abstract AutowireCapableBeanFactory.createBean(AbstractAuto wireCapableBeanFactory.java:396)
at org.springframework.beans.factory.support.Abstract BeanFactory.getBean(AbstractBeanFactory.java:233)
at org.springframework.beans.factory.support.Abstract BeanFactory.getBean(AbstractBeanFactory.java:145)
at org.springframework.beans.factory.support.BeanDefi nitionValueResolver.resolveReference(BeanDefinitio nValueResolver.java:186)
at org.apache.catalina.core.StandardContext.loadOnSta rtup(StandardContext.java:4013)
at org.apache.catalina.core.StandardContext.start(Sta ndardContext.java:4357)
at org.apache.catalina.core.ContainerBase.start(Conta inerBase.java:1083)
at org.apache.catalina.core.StandardHost.start(Standa rdHost.java:789)
at org.apache.catalina.core.ContainerBase.start(Conta inerBase.java:1083)
<cut>
Caused by: com.mchange.v2.resourcepool.CannotAcquireResourceE xception: A ResourcePool could not acquire a resource from its primary factory or source.
at com.mchange.v2.resourcepool.BasicResourcePool.awai tAcquire(BasicResourcePool.java:972)
at com.mchange.v2.resourcepool.BasicResourcePool.chec koutResource(BasicResourcePool.java:208)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool. checkoutPooledConnection(C3P0PooledConnectionPool. java:260)
... 64 more
Now, I am not sure whrere is the problem, probably somewhere in my configuration, so here it is:
SessionFactory conf:
<bean id="sessionFactoryBean" class="org.springframework.orm.hibernate3.LocalSessionFac toryBean">
<property name="mappingResources">
<list>
<value>hr/klopa/hbm/MyClass.hbm.xml</value>
<value>hr/klopa/hbm/Vote.hbm.xml</value>
<value>hr/klopa/hbm/Video.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.c3p0.min_size">5</prop>
<prop key="hibernate.c3p0.max_size">20</prop>
<prop key="hibernate.c3p0.timeout">1800</prop>
<prop key="hibernate.c3p0.max_statements">50</prop>
<prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop>
<prop key="hibernate.connection.url">jdbc:mysql://127.0.0.1/dbName?useUnicode=true&characterEncoding=UTF8</prop>
<prop key="hibernate.connection.username">root</prop>
<prop key="hibernate.connection.password"></prop>
<prop key="hibernate.query.substitutions">true 1, false 0</prop>
</props>
</property>
</bean>
Transaction config:
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransa ctionManager">
<property name="sessionFactory" ref="sessionFactoryBean"/>
</bean>
<bean class="org.springframework.aop.framework.autoproxy.Defaul tAdvisorAutoProxyCreator" />
<bean class="org.springframework.transaction.interceptor.Transa ctionAttributeSourceAdvisor">
<property name="transactionInterceptor" ref="txInterceptor"/>
</bean>
<bean id="txInterceptor" class="org.springframework.transaction.interceptor.Transa ctionInterceptor">
<property name="transactionManager" ref="txManager"/>
<property name="transactionAttributeSource">
<bean class="org.springframework.transaction.annotation.Annotat ionTransactionAttributeSource"/>
</property>
</bean>
DAO bean config:
<bean id="myBean" class="MyDAOlmpl">
<property name="sessionFactory">
<ref bean="sessionFactoryBean" />
</property>
</bean>
and this is DAO method implementation:
public MyPojo getMyPojo(long id)
{
Session session = sessionFactory.getCurrentSession();
MyPojo pojo = (MyPojo) session.createQuery("from MyPojo as o where o.id="+id).uniqueResult();
return pojo;
}
in another app with same configuration it doesn't happen (everythin works OK all the time), and only difference is that this another app doesn't use sessionFactory.getCurrentSession() for obtaining Session, but SessionFactoryUtils.getSession(sessionFactory,true );
and SessionFactoryUtils.releaseSession(session,session Factory); at the end of method.
So, anybody has idea what is the cause of this probelm