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

时间:2016-03-02 09:46:00

标签: java mysql hibernate connection-pooling c3p0

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

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工作台中进行任何更改?

1 个答案:

答案 0 :(得分:5)

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

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

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

因此,即使您有6000个用户,但是当时多个用户正在进行与数据库同时运行的操作时间的时间将只是其中的一小部分。

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

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

在设置完毕后,我会运行应用程序并观察与数据库的连接数。如果100个连接在任何时候耗尽,你可以考虑向上调整它。

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

文档:What is c3p0? (connection pooling)