生产有家医院系统报错,只看报错信息就是mapper执行sql时报错。服务受阻,无法正在运行。
但sql没有任何语法错误,只能猜想是否连接数据库有问题,通过telnet ip 端口 确认能连上db服务器,再猜想应用层面配置问题?数据库连接池获取不到可用连接?
打开配置文件查看
spring.datasource.initialSize=187 spring.datasource.minIdle=187 spring.datasource.maxActive=100这个配置有点儿傻眼,直觉告诉我minIdle和initialSize相等,那不就等于所有连接都闲置但不能用么?但因为是直觉(实际上完全没理解这个minIdle的含义),对于做技术的人得用技术说话才是,还是默默打开搜索引擎看看druid这些配置项什么意思。
| maxWait | -1 | 获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。 |
| maxActive | 8 | 连接池最大活跃连接数量,当连接数量达到该值时,再获取新连接时,将处于等待状态,直到有连接被释放,才能借用成功 |
| minIdle | 0 | 连接池最小空闲数量,当连接池里的连接小宇这个值时,会主动创建连接达到最小空闲连接数 |
| initialSize | 0 | 初始化数据源时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时 |
| keepAlive | false | 连接池中的minIdle数量以内的连接,空闲时间超过minEvictableIdleTimeMillis,则会执行keepAlive操作。实际项目中建议配置成true(但这个参数和druid版本有关,1.0.28之后才支持,之前的版本即便配了也不起作用) |
这个是搜了网上配置说明,但还是一头雾水, 连接池最小空闲数量。什么意思?什么算空闲?在池里创建了的连接,但没有被使用的连接么?那如果空闲连接数小于minIdle会怎么样呢?
连接有效检测相关配置如下:
testOnBorrow和testOnRetrun生产通常是false,配置true会影响性能。
探测是顺序进行的,一次探测如果失败,会从连接池移除该失效的连接。
具体流程是:
Druid 的后台线程(Destroy 线程)拿到一个空闲连接
执行
SELECT 'x'进行探测如果抛出异常(包括 I/O 错误),Druid 判定该连接已失效
将该连接从
connections数组中移除,并执行物理关闭