Java PostgreSQL+;冬眠+;C3P0=致命:抱歉,已经有太多客户端

Java PostgreSQL+;冬眠+;C3P0=致命:抱歉,已经有太多客户端,java,hibernate,postgresql,c3p0,Java,Hibernate,Postgresql,C3p0,我有以下代码 Configuration config = new Configuration().configure(); config.buildMappings(); serviceRegistry = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry(); SessionFactory factory = config.build

我有以下代码

    Configuration config = new Configuration().configure();
    config.buildMappings();
    serviceRegistry = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry(); 
    SessionFactory factory = config.buildSessionFactory(serviceRegistry);
    Session hibernateSession = factory.openSession();
    Transaction tx = hibernateSession.beginTransaction();
    ObjectType ot = (ObjectType)hibernateSession.merge(someObj);
    tx.commit();
    return ot;
hibernate.cfg.xml
包含:


jdbc:postgresql://127.0.0.1:5432/dbase
org.hibernate.dialogue.PostgreSqlDialogue
org.postgresql.Driver
用户名
密码
org.hibernate.connection.C3P0ConnectionProvider
1.
5.
20
50
300
3000
1.
250
真的
真的
org.hibernate.transaction.jdbc事务工厂
线

几秒钟后,插入成功,出现以下异常:

org.postgresql.util.PSQLException: FATAL: sorry, too many clients already
    at org.postgresql.core.v3.ConnectionFactoryImpl.doAuthentication(ConnectionFactoryImpl.java:291)
    at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:108)
    at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:66)
    at org.postgresql.jdbc2.AbstractJdbc2Connection.<init>(AbstractJdbc2Connection.java:125)
    at org.postgresql.jdbc3.AbstractJdbc3Connection.<init>(AbstractJdbc3Connection.java:30)
    at org.postgresql.jdbc3g.AbstractJdbc3gConnection.<init>(AbstractJdbc3gConnection.java:22)
    at org.postgresql.jdbc4.AbstractJdbc4Connection.<init>(AbstractJdbc4Connection.java:30)
    at org.postgresql.jdbc4.Jdbc4Connection.<init>(Jdbc4Connection.java:24)
    at org.postgresql.Driver.makeConnection(Driver.java:393)
    at org.postgresql.Driver.connect(Driver.java:267)
    at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:135)
    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)
    at com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePool.java:32)
    at com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1810)
    at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)
