<p><blockquote>作者:鲍凤其<br/>爱可生 dble 团队开发成员,主要负责 dble 需求开发,故障排查和社区问题解答。少说废话,放码过来。<br/>本文来源:原创投稿<br/>*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。<br/></blockquote></p><p>最近用户在使用 druid 连接池连接 dble 时,应用会有不定时出现下面的错误:</p><p></p><p>这种错误还是很常见的,猜测是应用拿到了已经 close 的连接并继续使用从而引发上面的问题。因此,我们想开启 druid 中的对空闲连接检测的机制。</p><p>在查询文档的过程中,发现了两个参数,分别是 testWhileIdle 和 keepAlive(1.0.28 版本引入),那到底这两个参数有什么区别?</p><p>下面我们使用 1.1.13 版本的 druid 做一个测试。</p><p><h5>结论</h5><ul><li></p><p>• 开启 testWhileIdle 之后,druid 不会在 timeBetweenEvictionRunsMillis 指定的周期内检测空闲连接的有效性,而是在连接取出时对连接做一下检测。</p><p></li><li></p><p>• 开启 keepAlive 之后,druid 会在 timeBetweenEvictionRunsMillis 指定的周期内检测空闲连接的有效性。</p><p></li></ul></p><p>因此在实际使用中,建议开启 keepAlive 参数用于对空闲连接做有效性检测。Druid 中 testWhileIdle 和普通的连接池(DBCP 等)所表达的含义并不相同,使用时候需要慎重。</p><p><h5>详细测试过程</h5></p><p>测试程序原理是:首先初始化 druid 连接池,使其中有一个空闲连接。我们设置 TimeBetweenEvictionRunsMillis 为 10s,分别打印 10s 前后连接池中连接的信息。连接信息中 LastActiveTime 这个属性表示这条连接上次被使用的时间。通过观察前后两次打印的 LastActiveTime 是否有差别,来推断期间是否有对连接下发语句进行过有效性检测。</p><p>测试程序:</p><p></p><p><strong>开启 keepalive 参数</strong></p><p>第一次结果:</p><p></p><p>第二次结果:</p><p></p><p>观察第一次结果和第二次结果中 Connections 的 LastActiveTime 值,分别是 2021-03-23 18:47:00 和 2021-03-23 18:47:09,发现两个值变化,可以推断出 10s 內有对连接下发语句进行过有效性检测。</p><p><strong>开启 testWhileIdle 参数</strong></p><p>第一次结果:</p><p></p><p>第二次结果:</p><p></p><p>观察第一次结果和第二次结果中 Connections 的 LastActiveTime 值,分别是 2021-03-23 18:52:39 和 2021-03-23 18:52:39,发现两个值没有变化,可以推断出 10s 內没有对连接下发语句进行过有效性检测。</p>
讯享网

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/172596.html