2011-09-21 76 views
1

是否有任何方式通过编程来确定数据库连接池大小(连接池中使用/连接中的连接)?我们在C3P0上使用Hibernate。如何以编程方式确定连接池大小?

我们在连接数据库时遇到问题。抛出异常并且数据不保存在数据库中。

 
1005,MA,19/09/11 09:39:14,com.novosys.gtw.business.frontend.SnapshotMessageBusiness.save, Major: Cannot open connection 
org.hibernate.exception.GenericJDBCException: Cannot open connection 
    at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:126) 
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:114) 
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) 
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:52) 
    at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:449) 
    at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167) 
    at org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:142) 
    at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:85) 
    at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1354) 
    at sun.reflect.GeneratedMethodAccessor6.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:585) 
    at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:342) 
    at $Proxy0.beginTransaction(Unknown Source) 
    at com.novosys.gtw.util.base.BaseBusiness.save(BaseBusiness.java:199) 
    at com.novosys.gtw.business.backend.receivesnapshotmessage.filter.SaveMessageFilter.decode(SaveMessageFilter.java:102) 
    at org.apache.mina.filter.codec.demux.DemuxingProtocolCodecFactory$ProtocolDecoderImpl.doDecode(DemuxingProtocolCodecFactory.java:292) 
    at org.apache.mina.filter.codec.CumulativeProtocolDecoder.decode(CumulativeProtocolDecoder.java:133) 
    at org.apache.mina.filter.codec.ProtocolCodecFilter.messageReceived(ProtocolCodecFilter.java:158) 
    at org.apache.mina.common.support.AbstractIoFilterChain.callNextMessageReceived(AbstractIoFilterChain.java:299) 
    at org.apache.mina.common.support.AbstractIoFilterChain.access$1100(AbstractIoFilterChain.java:53) 
    at org.apache.mina.common.support.AbstractIoFilterChain$EntryImpl$1.messageReceived(AbstractIoFilterChain.java:648) 
    at com.novosys.gtw.business.backend.receivesnapshotmessage.filter.WhitelistFilter.messageReceived(WhitelistFilter.java:231) 
    at org.apache.mina.common.support.AbstractIoFilterChain.callNextMessageReceived(AbstractIoFilterChain.java:299) 
    at org.apache.mina.common.support.AbstractIoFilterChain.access$1100(AbstractIoFilterChain.java:53) 
    at org.apache.mina.common.support.AbstractIoFilterChain$EntryImpl$1.messageReceived(AbstractIoFilterChain.java:648) 
    at com.novosys.gtw.business.backend.receivesnapshotmessage.filter.MoniterFilter.messageReceived(MoniterFilter.java:92) 
    at org.apache.mina.common.support.AbstractIoFilterChain.callNextMessageReceived(AbstractIoFilterChain.java:299) 
    at org.apache.mina.common.support.AbstractIoFilterChain.access$1100(AbstractIoFilterChain.java:53) 
    at org.apache.mina.common.support.AbstractIoFilterChain$EntryImpl$1.messageReceived(AbstractIoFilterChain.java:648) 
    at org.apache.mina.filter.executor.ExecutorFilter.processEvent(ExecutorFilter.java:220) 
    at org.apache.mina.filter.executor.ExecutorFilter$ProcessEventsRunnable.run(ExecutorFilter.java:264) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675) 
    at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:51) 
    at java.lang.Thread.run(Thread.java:595) 
Caused by: java.sql.SQLException: Connections could not be acquired from the underlying database! 
    at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:106) 
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:529) 
    at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:128) 
    at org.hibernate.connection.C3P0ConnectionProvider.getConnection(C3P0ConnectionProvider.java:78) 
    at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446) 
    ... 31 more 
Caused by: com.mchange.v2.resourcepool.CannotAcquireResourceException: A ResourcePool could not acquire a resource from its primary factory or source. 
    at com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1319) 
    at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:557) 
    at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:477) 
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:525) 
    ... 34 more 

