如何避免spring+hibernate上的连接过多



我在spring上下文中使用了hibernate配置,但使用一段时间后,我出现了连接过多的错误。这是我的代码:Spring上下文:

 <!-- Beans Declaration -->
 <bean id="Usuarios" class="com.proximate.model.Usuarios"/>
<!-- Service Declaration -->
<bean id="UsuariosService" class="com.proximate.service.UsuariosService">
    <property name="usuariosDAO" ref="UsuariosDAO" />
</bean>
<!-- DAO Declaration -->
<bean id="UsuariosDAO" class="com.proximate.dao.UsuariosDAO">
    <property name="sessionFactory" ref="SessionFactory" />
</bean>
 <bean id="DataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        <property name="driverClass" value="com.mysql.jdbc.Driver" />   
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/mydb" />
        <property name="user" value="user" />   
        <property name="password" value="password" />   
        <property name="maxPoolSize" value="50" />
        <property name="maxStatements" value="0" />
        <property name="minPoolSize" value="5" /> 
    </bean> 
    <!-- Session Factory Declaration -->
    <bean id="SessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="DataSource" />
        <property name="annotatedClasses">
            <list>
                <value>com.proximate.model.Usuarios</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.format_sql">true</prop>                         
            </props>
        </property>
    </bean>
    <!-- Enable the configuration of transactional behavior based on annotations -->
    <tx:annotation-driven transaction-manager="txManager"/>
    <context:annotation-config />
    <!-- Transaction Manager is defined -->
    <bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="SessionFactory"/>
    </bean>

以下是我如何在dao中使用会话工厂:

private SessionFactory sessionFactory;
private HibernateTemplate hibernateTemplate;
public SessionFactory getSessionFactory() {
    return sessionFactory;
}
public void setSessionFactory(SessionFactory sessionFactory) {
    this.hibernateTemplate = new HibernateTemplate(sessionFactory);
}
Query query = hibernateTemplate.getSessionFactory().getCurrentSession().createSQLQuery("SELECT ID FROM usuarios");
Integer cantidad = new Integer(((BigInteger) query.uniqueResult()).intValue());

为什么我的代码打开了这么多连接。我听说在日志记录后使用Hibernate Util类加载会话可能是我所需要的,但在使用spring时如何实现它??提前感谢!!

我对hibernate本身了解不多,但我认为关闭会话可能会有所帮助。JPAs EntityManager就是这样工作的——必须关闭它才能关闭底层连接。

看起来您的hibernate查询是全局的?我想原因可能是因为它没有包含在一个带有事务注释的方法中

最新更新