Timeout: Pool empty. Unable to fetch a connection in 30 seconds, none available[size:200; busy:200; idle:0; lastwait:30000]

这个问题之前在项目中就困扰了我很多次,只不过重新部署就好了而且再也没有出现过了,所以也就没注意。但是今天这个问题一直出现,重新部署运行一会儿就出现,运行一会就出现。不知道怎么弄,没办法就硬着头皮上网搜,花了一天时间,也算是把这奇葩的BUG解决了,这里记录一下解决的几个过程。
首先讲一下场景,项目是一个物联网项目,会有硬件向服务器上报信息,硬件数量多,上传频率高,上来的数据需要做处理,在这种高并发的环境下,我先是尽可能不去数据库取数据,但是无可避免的还是会需要访问到数据库,退无可退了,只能开始找原因了。
故障的意思很简单直接,就是说数据库的连接池空了,在超时时限内没有获取到连接,则抛出异常,于是去数据库查看连接

Mysql -> show full processlist;

通过这句话在MySQL中去获取所有进程,看看自己这个项目的进程,确实有很多,而且在Command这一栏还都是sleep,想来可能跟这个有关系,于是乎上网搜相关内容,搜来的大致意思是连接没有正确关闭。不过我代码里面用到的SQL是关闭了的,虽然体感是这个问题,但是从这入手应该是解决不了问题。
但是关于这个sleep的问题,又引申到了MySQL的wait_timeout和interactive_timeout的这两个属性,这两个都是空闲连接的超时时间,只不过前者是非交互式连接的(通过jdbc连接),后者是交互式连接的(通过MySQL客户端连接)。于是尝试设置一下wait_timeout的时间,这里默认设置的是8h

Mysql -> set global wait_timeout=30;

设置成30s之后,重新部署,跑起来之后确实是有效的,那些sleep的进程都消失了,感觉好像这样就OK了,但是接下来又报了另外一个异常,具体异常忘记记录了,大致意思是连接丢失,上网搜一下发现时wait_timeout时间设置太短造成的。所以感觉修改wait_timeout的时间不是正确的解,于是又重新设置成了8H,再从别的地方入手。
这条异常记录上有提到size是100,于是乎想到提高最大连接量试试(其实这是个很笨的主意,因为100能超,1000估计都一样超,时间问题而已)。这就又涉及到了Tomcat-jdbc连接池的配置,但是之前我试着去配置连接池,想让最大连接量能大一些,只不过没有用,先贴一下原先的配置,由于是spring-boot项目,所以配置是写在properties里面

#连接池最大连接数
spring.datasource.tomcat.max-active=200
#空闲池中最大连接数
spring.datasource.tomcat.max-idle=50
#空闲池中最小连接数
spring.datasource.tomcat.min-idle=10
spring.datasource.tomcat.initial-size=10

本意是想让连接池的连接数变成200的,但是不起作用,stackoverflow上看是说spring-boot的1.4.1版本有一个更改,本来是spring.datasource.max-active=200的,现在得要根据具体情况来调整,比如用Tomact就是spring.datasource.tomcat.max-active=200。只不过我是1.4.3版本,我以为是向上兼容,没想到居然是向下兼容,改为不带Tomcat的就可以了,加上又看了一下连接池的配置,最终连接池的配置版本为

#连接池最大连接数
spring.datasource.max-active=200
#空闲池中最大连接数
spring.datasource.max-idle=50
#空闲池中最小连接数
spring.datasource.min-idle=10
spring.datasource.initial-size=10
#连接在池中空闲最小时间后被清除
spring.datasource.min-evictable-idle-time-millis=60000
#隔多久时间清回收废弃连接
spring.datasource.time-between-eviction-runs-millis=30000
#每次调用检测池里连接的可用性,假如连接池中的连接被数据库关闭了,应用通过连接池getConnection时会重新创建
spring.datasource.testOnBorrow=true
spring.datasource.validation-query=SELECT 1
#移除被遗弃的连接
spring.datasource.remove-abandoned=true
#设置超时时间
spring.datasource.tomcat.remove-abandoned-timeout=60

不得不说,在高并发的应用环境下,连接池的配置是真的重要,关于连接池的配置我感觉可以另开一篇来介绍了。最下面两个就是确实解决掉这个BUG所需要的配置,注释也稍微写了一下,是移除被遗弃的连接,超过60秒就被判断为遗弃的连接。这里的遗弃的连接就是在代码过程中写的比如没有及时关闭的连接之类的糟糕的写法。其实针对这个问题,体感上来说也确实是这么回事,连接用完之后,超过一个设定的时间就自动删掉。这点有点像Java线程池框架中的Executors.newCachedThreadPool(),设定的是线程存活60秒就自动删掉,之前试过在60秒之内疯狂增加线程数,并将线程数设定的比较小,一段时间后就报错了,跟今天连接池的这种情况确实是很像。
大概就是这么个情况,仅仅提供一个结题思路,当中还有不少绕路,也怪自己对连接池的配置还并不了解,如果一开始就修改对连接池的配置的话,也不至于被这个BUG纠缠一整天了。

长路漫漫。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,099评论 18 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,358评论 6 343
  • application的配置属性。 这些属性是否生效取决于对应的组件是否声明为Spring应用程序上下文里的Bea...
    新签名阅读 5,286评论 1 28
  • 自打七月初到中旬,每天的气温都不算太高,加上梅雨季节的影响,更加感觉到凉爽舒适。正欣喜着,如果一直都是以这样的天...
    砚磊阅读 310评论 0 0
  • $尝试一个好玩的东西——怎样在任何文章中学习画画?比如说,我刚刚阅读了汤小小的这篇写作技巧。我们来测试一下。 下图...
    ALEX阿雷的小星球阅读 653评论 0 5