2012-03-22 14 views
6

Ho un Utilizzo di c3p0 0.9.1.2, ibernazione 3.2.1.ga e spring 2.5.5. Il problema è che la connessione al database non si chiude. Qui ci sono i registri:c3p0 Connection Pool non chiude le connessioni

[22 marzo 2012 12: 29: 56.091] DEBUG com.mchange.v2.resourcepool.BasicResourcePool [ "http-mar-8080" exec-4] acquisire prova - piscina è già al massimo. [gestito: 20; max: 20] [22 mars 2012 12: 29: 56,091] DEBUG com.mchange.v2.resourcepool.BasicResourcePool ["http-apr-8080" -exec-4] awaitAvailable(): com.mchange.v2.c3p0. [email protected] [22 mars 2012 12: 29: 56,091] DEBUG com.mchange.v2.resourcepool.BasicResourcePool ["http-apr-8080" -exec-4] trace com.mchange.v2.resourcepool.BasicResourcePool @ 6b0524 [gestito: 20, inutilizzato: 0, escluso: 0] (ad es [email protected])

Ecco la configurazione origine dati:

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

Ecco la nostra Dao generico

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); 
} 
} 

Grazie in anticipo.

+1

Mostraci la dichiarazione dei tuoi DAO nel contesto dell'appicazione e nel codice java. – ManuPK

+0

Ho aggiunto il nostro genericoDAO – Oualid

risposta

11

Normalmente, la connessione viene automaticamente chiusa dalla modalità di sospensione. Tuttavia, un paio di cose da notare:

  • transazioni a lungo in esecuzione possono occupare una connessione
  • gestione delle sessioni non corretta può significare non si chiude la sessione, che a sua volta significa che la connessione rimane in uso

L'impostazione tipica quando si utilizza la molla è di annotare i metodi di servizio con @Transactional. In questo modo la primavera gestirà le tue transazioni e sessioni.

+2

Grazie mille, la tua risposta mi ha davvero aiutato, ho aggiunto @Transactional a tutti i metodi di servizio, il problema è stato risolto. – Oualid

+0

@Bozho: si sta facendo riferimento a 'gestione errata della sessione'. Puoi dare un esempio di corretta gestione delle sessioni nel contesto di Spring/Hibernate? – spier

+0

apertura e chiusura di una sessione per richiesta (o per conversazione), piuttosto che dimenticare di chiuderla – Bozho

0

Abbiamo utilizzato la seguente riga nel file dispatcher-servlet.xml e le connessioni fisiche del database si stanno chiudendo.

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