java - 在 MySql 中使用 c3p0 和 hibernate 的连接太多

标签 java mysql hibernate connection-pooling c3p0

我正在使用 c3p0 作为我的连接池。我已将最小连接数配置为 100,将最大连接数配置为 2000。我只是在编写一个简单的插入程序来检查工作台中有多少连接处于 Activity 状态。但是,我收到以下错误

java.sql.SQLException: Data source rejected establishment of connection,  message from server: "Too many connections"
at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:650)
at com.mysql.jdbc.Connection.createNewIO(Connection.java:1808)
at com.mysql.jdbc.Connection.<init>(Connection.java:452)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:411)
at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:134)
at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:182)
at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:171)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:137)
at com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1014)

我的Hibernate.cfg.xml如下

<!-- c3p0 Connection pool config -->
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<property name="hibernate.c3p0.min_size">100</property>
<property name="hibernate.c3p0.max_size">2000</property>
<property name="hibernate.c3p0.timeout">300</property>
<property name="hibernate.c3p0.max_statements">50</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>  
<property name="hibernate.c3p0.validate">true</property>

我的Java程序是

public static void main(String[] args) {
    // TODO Auto-generated method stub
    Transaction tx = null;
    SessionFactory factory = HibernateUtil.getSessionFactory();
    Session session = factory.openSession();
    tx = session.beginTransaction();
    System.setProperty("net.sf.ehcache.skipUpdateCheck", "true");
    Employee e = new Employee(2,"Richard");
    session.save(e);

    try {
        Thread.sleep(20000);

    } catch (Exception e2) {
        e2.printStackTrace();
    }
    tx.commit();
    session.close();
    System.out.println("Great! Student was saved");

}

当最小大小为 5 且最大大小为 20 时,它工作正常。我需要在 MySQL Workbench 中做任何更改吗?

最佳答案

数据库连接池(如 c3p0)的全部目的是优化资源与数据库的使用。

如果您有 6000 个用户和 6000 个连接,您会很快耗尽可用连接并导致错误。

相反,连接池允许您的应用程序从池中“借用”数据库连接,并在使用后归还它们。

因此,即使您可能有 6000 个用户,多个用户同时执行对数据库的操作的时刻在那个时刻也只是其中的一小部分。 p>

我建议尝试将此作为更合理的值:

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

像这样设置之后,我会运行应用程序并观察连接数与数据库的关系。如果 100 个连接在任何时候都用完了,您可以考虑向上调整它。

但我怀疑 100 个并发连接就足够了——记住它们是从 c3p0 连接池“借来”的。

文档:What is c3p0? (connection pooling)

关于java - 在 MySql 中使用 c3p0 和 hibernate 的连接太多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35743532/

相关文章:

java - 不必要的长正则表达式

java.lang.RuntimeException : java.net.UnknownHostException:主机未解析:

mysql - 与数据透视表连接的外键约束格式不正确

Hibernate 以多对一的方式生成 m + 1 个查询

spring - 在 Spring Boot 中禁用所有与数据库相关的自动配置

java - 使用 JpaRepository 缓存

java - 无法点击 webelement 按钮

java - JDBCCategoryDataset - 执行多个查询

mysql - MYSQL中使用时如何删除最新的

php - 带有 PDOStatement 的 PDO 在出现 "mysql server gone"错误时重新连接