2011-09-21 80 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連接屬性?](