博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
解决“"连接池已满"”
阅读量:4310 次
发布时间:2019-06-06

本文共 985 字,大约阅读时间需要 3 分钟。

给客户写了一个web服务,功能就是接收客户端传过来单据,做些数据校验后,保存到数据库中。             

             
运行了一段时间,前几日客户反应说,有些单据上传了,但在系统里看不到。             
             
看了看日志,发生了这样的异常:             
Exception:超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。             
Type:System.InvalidOperationException, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089             
             
参考了这篇文章             
             

第一步,绕开连接池大小限制。

先试着在创建连接的代码处,加了段Catch(InvalidOperationException)的代码,

捕获"连接池已满"异常,然后在连接字符串后面加上"Pooling=false;",也就是以非连接池方式再次创建连接,

避开连接池大小的限制。

改完代码后总是要测试的,试着发起100个调用web服务的请求,大概在处理到第50个请求左右时,开始出现"连接池已满"异常。

一开始的50条是在同1秒钟写入的,出现"连接池已满"异常后,差不多每隔一分钟会写入一条。

这样又写入几条后,弹出下面这个异常:等待web服务回应超时了(见图1)。 

图1

把web服务的SendTimeout改成3分钟后(原先是1分钟),再次测试上传100条。          

这次都上传成功了。前50条是在同1秒写入的,51~79,出现"连接池已满"异常,隔1分钟写入一条,80以后又变成同1秒写入的。(见图2) 

 

图2

虽然数据都能写入,但100条数据花了30分钟才写完,结果不令人满意。

 

第二步,回过头来寻找罪魁祸首。

造成池满的原因应该是连接泄露,用完了没关闭。检查了下代码,除了连接泄漏的问题外,还有打开多个连接的缘故。 

数据检查、保存数据时分别打开了一个数据库连接,这样每次调用web服务就会创建2个数据库连接。

修改了下代码,使得在一个请求中就使用同一个数据库连接,最后关闭这个连接。 

再次测试100条,5秒钟全部完成,而且一个"连接池已满"也没发生,可以交差了。

 

 

 

 

转载于:https://www.cnblogs.com/wordmy/archive/2012/03/10/2389428.html

你可能感兴趣的文章
Nginx
查看>>
Navicat远程连接云主机数据库
查看>>
Nginx配置文件nginx.conf中文详解(总结)
查看>>
Mysql出现Table 'performance_schema.session_status' doesn't exist
查看>>
MySQL innert join、left join、right join等理解
查看>>
sdc时序约束
查看>>
NoC片上网络
查看>>
开源SoC整理
查看>>
【2020-3-21】Mac安装Homebrew慢,解决办法
查看>>
influxdb 命令行输出时间为 yyyy-MM-dd HH:mm:ss(年月日时分秒)的方法
查看>>
已知子网掩码,确定ip地址范围
查看>>
判断时间或者数字是否连续
查看>>
docker-daemon.json各配置详解
查看>>
Docker(一)使用阿里云容器镜像服务
查看>>
Docker(三) 构建镜像
查看>>
FFmpeg 新旧版本编码 API 的区别
查看>>
RecyclerView 源码深入解析——绘制流程、缓存机制、动画等
查看>>
Android 面试题整理总结(一)Java 基础
查看>>
Android 面试题整理总结(二)Java 集合
查看>>
学习笔记_vnpy实战培训day02
查看>>