Druid connection holder is null未

2019-08-25  本文已影响0人  多关心老人

系统中出现过几次connection holder is null问题,有的已解决,有的未解决,记录如下。

首先说先druid连接池的实现:

第一次:系统中事务执行时间过长,超过60秒,后面导致有的请求会报connection holder is null。

第二次系统中有的事务长时间未提交,DBA会把这个连接kill掉,后面请求会报conneciton holder is null

  1. Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.
  2. com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure. The last packet successfully received from the server was 20,840 milliseconds ago. The last packet sent successfully to the server was 20,840 milliseconds ago.
  3. connection holder is null

前面2个异常很好理解,tcp连接断了,应用端读不到数据报错,然后druid捕获到异常,要去判断这个异常是可恢复异常还是不可恢复异常。因为站在连接池的角度来说,数据库抛异常太普遍了,可能是唯一索引重复也可能是连接断了,对于不同的异常处理方式也是不一样的,唯一索引重复需要调用connection.rollback(),然后再把连接还到池里,因为这个连接还是好的,不影响下次继续使用。而连接断了,则要把这个连接踢出去,druid用了ExceptionSorter来判断这个异常是不是不可恢复异常,在转换异常的时候要用当前连接获取数据库的metadata,而当前连接已经断了,所以报connection holder is null。
但是这个connection holder is null只会报一次,和项目中大量报connection holder is null不是一个东西,目前还没找到原因。而这个问题在本地却重现不了。

PS:数据库有一个设置 rollback_on_timeout,默认是off,这个值是说当事务超时(如超过50秒还没获取到锁),默认off是回滚最后一条sql语句,on是回滚整个事务。这个值一般不需要设置成on,交由应用去处理,应用在获取不到 can't acquire lock的时候,一般会去调connection.rollback(),当然前提是要你的应用开启事务。

上一篇 下一篇

猜你喜欢

热点阅读