2013-12-20 117 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中的每个属性的信息。 希望这会解决你的问题