在使用druid数据库连接池执行后为啥会出现出现无效的源发行版14

在使用druid数据库连接池执行后为啥会出现出现无效的源发行版14,第1张

执行了错误的sql。

问题就出在druid连接池上,连接池在执行完了某一条错误的sql以后,报错信息会被保存在执行sql的线程中,当下一条拿到这个线程的sql执行时,就直接报错,而不会去执行sql。

最终的解决方法就是解决那条问题线程,肯定是哪里出错才会保留报错信息,或者升级druid的版本。

最近用户在使用 druid 连接池连接 dble 时,应用会有不定时出现下面的错误:

这种错误还是很常见的,猜测是应用拿到了已经 close 的连接并继续使用从而引发上面的问题。因此,我们想开启 druid 中的对空闲连接检测的机制。

在查询文档的过程中,发现了两个参数,分别是 testWhileIdle 和 keepAlive(1.0.28 版本引入),那到底这两个参数有什么区别?

下面我们使用 1.1.13 版本的 druid 做一个测试。

因此在实际使用中,建议开启 keepAlive 参数用于对空闲连接做有效性检测。Druid 中 testWhileIdle 和普通的连接池(DBCP 等)所表达的含义并不相同,使用时候需要慎重。

测试程序原理是:首先初始化 druid 连接池,使其中有一个空闲连接。我们设置 TimeBetweenEvictionRunsMillis 为 10s,分别打印 10s 前后连接池中连接的信息。连接信息中 LastActiveTime 这个属性表示这条连接上次被使用的时间。通过观察前后两次打印的 LastActiveTime 是否有差别,来推断期间是否有对连接下发语句进行过有效性检测。

测试程序:

开启 keepalive 参数

第一次结果

第二次结果:

观察第一次结果和第二次结果中 Connections 的 LastActiveTime 值,分别是 2021-03-23 18:47:00 和 2021-03-23 18:47:09,发现两个值变化,可以推断出 10s 内有对连接下发语句进行过有效性检测。

开启 testWhileIdle 参数

第一次结果:

第二次结果:

观察第一次结果和第二次结果中 Connections 的 LastActiveTime 值,分别是 2021-03-23 18:52:39 和 2021-03-23 18:52:39,发现两个值没有变化,可以推断出 10s 内没有对连接下发语句进行过有效性检测。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/6671006.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-03-26
下一篇2023-03-26

发表评论

登录后才能评论

评论列表(0条)

    保存