如何在spring + hibernate上避免太多连接?

时间:2013-12-11 23:13:08

标签: java spring hibernate

我的spring-context中的hibernate配置,但是经过一段时间的使用后我得到了太多的连接错误。这是我的代码: 春天背景:

 <!-- 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());

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

2 个答案:

答案 0 :(得分:0)

我对hibernate本身并不了解,但我认为关闭会话可能有所帮助。 这就是JPA EntityManager的工作原理 - 您必须将其关闭以关闭底层连接。

答案 1 :(得分:0)

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