gpt4 book ai didi

java - 如何使用 Hibernate 处理最大数据库连接数?

转载 作者:可可西里 更新时间:2023-11-01 08:16:02 26 4
gpt4 key购买 nike

下面是 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。所以我想保持最少的数据库连接。请指导我。

最佳答案

使用 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 提供的自动 session 管理支持相矛盾。当您使用 Spring 时,您不应该自己管理 Hibernate session 。您应该让事务管理器在新的事务边界上调用适当的 Hibernate 初始化回调。

    在您的示例中,如果 session 抛出异常, session 将不会关闭并且连接可能会悬空。那是因为您没有使用 try/finally block 来释放 session 。

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

关于java - 如何使用 Hibernate 处理最大数据库连接数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27897540/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com