如何使用Hibernate处理max数据库连接?

时间:2015-01-12 08:01:16

标签: java mysql spring hibernate c3p0

以下是来自Hibernate.xml的Hibernate配置

    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource">
        <ref bean="dataSource"/>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
            <prop key="hibernate.c3p0.timeout">300</prop>
        </props>
    </property>
    <property name="annotatedClasses">
        <list>
         .....
        </list>
    </property>
  </bean>

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

以下是GenricDaoImpl类(代码1)

的代码
@Override
public T save(T t) {
    Session session = getSessionFactory().openSession();
    Transaction tx=session.beginTransaction();
    session.saveOrUpdate(t);
    tx.commit();
    session.close();
    return t;
}

和项目中的其他代码(代码2)

   Query executeQuery = getSession().createQuery(hql);
   UserProfileuser  =  (UserProfile) executeQuery.uniqueResult();

以上我在项目中使用的代码。我的问题是需要遵循哪种编码?代码1或代码2,以避免最大连接错误。我可以连接数据库的最多1000个连接。但在某些情况下,它超过1000。所以我想保持数据库连接最小化。 请指导我。

1 个答案:

答案 0 :(得分:3)

使用1000个数据库连接并不是一个非常好的主意。每个额外的数据库连接都需要额外的RAM,并增加了并发问题(死锁)的可能性。

由于您使用C3P0,因此您应该具有最大连接大小:

<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">20</property>

如果连接用尽,那可能是因为:

  • 您不要关闭Hibernate Session,并且相关的JDBC连接不会被释放到池中
  • 您的查询执行时间过长,因此他们没有足够快地释放连接

我建议使用connection pool size utility,例如FlexyPool来更好地了解数据库连接使用模式。

关于两个选择:

  • 第一个例子与Spring提供的自动会话管理支持相矛盾。使用Spring时,不应自行管理Hibernate Sessions。您应该让事务管理器在新的事务边界上调用适当的Hibernate初始化回调。

    在您的示例中,如果会话抛出异常,则会话将不会关闭,并且连接可能会悬空。那是因为您还没有使用try / finally块来发布会话。

  • 第二个示例更好,但您需要将其包装到@Transactional服务中。