`

使用 apache common dbcp +common pool+mysql连接无效的问题

阅读更多

Throwable occurred: org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 50,123,505 milliseconds ago.  The last packet sent successfully to the server was 50,123,505 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.


这主要是由两个原因引起来的:
1.mysql 会自动关闭长时间不用的connection,一个连接如果处于sleep状态达到mysql的参数wait_timeout指定的时间(默认为8小时),就是自动关闭这个连接
2.common pool中没有指定相应的连接检查参数


解决办法:从common pool的配置参数来解决:

 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
  <property name="driverClassName">
   <value>${db.driver}</value>
  </property>
  <property name="url">
   <value>${db.url}</value>
  </property>
  <property name="username">
   <value>${db.user}</value>
  </property>
  <property name="password">
   <value>${db.password}</value>
  </property>
  <property name="maxActive">
   <value>100</value>
  </property>
  <property name="maxIdle">
   <value>50</value>
  </property>
  <property name="maxWait">
   <value>10000</value>
  </property>


  <property name="timeBetweenEvictionRunsMillis">
   <value>3600000</value><!--1 hours-->
  </property>

<!--
  <property name="minEvictableIdleTimeMillis">
   <value>20000</value>
  </property>
-->
  
  <property name="testWhileIdle">
   <value>true</value>
  </property>
  <property name="validationQuery">
   <value>select 1 from dual</value>
  </property>

 </bean>

使用上述的三个红色的参数,就可以避免这个问题.这三个参数的意义:

timeBetweenEvictionRunsMillis:启动connection校验定时器,定时器运行时间间隔就是 timeBetweenEvictionRunsMillis的值.默认为-1,表示不启动定时器,这里设定为1小时,只要小于mysql的 wait_timeout就可以了

testWhileIdle: true,表示检查idle的connection,false为不检查

validationQuery:用于检查connection的sql语句.


这只是一种方法,另外的几种方法:

timeBetweenEvictionRunsMillis+minEvictableIdleTimeMillis:这种方式不检查Connection的有效性,而是检查连接的空闲时间,大于minEvictableIdleTimeMillis就清除.

  <property name="timeBetweenEvictionRunsMillis">
   <value>3600000</value><!--1 hours-->
  </property>

  <property name="minEvictableIdleTimeMillis">
   <value>120000</value><!--connection的空闲时间大于这个值,就直接被关闭,并从连接池中删除-->
  </property>


如果不喜欢用定时器,也可以配置testOnBorrow+validationQuery参数:每次从连接池取参数都会校验连接的有效性.实际上这种方式性能会比定时器差些.
  <property name="testOnBorrow">
   <value>true</value>
  </property>
  <property name="validationQuery">
   <value>select 1 from dual</value>
  </property>


另外,也可以用testOnReturn+validationQuery,不过未必会解决问题:这表示每次使用完连接,归还连接池的时候检查连接的有效性,这有可能导致使用一次无效的连接,最好不要用.


上面的几种方法可以合并使用,只是检查的点多了,未必是好事


另外,也可以使用Abandoned的那几个参数,来删除连接池中的连接.也能达到效果.我没测试.

分享到:
评论

相关推荐

    java数据库连接池dbcp

    在Java中,Apache Commons DBCP(Database Connection Pool)是一个常用的开源数据库连接池实现,它提供了数据库连接的创建、管理和复用功能,从而提高了应用性能,减少了与数据库的交互时间。 DBCP是基于Apache ...

    commons-dbcp.jar.rar

    Apache Commons DBCP(Database Connection Pool)是Java世界中广泛使用的数据库连接池组件,它为应用程序提供了高效的数据库连接管理。在Java应用开发中,数据库连接池是必不可少的组件,它优化了数据库资源的分配...

    commons-dbcp.jar、commons-pool.jar

    使用Apache Commons DBCP和Pool,开发者可以构建高效、可扩展的数据库连接管理策略,同时减少系统资源的消耗。这两个组件在很多企业级Java应用中都有广泛的应用,尤其是在需要处理大量并发数据库请求的场景下。

    common-sdbcp1.4.jar_itmop.com.zip

    Apache Commons DBCP(Database Connection Pool)是Apache软件基金会开发的一个数据库连接池组件,它在Java应用程序中提供了数据库连接的池化管理。在Java环境中,DBCP是实现高效、稳定、可扩展的数据库连接管理的...

    dbcp Jar包

    DBCP(Database Connection Pool)是Apache软件基金会的Commons项目中的一个组件,它提供了一个数据库连接池实现。数据库连接池在应用服务器启动时创建一定数量的数据库连接,并将这些连接管理起来,应用程序需要时...

    common-jars.zip

    `dataSource` 的 `type="POOLED"` 指定了使用连接池,而具体的连接池实现(即DBCP)则通过属性来设置,如 `driver`、`url`、`username` 和 `password` 用于配置数据库连接,`poolPreparedStatements`、`maxPoolSize`...

    apache ftpserver使用讲解

    ### Apache FTP Server 使用详解 #### 背景介绍 在当今的数据传输场景中,FTP (File Transfer Protocol) 作为一种常用的技术手段,在很多情况下仍然发挥着重要作用。尤其在一些需要高效稳定传输大量数据的企业环境...

    Common_Hold_Release_DB_Component

    - 连接池的实现可能基于C3P0、HikariCP或Apache DBCP等开源库,这些库提供了线程安全的连接获取和释放机制。 2. **事务管理**: - Java的JDBC API允许进行事务控制,此组件可能会封装这些功能,提供易于使用的...

    手动整合Struts1.3 +hibernate3.2+Spring2.5 .txt

    - 数据源管理:`commons-dbcp.jar`, `commons-pool.jar` - AOP支持:`lib\aspectj\aspectjweaver.jar`, `aspectjrt.jar` - 动态代理:`lib\cglib\cglib-nodep-2.1_3.jar` - 注解处理:`lib\j2ee\common-...

    Tomcat报错: JDBC unregister 解决办法

    另一种更推荐的方法是使用Tomcat自带的JDBC连接池,如Apache Commons DBCP或Apache Tomcat Pool。这样做可以让Tomcat负责JDBC驱动的生命周期管理,避免手动注册和注销。你需要将JDBC驱动的JAR文件复制到Tomcat的`...

    Spring主流jar包大全

    activiti-common-rest-5.21.0.jar activiti-crystalball-5.21.0.jar activiti-diagram-rest-5.21.0.jar activiti-engine-5.21.0.jar activiti-explorer-5.21.0.jar activiti-image-generator-5.21.0.jar activiti-...

    ibatis与spring整合

    &lt;bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"&gt; &lt;property name="driverClassName" value="com.mysql.jdbc.Driver"/&gt; &lt;property name="url" value="jdbc:mysql...

    ssh综合配置文件

    - **commons-dbcp.jar**与**commons-pool.jar**:数据库连接池组件,提高数据库访问效率。 3. **Struts2.1.6** - **struts2-core-2.1.6.jar**与**xwork-2.1.2.jar**:Struts2的核心组件,提供MVC架构支持。 - **...

    ssi框架实例

    - 数据库驱动Jar包:`mysql-connector-java-5.1.7-bin.jar` 以上Jar包为SSI框架的正常运行提供了必要的支持。其中,Struts2负责处理前端请求,并将请求转发给相应的业务逻辑;Spring用于管理整个系统的对象依赖关系...

Global site tag (gtag.js) - Google Analytics