c3p0遇到mysql的wait_timeout解决方法

基础知识
c3p0:数据库连接池,可配置初始化数据库连接数等功能
wait_timeout:mysql的连接的配置 默认8小时 若此链接配置时间内无使用,则mysql会自动关闭

出现问题
1.当tomcat启动8小时后 当使用数据库链接时会抛出:数据链接已超时,建议提高wait_timeout配置的错误
2.某个轮询查询过段时间会出现缓存现象

解决问题步骤
1.网上搜索wait_timeout解决方法很多都是直接延长配置项,但这是治标不治本的方法,除非服务在配置项时间内定时重启,所以觉得此方法是实在解决不掉问题的后备实现方案:延长配置项时间+定时重启服务

mysql> set global wait_timeout=10;

mysql> show global variables like 'wait_timeout';

2.重新review取数据库链接的java代码

     /**
       *  将数据库连接绑在线程上 以保证用一个线程使用的都是同一个数据库连接    
       */
      private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();   
     /**
      * 获取数据库连接 同时将数据库连接绑定在线程上
      * @return Connection
      */
     public static synchronized Connection getConnection(){   
          Connection conn = tl.get();   
          Date date = new Date();         
          try {          	    	        	          	 
               if(null == conn|| conn.isClosed()){
                 conn = ds.getConnection();  
                 tl.set(conn);                     
               }
          } catch (SQLException e) {   
            	logger.error(e);;   
          }               
         return conn;   
      }     

我底层取数据库链接的代码逻辑是:
一.将数据库链接绑在处理线程上,每次取数据库链接先从线程上看有没有绑定的或者有没有关闭链接 没有的话或者已关闭的话再去链接池里取数据库链接
二.理想环境的话,即使mysql配置项时间已到主动关链接的话,conn.isClosed()返回的应该也是true,但实际我将wait_timeout参数故意调小,让mysql主动关闭链接,但conn.isClosed()返回一直false,所以无法重新从链接池里取链接,而依旧使用线程上绑定的链接,而此链接已被mysql主动关闭,调用时就会报错(找到报错的原因)
3.解决方法
其实很简单每次使用完链接都close,原以为用了链接池,自己就不用主动close,关闭的任务交给链接池自己控制就行了,没想到还是得close,但这边close的时候数据库的链接实际并没有断,只是将链接交还会链接池而已。
可以通过查看数据库链接来判断是否真的关闭了

mysql> SHOW FULL PROCESSLIST;

缓存的问题一开始直接将所有数据库cache的配置全关了,发现没有用,后来将链接close后发现也解决了,我估计是原先没close的时候,轮询的处理可能不是同一个线程,当轮询到一个比较老的线程后,返回的就是缓存了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值