数据库链接池配置 testOnBorrow

背景

前段时间作系统压测,发现DB的CPU使用率飙升很严重,排查后发现是一个配置testOnBorrow由false修改成true致使。怎么对性能影响这么大?须要好好了解一下。sql

testOnBorrow含义

testOnBorrow:若是为true(默认为false),当应用向链接池申请链接时,链接池会判断这条链接是不是可用的。数据库

testOnBorrow=false可能致使问题

假如链接池中的链接被数据库关闭了,应用经过链接池ge tConnection时,均可能获取到这些不可用的链接,且这些链接若是不被其余线程回收的话;它们不会被链接池废除,也不会从新被建立,占用了链接池的名额,项目若是是服务端,数据库连接被关闭,客户端调用服务端就会出现大量的timeout,客户端设置了超时时间,会主动断开,服务端就会出现close_wait。并发

链接池如何判断链接是否有效的?

  • 经常使用数据库:使用${DBNAME}ValidConnectionChecker进行判断,好比Mysql数据库,使用MySqlValidConnectionChecker的isValidConnection进行判断
  • 其余数据库:则使用validationQuery判断
  • 验证不经过则会直接关闭链接,并从新从链接池获取下一条链接。

总结

1.testOnBorrow可以确保咱们每次都能获取到可用的链接,可是若是设置为true,则每次获取链接时候都要到数据库验证链接有效性,这在高并发的时候会形成性能降低,能够将testOnBorrow设置成false,testWhileIdle设置成true这样能得到比较好的性能高并发

2.testOnBorrow和testOnReturn在生产环境通常是不开启的,主要是性能考虑。失效链接主要经过testWhileIdle保证,若是获取到了不可用的数据库链接,通常由应用处理异常。性能

详见:https://www.jianshu.com/p/edb6a91285be线程

相关文章
相关标签/搜索