2012-03-22 22 views
6

Tengo a Utilizando c3p0 0.9.1.2, hibernate 3.2.1.ga y spring 2.5.5. El problema es que la conexión de la base de datos no se cierra sola. Estos son los registros:c3p0 Connection Pool no cierra las conexiones

[22 mars 2012 12: 29: 56.091] DEBUG com.mchange.v2.resourcepool.BasicResourcePool [ "http-abr-8080" -exec-4] adquieren prueba - piscina es ya está al máximo. [gestionado: 20; max: 20] [22 de marzo de 2012 12: 29: 56,091] DEBUG com.mchange.v2.resourcepool.BasicResourcePool ["http-apr-8080" -exec-4] awaitAvailable(): com.mchange.v2.c3p0. [email protected] [22 de marzo de 2012 12: 29: 56,091] DEBUG com.mchange.v2.resourcepool.BasicResourcePool ["http-apr-8080" -exec-4] trace com.mchange.v2.resourcepool.BasicResourcePool @ 6b0524 [gestionados: 20, sin uso: 0, excluido: 0] (por ejemplo [email protected])

Así es la configuración de fuente de datos:

<!-- Local DataSource that works in any environment --> 
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> 
    <property name="driverClass" value="${database.driver}"/> 
    <property name="jdbcUrl" value="${database.url}"/> 
    <property name="user" value="${database.user}"/> 
    <property name="password" value="${database.password}"/> 
    <!--<property name="connectionCustomizerClassName" value="org.xxx.webapp.common.persistence.WatchConnectionCustomizer"/>--> 
    <property name="maxStatements" value="500"/> 
    <property name="maxIdleTime" value="1800"/> 
    <property name="maxPoolSize" value="100"/> 
    <property name="minPoolSize" value="2"/> 
    <property name="initialPoolSize" value="2"/> 
    <property name="acquireIncrement" value="3"/> 
    <property name="idleConnectionTestPeriod" value="3000"/> 
</bean> 



<bean id="sessionFactory" 
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" > 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">${hibernate.dialect}</prop> 
      <prop key="hibernate.show_sql">false</prop> 
      <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop> 
      <prop key="hibernate.connection.autocommit">${hibernate.connection.autocommit}</prop> 
      <prop key="hibernate.transaction.auto_close_session">${hibernate.transaction.auto_close_session}</prop> 
      <prop key="hibernate.connection.release_mode">${hibernate.connection.release_mode}</prop> 
      <prop key="hibernate.bytecode.use_reflection_optimizer">${hibernate.bytecode.use_reflection_optimizer}</prop> 
      <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop> 
      <prop key="hibernate.cache.use_query_cache">true</prop> 
      <prop key="hibernate.cache.use_second_level_cache">true</prop> 
      <prop key="hibernate.cache.region.factory_class">net.sf.ehcache.hibernate.EhCacheRegionFactory</prop> 
     </props> 
    </property> 

<property name="annotatedClasses"> 
    <list> 
     ... 
    </list> 
    </property> 

    <property name="dataSource"> 
    <ref bean="dataSource" /> 
    </property> 


</bean> 

<bean id="transactionManager" 
    class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory"> 
     <ref bean="sessionFactory" /> 
    </property> 
</bean> 

Aquí está nuestro Dao genérica

public class GenericDAO<T, PK extends Serializable> extends HibernateDaoSupport 
    implements IGenericDAO<T, PK> { 

private Class<T> clazz; 
private Logger logger = Logger.getLogger(GenericDAO.class); 
private static Session session; 

public GenericDAO(Class<T> clazz) { 
    this.clazz = clazz; 
} 

public void refresh(T instanceToRefresh) throws DataAccessException { 
    getHibernateTemplate().refresh(instanceToRefresh); 
    //getCurrentSession().refresh(instanceToRefresh); 
} 

public void saveOrUpdate(T instanceToSaveOrUpdate) 
     throws DataAccessException { 
    //getCurrentSession().saveOrUpdate(instanceToSaveOrUpdate); 
    getHibernateTemplate().saveOrUpdate(instanceToSaveOrUpdate); 
} 

public void persist(T instanceToPersist) throws DataAccessException { 
    getHibernateTemplate().persist(instanceToPersist); 
    //getCurrentSession().persist(instanceToPersist); 
} 

@SuppressWarnings("unchecked") 
public T merge(T instanceToMerge) throws DataAccessException { 
    T instanceMerged = (T) getHibernateTemplate().merge(instanceToMerge); 
    //T instanceMerged = (T) getCurrentSession().merge(instanceToMerge); 
    return instanceMerged; 
} 

@SuppressWarnings("unchecked") 
public PK save(T newInstance) throws DataAccessException { 
    return (PK) getHibernateTemplate().save(newInstance); 
    //return (PK) getCurrentSession().save(newInstance); 
} 

public void delete(T persistentObject) throws DataAccessException { 
    getHibernateTemplate().delete(persistentObject); 
    //getCurrentSession().delete(persistentObject); 
} 

@SuppressWarnings("unchecked") 
public T load(PK id) { 
    return (T) getHibernateTemplate().get(clazz, id); 
    //return (T) getCurrentSession().get(clazz, id); 
} 

public void update(T transientObject) throws DataAccessException { 
    //getCurrentSession().update(transientObject); 
    getHibernateTemplate().update(transientObject); 
} 

@SuppressWarnings("unchecked") 
public List<T> loadAll() throws DataAccessException { 
    //Session session = this.getCurrentSession(); 
    //return session.createQuery("from " + clazz.getName()).list(); 
    return getHibernateTemplate().loadAll(clazz); 
} 
} 

Gracias de antemano.

+1

muéstranos la declaración de tus DAO en el contexto de la aplicación y el código java. – ManuPK

+0

He agregado nuestro genericDAO – Oualid

Respuesta

11

Normalmente, la conexión se cierra automáticamente por hibernación. Sin embargo, algunas cosas a tener en cuenta:

  • transacciones de larga ejecución pueden ocupar una conexión
  • gestión de sesiones inadecuada puede significar no cierra la sesión, que a su vez significa que la conexión se mantiene en uso

La configuración típica cuando se utiliza la primavera es anotar sus métodos de servicio con @Transactional. De esa manera, Spring administrará sus transacciones y sesiones.

+2

Muchas gracias, su respuesta realmente me ha ayudado, agregué @Transactional a todos los métodos de servicio, el problema fue resuelto. – Oualid

+0

@Bozho: te refieres a 'gestión de sesión incorrecta '. ¿Puedes dar un ejemplo de gestión de sesión adecuada en el contexto de Spring/Hibernate? – spier

+0

abriendo y cerrando una sesión por solicitud (o por conversación), en lugar de olvidar cerrarla – Bozho

0

Hemos utilizado la siguiente línea en el archivo dispatcher-servlet.xml y las conexiones físicas de la base de datos se están cerrando.

<tx:annotation-driven proxy-target-class="true" transaction-manager="transactionManager"/> 
Cuestiones relacionadas