connection holder is null异常

N%~}I3OM8NME[6P8SAH11C6.png

产生背景:利用多线程进行数据同步功能,目前使用druid线程池开启3个线程,进行压力测试,相当于3个库同时写入一个库,2~3分钟的数据量为400W+,中间会出现这个异常,自己尝试在Druid设置

druid.setRemoveAbandoned(true);

druid.setRemoveAbandonedTimeoutMillis(1800);

或者druid.setRemoveAbandoned(false);

将这个关闭连接的属性增大时长或者关闭均会报这个错误,其中有次将配置文件的初始化连接池的配置更改扩大了,包括初始化线程数 最大线程数等,成功一次没报错,但是后来还是会报这个错误,目前还没解决,能给点思路么?谢谢@jfinal

评论区

Don小浩

2018-11-19 11:11

数据库使用的是 mariadb 版本号
mysql Ver 15.1 Distrib 10.2.14-MariaDB, for Linux (x86_64) using readline 5.1

杜福忠

2018-11-19 11:45

上次咨询我时, 我知道的, 补充一下信息, 有不对的, 你变更一下:
1个主数据源, 2个辅数据源. druid线程池均开3个线程.

两个业务线程操作 2个辅库数据 写入 主库 (单表数据合并).

线程操作: 分次写入, 一批次500条, 并且 对每批次写入 均开启 事务 提交 . 测试数据均能正常写入数据库.

线程结束后, 会报如上异常,

Don小浩

2018-11-19 11:49

@杜福忠 是3个辅数据源 3写1这样的,其它是我少补充的,目前在看mariadb的配置文件,考虑会不会跟这两项有关系
net_read_timeout = 3600 #数据读取超时时间,默认30s
net_write_timeout = 3600 #数据写入超时时间,默认60s 这是现在的配置

JM-java

2018-11-22 10:03

@Don小浩 我之前也是由于这种问题.后来解决了.原因第一是因为在程序中创建了静态线程变量,druid的回收机制没有处理也不会识别. 第二,检查线程中对数据操作是否开启了autocommit,和数据库不一致,这个操作没操作好代码对线程池配置是致命的.第三,最好多线程测试时,事务控制用tx拦截器,不要自己画蛇添足.

Don小浩

2018-11-23 10:59

@JM-java 第一个问题 我由于在同步的时候需要对个别的数据进行特殊操作,所以使用了aop拦截器功能,自身创建了static的threadLocal 这是您说的静态线程变量的一个原因么? 第二个问题 在线程中我都没有自己手动开启过 autocommit 第三个问题 事务控制我是直接使用的 Db.tx(){}这样的 没有使用到注解,而且在小数据量的情况下没有出现这个异常

JM-java

2018-11-23 11:51

我不清楚数据量问题.但是静态线程变量虽然 threadLocal 确实是同步的,安全的.但是我发现我在调用线程过后,虽然调用了close 方法.但是druid的回收机制没起作用.仍然有残留没清理的超时连接存在于连接池.当时我的并发量不高.我也不能确定是否是其他原因.之后我把静态线程变量那个类取消了就没问题了.并发过高只能通过很精密的测试来进行定位问题,我也在关注这个帖子,希望你解决了能在这里说下.

Don小浩

2018-11-23 11:57

@JM-java 嗯 好的 我这里考虑一下这个点 看看怎么处理吧 可能这个解决的时间会久一点

热门反馈

扫码入社