使用 c3p0 和 Tomcat : too many connections hibernate

标签 hibernate tomcat c3p0

我有一个带 c3p0 的 hibernate 持久层,它在 Tomcat 上运行。我有太多连接的问题。在只有几个用户访问该站点后,它开始增加与数据库的连接。我尝试将 maxConnectionAge 更改为 0,我已将 max_pool_size 更改为 0。根据许多网站的建议,我已经搞砸了很多 c3p0 设置,人们有同样的问题。但是,似乎没有任何帮助,最终数据库连接过多,应用程序停止运行。我希望有人可能有一些其他的见解可能会有所帮助。下面是一些相关的代码。

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>

session 工厂工具

public class SessionFactoryUtil {

private static SessionFactory sessionFactory;
private static ServiceRegistry serviceRegistry;

private static SessionFactory configureSessionFactory() 
        throws HibernateException {

    Configuration configuration = new Configuration();
    configuration.configure();
    serviceRegistry = new ServiceRegistryBuilder()
            .applySettings(configuration.getProperties())
            .buildServiceRegistry();

    sessionFactory = configuration.buildSessionFactory(serviceRegistry);

    return sessionFactory;
}


public static SessionFactory getInstance() {
    return configureSessionFactory();
    //return sessionFactory;
}

public Session getCurrentSession() {
    return sessionFactory.getCurrentSession();
}

public static void close() {
    if (sessionFactory != null) {
        sessionFactory.close();
        sessionFactory = null;
    }
}

  }

我的 db_access_class 中的一个典型方法

  @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;
}

最佳答案

尝试将 c3p0.max_size 更改为 100 左右,将 c3p0.min_size 更改为 10。现在的设置方式将只使用一个连接,这可能是瓶颈你正在经历。如果你有意将这些选项设置为 1,我很好奇为什么,因为如果只使用一个连接,你还不如扔掉 c3p0。

关于使用 c3p0 和 Tomcat : too many connections hibernate ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16578636/

相关文章:

java - c3p0 在 awaitAvailable 中挂起并 hibernate

node.js - 使用 Tomcat 和 NodeJS 进行单点登录

tomcat - 我如何在两个不同的环境中使用 maven tomcat 插件?

java - 如何在 c3p0 中返回连接

java - Hibernate session - 如何使用原始 sql 插入并获取生成的 id?

java - mysql 数据类型 SET 的 Hibernate 注释

java - Mysql,Hibernate - 插入表时,它说字段没有默认值

java - 如何在 netbeans 7.4 中删除 hibernate 中的警告

java - 带有 JSF 主体的 JSP 自定义标记

java - 池中所有已使用的连接都处于 hibernate 状态并创建新连接