Hibernate 使用c3p0和Tomcat休眠:连接太多

Hibernate 使用c3p0和Tomcat休眠:连接太多,hibernate,tomcat,c3p0,Hibernate,Tomcat,C3p0,我有一个带有c3p0的hibernate持久层,它在Tomcat上运行。我的连接太多了。在几个用户进入该站点后,它就开始迅速增加与数据库的连接。我已尝试将maxConnectionAge更改为0,我已将最大池大小更改为0。我已经弄乱了很多c3p0的设置,从许多网站的人有相同的问题的建议。然而,似乎没有什么帮助,最终db获得了太多的连接,应用程序停止运行。我希望有人能有一些其他的见解,可能会有所帮助。下面是一些相关代码 Hibernate.cfg.xml <?xml version="1.0

我有一个带有c3p0的hibernate持久层,它在Tomcat上运行。我的连接太多了。在几个用户进入该站点后,它就开始迅速增加与数据库的连接。我已尝试将maxConnectionAge更改为0,我已将最大池大小更改为0。我已经弄乱了很多c3p0的设置,从许多网站的人有相同的问题的建议。然而,似乎没有什么帮助,最终db获得了太多的连接,应用程序停止运行。我希望有人能有一些其他的见解,可能会有所帮助。下面是一些相关代码

Hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
            "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
            "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<session-factory>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.password">ibisalibi1</property>
    <property name="hibernate.connection.url">jdbc:mysql://ikidhub-db-1.cvo0kkopzfhs.us-west-1.rds.amazonaws.com/homemoviezoo</property>
    <property name="hibernate.connection.username">rjdamore</property>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="log4jdbc.drivers">jdbc:log4jdbc:mysql://ikidhub-db-1.cvo0kkopzfhs.us-west-1.rds.amazonaws.com/homemoviezoo</property>
    <!-- configuration pool via c3p0-->
            <property name="c3p0.acquire_increment">1</property>
            <property name="c3p0.idle_test_period">800</property> <!-- seconds -->
            <property name="c3p0.max_size">1</property>
            <property name="c3p0.max_statements">20</property>
            <property name="c3p0.min_size">1</property>
            <property name="c3p0.timeout">1800</property> <!-- seconds -->
            <property name="c3p0.maxConnectionAge">0</property>
            <property name="connection.provider_class">
                               org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider</property>


    <property   name="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
    <property name="current_session_context_class">thread</property>
    <property name="hibernate.show_sql">true</property>
    <!--  <property name="hbm2ddl.auto">update</property>-->
    <mapping class="com.local.shared.School"/>
    <mapping class="com.local.shared.SchoolVideo"/>
    <mapping class="com.local.shared.Category"/>
    <mapping class="com.local.shared.Administrator"/>
</session-factory>

</hibernate-configuration>
我的db_access_类中的一个典型方法

  @Override
public School loadSchoolInfo(School schoolInfo) {
    Transaction tx = null;
    Session session = SessionFactoryUtil.getInstance().getCurrentSession();
    try {
        tx = session.beginTransaction();
        School school = new School();
        String admin = schoolInfo.getAdministrator_name();

        Query q1 = (Query) session.getNamedQuery("school.admin");
        q1.setParameter("admin", admin);
        for (Iterator<?> iter = q1.iterate(); iter.hasNext();)
            school = (School) iter.next();
        schoolInfo.setAdministrator_name((school.getAdministrator_name()));
        schoolInfo.setEmail((school.getEmail()));
        schoolInfo.setSchool_name((school.getSchool_name()));

        tx.commit();
    } catch (RuntimeException e) {
        if (tx != null && tx.isActive()) {
            try {
                tx.rollback();
            } catch (HibernateException e1) {
                e1.printStackTrace();
            }
            throw e;
        }
             } finally {
            if (session != null) {
            if (session.isOpen())
                session.close();
        }
        }
        return schoolInfo;
}
@覆盖
公立学校加载学校信息(学校学校信息){
事务tx=null;
会话会话=SessionFactoryUtil.getInstance().getCurrentSession();
试一试{
tx=session.beginTransaction();
学校=新学校();
字符串admin=schoolInfo.getAdministrator_name();
queryq1=(Query)session.getNamedQuery(“school.admin”);
q1.设置参数(“admin”,admin);
for(迭代器iter=q1.iterate();iter.hasNext();)
school=(school)iter.next();
schoolInfo.setAdministrator_name((school.getAdministrator_name());
schoolInfo.setEmail((school.getEmail());
schoolInfo.setSchool_name((school.getSchool_name());
tx.commit();
}捕获(运行时异常e){
如果(tx!=null&&tx.isActive()){
试一试{
tx.回滚();
}捕获(休眠异常e1){
e1.printStackTrace();
}
投掷e;
}
}最后{
if(会话!=null){
if(session.isOpen())
session.close();
}
}
返回学校信息;
}

尝试将
c3p0.max\u size
更改为100左右,将
c3p0.min\u size
更改为10。现在的设置方式将只使用一个连接,这可能是您遇到的瓶颈。如果您有意将这些选项设置为1,我很好奇为什么,因为如果只使用一个连接,您也可以扔掉c3p0。

没有人喜欢我的问题:-(您是否尝试将超时设置为较小的数字,如100或以下?
  @Override
public School loadSchoolInfo(School schoolInfo) {
    Transaction tx = null;
    Session session = SessionFactoryUtil.getInstance().getCurrentSession();
    try {
        tx = session.beginTransaction();
        School school = new School();
        String admin = schoolInfo.getAdministrator_name();

        Query q1 = (Query) session.getNamedQuery("school.admin");
        q1.setParameter("admin", admin);
        for (Iterator<?> iter = q1.iterate(); iter.hasNext();)
            school = (School) iter.next();
        schoolInfo.setAdministrator_name((school.getAdministrator_name()));
        schoolInfo.setEmail((school.getEmail()));
        schoolInfo.setSchool_name((school.getSchool_name()));

        tx.commit();
    } catch (RuntimeException e) {
        if (tx != null && tx.isActive()) {
            try {
                tx.rollback();
            } catch (HibernateException e1) {
                e1.printStackTrace();
            }
            throw e;
        }
             } finally {
            if (session != null) {
            if (session.isOpen())
                session.close();
        }
        }
        return schoolInfo;
}