我们试图通过增加连接池的大小,也没有增加来解决它。在MySQL级别可用的连接,但没用。我们现在试图对它进行调试以查看它是由于连接池大小还是由于MySQL连接大小。我们想登录没有。的连接可用/正在使用连接池大小,但无法从谷歌获得任何帮助。

环境:Java中,休眠,C3P0,MySQL的

Session session = null; 
Transaction transaction = null; 

try { 
      session = HibernateUtil.getSessionFactory(datasource).getCurrentSession(); 
      transaction = session.beginTransaction(); 
      // db save called here 
      session.getTransaction().commit(); 
     } catch (Exception e) { 
      Logger.write(LoggerConstant.MAJOR_ERROR, e.getMessage(), e, methodName); 
     } finally { 
      try { 
       if ((transaction != null) && (transaction.isActive())) { 
        transaction.rollback(); 
       } 
      } catch (Exception e) { 
       Logger.write(LoggerConstant.CRITICAL_ERROR, e.getMessage(), e, methodName); 
      } 
      try { 
       if ((session != null) && (session.isOpen())) { 
        session.close(); 
       } 
      } catch (Exception e) { 
       Logger.write(LoggerConstant.CRITICAL_ERROR, e.getMessage(), e, methodName); 
      } 
     } 
+1

可能重复http://stackoverflow.com/questions/1902126/can-i-access-the-c3p0-connection-pool -properties-programmatically) – 2011-09-21 05:51:15

回答

0

除了什么ex0du5曾建议,在异常跟踪也建议如下:

Caused by: com.mchange.v2.resourcepool.CannotAcquireResourceException: A ResourcePool could not acquire a resource from its primary factory or source. 
    at com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1319) 
  • 这意味着连接池是不能够获得从数据库中新的连接。
  • 请检查MySQL日志是否有任何错误。
  • 检查mysql配置的最大连接池大小和最大连接设置数。 (其最可能的连接池规模将在mysql的配置是最高的连接,但PLZ确保这)

而且there is a way在那里你可以监控C3P0 conenction的所有参数(包括最大连接设置)池。

1

我不相信你的问题是连接池,本身,而是更普遍的连接泄漏。此问题通常与使用HibernateDaoSupport.getSession()而未与HibernateDaoSupport.releaseSession()正确配对有关。在一般情况下,你要像

public SomeObject getSomething() 
{ 
    Session session = null; 
    try 
    { 
     session = this.getSession(); 
     Query query = session.createSQLQuery("SELECT * FROM SomeTable WHERE SomeClause").addEntity(SomeObject.class); 

     // extract object from query 

     return someObject; 
    } 
    finally 
    { 
     if (session != null) 
      this.releaseSession(session); 
    }   
} 

这可以通过使用一个HibernateCallback自动化。您可以通过向this.getHibernateTemplate().executeFind提供查询来完成此操作,该查询将使用Hibernate中的会话进行自动资源管理。

+0

如果您发布最少的代码进行重现,这可能会得到更好的验证,但这是看到此错误转储时的常见答案。 – ex0du5

+0

它不会每次都发生。我在我的问题下面发布代码,我认为连接泄漏不是这里的情况,因为它已经妥善处理。纠正我,如果我错了。 –

+0

问题已使用代码段更新。请看看 –

0

要正确配置连接池大小,您需要有指标来调查连接使用模式。

FlexyPool旨在帮助您搞清楚我们的正确的连接池的大小,因为它可以监控以下指标:

  • 并发连接数直方图
  • 并发连接请求直方图
  • 数据源连接关系取得时间直方图
  • 连接租赁时间直方图
  • 最大池大小直方图
  • 总连接关系取得时间直方图
  • 溢出池大小直方图 重试尝试直方图

您可以检查下面的文章:

的[我可以编程方式访问c3p0连接属性?](