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

Java 如何使用Hibernate处理max数据库连接?,java,mysql,spring,hibernate,c3p0,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>

下面是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>
和项目的其他代码(代码2)

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

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

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

<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">20</property>
5
20
如果连接耗尽,则可能是因为:

  • 您没有关闭Hibernate
    会话
    ,关联的JDBC连接也不会释放到池中
  • 您的查询执行时间太长,因此它们释放连接的速度不够快
我建议使用,例如,更好地理解数据库连接使用模式

关于两个选择:

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

    在您的示例中,如果会话引发异常,会话将不会关闭,并且连接可能悬空。这是因为您没有使用try/finally块来释放会话

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


您能告诉我,这是由于代码1还是代码2造成的吗?若我不关闭代码1的连接,那个么每次它都会创建新的连接吗。?或者它会使用现有的打开的连接。?这是真的。出于好奇,我想知道,在代码1中,我正在正确地打开和关闭连接,那么为什么它会增加连接数。?为什么不通过调用close()立即关闭连接。?连接在某个特定时间后关闭,但在此之前它达到最大连接。您如何知道您一次拥有超过1000个连接?大多数数据库只允许几百个。。我已经采取了D8层计费计划。从google开发者控制台-->存储-->云sql-->活动连接。在该页面上显示了活动连接数的图表
   Query executeQuery = getSession().createQuery(hql);
   UserProfileuser  =  (UserProfile) executeQuery.uniqueResult();
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">20</property>