2013-12-20 116 views
1

這是非常奇怪的情況,我認爲它在處理mysql連接對象時最爲常見。以下是場景無法從mysql連接超時後從apache DBCP連接池中獲得連接

在執行sql語句之前,我使用apache DBCP連接池獲取連接對象。一切正常,直到mysql連接超時(8小時)發生。所以在這個連接池之後沒有返回任何連接對象,這使得任何sql操作都等待到下一次重新啓動tomcat服務器。如果沒有DBCP,我們可能會收到communicationException,表示沒有發送或接收數據包。這就是我選擇apache DBCP認爲它會管理連接池的原因。下面是我的代碼

import javax.sql.DataSource; 
import org.apache.log4j.Logger; 
import org.apache.commons.dbcp.BasicDataSource; 

DataSource dataSource 
BasicDataSource ds = new BasicDataSource(); 
ds.setDriverClassName(driver); 
ds.setUsername(username); 
ds.setPassword(password); 
ds.setUrl(url + "/" + dbname); 
dataSource = ds; 
logger.info("Getting connection from DBCP connection pool..."); 
con = dataSource.getConnection(); 
logger.info("MYSQL DB Connection Creation Successful..."); 

我注意到,阿帕奇DBCP使用Singleton模式,創作出如此新的連接對象不被創建,每次我請求連接。請告訴我一個出路,並澄清我,如果我做錯了什麼。我並不是爲以下解決方案

  • 提高MySQL的超時(bcoz MySQL的是常見的,我不認爲增加將是一個很好的解決方案)
  • 當出現問題時(不是一個漂亮的解決方案,重新啓動Tomcat服務器我們不能總是在那裏,也沒有腳本...... :)

請提出我一個出路。謝謝

+0

你可以分享的日誌的任何異常? – aviad

+0

我得到這行打印「從DBCP連接池獲取連接..」但不是「MYSQL數據庫連接創建成功......」。沒有錯誤信息被打印.. !! – Vivek

回答

0

需要看例外。然而,只是瞎猜: 如果你看到這樣

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException 

你可能想用的try/catch和catch塊重新連接來包裝它,然後重新運行查詢。 檢查MySQL docs用於處理停頓的連接。

順便說一句:這對於Spring來說非常簡單 - 您可以配置dataSource來恢復停滯的連接。

1

我沒有得到DBCP連接池的設置在你的代碼中。請按照文檔中的描述,嘗試下面的連接池代碼。

PoolProperties p = new PoolProperties(); 
      p.setUrl("jdbc:mysql://localhost:3306/mysql"); 
      p.setDriverClassName("com.mysql.jdbc.Driver"); 
      p.setUsername("root"); 
      p.setPassword("password"); 
      p.setJmxEnabled(true); 
      p.setTestWhileIdle(false); 
      p.setTestOnBorrow(true); 
      p.setValidationQuery("SELECT 1"); 
      p.setTestOnReturn(false); 
      p.setValidationInterval(30000); 
      p.setTimeBetweenEvictionRunsMillis(30000); 
      p.setMaxActive(100); 
      p.setInitialSize(10); 
      p.setMaxWait(10000); 
      p.setRemoveAbandonedTimeout(60); 
      p.setMinEvictableIdleTimeMillis(30000); 
      p.setMinIdle(10); 
      p.setLogAbandoned(true); 
      p.setRemoveAbandoned(true); 
      p.setJdbcInterceptors(
      "org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;"+ 
      "org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"); 
      DataSource datasource = new DataSource(); 
      datasource.setPoolProperties(p); 

      Connection con = null; 
      try { 
      con = datasource.getConnection(); 
      Statement st = con.createStatement(); 
      ResultSet rs = st.executeQuery("select * from user"); 
      int cnt = 1; 
      while (rs.next()) { 
       System.out.println((cnt++)+". Host:" +rs.getString("Host")+ 
        " User:"+rs.getString("User")+" Password:"+rs.getString("Password")); 
      } 
      rs.close(); 
      st.close(); 
      } finally { 
      if (con!=null) try {con.close();}catch (Exception ignore) {} 
      } 

也讀取有關此document中的每個屬性的信息。 希望這會解決你的問題