12:24:19.151 [          Thread-160] WARN                   internal.JdbcServicesImpl - HHH000342: Could not obtain connection to query metadata : Connections could not be acquired from the underlying database!
12:24:19.151 [          Thread-160] INFO                             dialect.Dialect - HHH000400: Using dialect: org.hibernate.dialect.PostgreSQLDialect
12:24:19.151 [          Thread-160] INFO                  internal.LobCreatorBuilder - HHH000422: Disabling contextual LOB creation as connection was null
12:24:19.151 [          Thread-160] INFO        internal.TransactionFactoryInitiator - HHH000268: Transaction strategy: org.hibernate.engine.transaction.internal.jdbc.JdbcTransactionFactory
12:24:19.151 [          Thread-160] INFO               ast.ASTQueryTranslatorFactory - HHH000397: Using ASTQueryTranslatorFactory
12:24:19.151 [          Thread-160] INFO                        hbm2ddl.SchemaUpdate - HHH000228: Running hbm2ddl schema update
12:24:19.151 [          Thread-160] INFO                        hbm2ddl.SchemaUpdate - HHH000102: Fetching database metadata
12:24:19.211 [Runner$PoolThread-#0] WARN              resourcepool.BasicResourcePool - com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@ee4084 -- Acquisition Attempt Failed!!! Clearing pending acquires. While trying to acquire a needed new resource, we failed to succeed more than the maximum number of allowed acquisition attempts (1). Last acquisition attempt exception: 
org.postgresql.util.PSQLException: FATAL: sorry, too many clients already
    at org.postgresql.core.v3.ConnectionFactoryImpl.doAuthentication(ConnectionFactoryImpl.java:291)
org.postgresql.util.psqleexception:致命:抱歉,已经有太多客户端了
位于org.postgresql.core.v3.ConnectionFactoryImpl.doAuthentication(ConnectionFactoryImpl.java:291)
位于org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:108)
位于org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:66)
位于org.postgresql.jdbc2.AbstractJdbc2Connection。(AbstractJdbc2Connection.java:125)
位于org.postgresql.jdbc3.AbstractJdbc3Connection。(AbstractJdbc3Connection.java:30)
位于org.postgresql.jdbc3g.AbstractJdbc3gConnection。(AbstractJdbc3gConnection.java:22)
位于org.postgresql.jdbc4.AbstractJdbc4Connection。(AbstractJdbc4Connection.java:30)
位于org.postgresql.jdbc4.Jdbc4Connection(Jdbc4Connection.java:24)
位于org.postgresql.Driver.makeConnection(Driver.java:393)
位于org.postgresql.Driver.connect(Driver.java:267)
位于com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:135)
位于com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:182)
在com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:171)
位于com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.AcquisiteSource(C3P0PooledConnectionPool.java:137)
位于com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(basicResourceSourcePool.java:1014)
在com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePool.java:32)
位于com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1810)
位于com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)
12:24:19.151[Thread-160]WARN internal.jdbcservicesiml-hh000342:无法获取查询元数据的连接:无法从基础数据库获取连接!
12:24:19.151[Thread-160]信息方言.方言-HH000400:使用方言:org.hibernate.dialogue.PostgreSQLdialogue
12:24:19.151[Thread-160]INFO internal.LobCreatorBuilder-hh000422:禁用上下文LOB创建,因为连接为null
12:24:19.151[Thread-160]INFO internal.TransactionFactoryInitiator-hh000268:事务策略:org.hibernate.engine.Transaction.internal.jdbc.jdbc TransactionFactory
12:24:19.151[Thread-160]INFO ast.ASTQueryTranslatorFactory-hh000397:使用ASTQueryTranslatorFactory
12:24:19.151[Thread-160]INFO hbm2ddl.SchemaUpdate-hh000228:运行hbm2ddl架构更新
12:24:19.151[Thread-160]INFO hbm2ddl.SchemaUpdate-hh000102:获取数据库元数据
12:24:19.211[Runner$PoolThread-#0]警告resourcepool.BasicResourcePool-com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@ee4084--获取尝试失败!!!清算未决收购。在尝试获取所需的新资源时,我们未能成功获取超过允许的最大获取尝试次数(1)。上次采集尝试异常:
org.postgresql.util.PSQLException:致命:抱歉,已经有太多客户端了
位于org.postgresql.core.v3.ConnectionFactoryImpl.doAuthentication(ConnectionFactoryImpl.java:291)

似乎hibernate没有实现连接。但是
hibernateSession.close()
导致异常
会话关闭
,因为调用了
tx.commit()

我建议您使用
try catch finally

最后
中,请关闭会话

i、 e

而且,

postgresql.conf中的
max\u connections
属性默认为100。如果需要,请增加它。

我不太确定这里发生了什么,但我建议您不要将hibernate.c3p0.AcquisitioneTryAttents设置为1。首先,这将使您的下一个设置hibernate.c3p0.AcquisiteRetryDelay变得不相关——它设置重试尝试之间的时间长度,但如果只有一次尝试(确定,参数名称是误导性的,它设置了总尝试次数),则不会重试。设置的效果只是让池在客户端进入时尝试获取连接,如果失败,则立即向客户端抛出异常。它根本不限制池将尝试获取的连接数(除非您将BreaknacquireFailure设置为true,在这种情况下,根据您的设置,任何获取连接的失败都将使整个池无效)

我和sola一样担心你缺乏可靠的资源清理。如果在您的设置下,commit()表示close()(并且不允许显式调用close?这似乎很糟糕),那么应该在finally块中进行commit(但是finally块中的commit也很糟糕,有时您不想进行提交)。无论close/commit有什么问题,在您的代码中,openSession和commit之间偶尔出现异常都会导致连接泄漏

但是,这不应该是您太多开放连接问题的原因。如果泄漏连接,您会发现连接池最终会冻结(因为maxPoolSize ConnectionsN是chec)
org.postgresql.util.PSQLException: FATAL: sorry, too many clients already
    at org.postgresql.core.v3.ConnectionFactoryImpl.doAuthentication(ConnectionFactoryImpl.java:291)
    at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:108)
    at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:66)
    at org.postgresql.jdbc2.AbstractJdbc2Connection.<init>(AbstractJdbc2Connection.java:125)
    at org.postgresql.jdbc3.AbstractJdbc3Connection.<init>(AbstractJdbc3Connection.java:30)
    at org.postgresql.jdbc3g.AbstractJdbc3gConnection.<init>(AbstractJdbc3gConnection.java:22)
    at org.postgresql.jdbc4.AbstractJdbc4Connection.<init>(AbstractJdbc4Connection.java:30)
    at org.postgresql.jdbc4.Jdbc4Connection.<init>(Jdbc4Connection.java:24)
    at org.postgresql.Driver.makeConnection(Driver.java:393)
    at org.postgresql.Driver.connect(Driver.java:267)
    at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:135)
    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)
    at com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePool.java:32)
    at com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1810)
    at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)
12:24:19.151 [          Thread-160] WARN                   internal.JdbcServicesImpl - HHH000342: Could not obtain connection to query metadata : Connections could not be acquired from the underlying database!
12:24:19.151 [          Thread-160] INFO                             dialect.Dialect - HHH000400: Using dialect: org.hibernate.dialect.PostgreSQLDialect
12:24:19.151 [          Thread-160] INFO                  internal.LobCreatorBuilder - HHH000422: Disabling contextual LOB creation as connection was null
12:24:19.151 [          Thread-160] INFO        internal.TransactionFactoryInitiator - HHH000268: Transaction strategy: org.hibernate.engine.transaction.internal.jdbc.JdbcTransactionFactory
12:24:19.151 [          Thread-160] INFO               ast.ASTQueryTranslatorFactory - HHH000397: Using ASTQueryTranslatorFactory
12:24:19.151 [          Thread-160] INFO                        hbm2ddl.SchemaUpdate - HHH000228: Running hbm2ddl schema update
12:24:19.151 [          Thread-160] INFO                        hbm2ddl.SchemaUpdate - HHH000102: Fetching database metadata
12:24:19.211 [Runner$PoolThread-#0] WARN              resourcepool.BasicResourcePool - com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@ee4084 -- Acquisition Attempt Failed!!! Clearing pending acquires. While trying to acquire a needed new resource, we failed to succeed more than the maximum number of allowed acquisition attempts (1). Last acquisition attempt exception: 
org.postgresql.util.PSQLException: FATAL: sorry, too many clients already
    at org.postgresql.core.v3.ConnectionFactoryImpl.doAuthentication(ConnectionFactoryImpl.java:291)
try {           
        tx.commit();
    } catch (HibernateException e) {
        handleException(e);
    } finally {
        hibernateSession.close();
    }
Configuration config = new Configuration().configure();
config.buildMappings();
serviceRegistry = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry(); 
SessionFactory factory = config.buildSessionFactory(serviceRegistry);