Springboot连接池的配置
前言:最近发现项目日志中经常会出现有关数据源的一些警告信息,说实话看着这种日志就很闹心,而且对于数据源这么重要的东西还是有必要去着重解决,学习的。
可以看出,有两个关于数据源的异常信息:
1.在连接关闭之后不允许被再操作。
2.抛出异常说连接是不可用的,请求时间超过了30000ms;
其实看到这个情况就知道肯定跟数据源连接池的配置信息有关,
name | 描述 | 默认值 | |
---|---|---|---|
autoCommit | 自动提交从池中返回的连接 | true | |
connectionTimeout | 等待来自池的连接的最大毫秒数 | 30000ms | |
idleTimeout | 连接允许在池中闲置的最长时间 | 600000ms | |
readOnly | 从池中获取的连接是否默认处于只读模式 | false | |
maximumPoolSize | 池中最大连接数,包括闲置和使用中的连接 | 10 | |
minimumIdle | 池中维护的最小空闲连接数 | 10 | |
maxLifetime | 池中连接的最长生命周期 | 1800000 |
其实常用的就这些吧,可以根据日志输出的问题来看看需要配置那些值;
问题1:应该就是在我们使用完连接后,连接已经失效了但是没有被回收,因为MySQL针对长时间的DB连接在无任何操作情况下过了8个小时后会自动把这个连接关闭(mysql默认的wait_timeout为8小时),在连接池中的connection如果空闲超过8小时,mysql会将其断开,但是连接池并不知道connection已经失效,如果这时有client请求connection,连接池将失效的connection给client,就会造成该异常。
解决:配置相应的连接池参数(最主要的应该是参数idleTimeout,maxLifetime),定时去检查连接的有效性,定时清理无效的连接。
并且我在有些文章上看到这样段话 ‘to set maxLifeTime value few minute less than mysql’s wait_timeout(show variables like “%timeout%”) to avoid broken connection exception.’ 将maxLifetime值设置为比MySQL的wait_time小一些。查看mysql数据库的wait_time命令 show variables like “%timeout%”
问题2:请求数据库连接时,长时间未获取到而报错。
解决:通过配置connectionTimeout值来控制等待获取连接的时间
为了让自己更明白一点,翻了下以前做的笔记:
这个可以直接在网上查看一些连接池的基本工作原理,至于连接池的创建和实现方式,使用连接池的好处,常见的连接池 等都有的,就不介绍了。下来可以看一下这两篇文章:https://www.cnblogs.com/devin-ou/p/7989701.html
https://blog.csdn.net/u010028461/article/details/78932109
关于上面遇到的问题和连接池全部的配置,也推荐看:https://blog.csdn.net/wantLight/article/details/107163468 https://blog.csdn.net/mezheng/article/details/111993947
总结:
对于连接池的工作原理和好处这些都没有写,但是还是要花时间再去看看,估计这样才能真的明白如何去配置我们的连接池。贴出来的链接其实上班的路上看看最适合不过了,还有最近不知道为什么总是没心思去写博客,其实真的静下心来开始写了,又感觉挺不错的。加油!!!
下一篇文章:常见的加密解密算法使用