10
一个web应用服务器器连一个MySQL数据库。web容器的数据库连接池配置100,MySQL服务器的最大连接数配置1000。在实际压测的时候(使用LoadRunner),当虚拟用户数达到110多,就开始出现“无法获取数据库连接”的报错。我们统计了部分机器,它连接数据库确实超过100了。也就是说,几乎每个请求都会获取一个数据库连接,这应该是违背了数据库连接池,池化的本意。
问一下你们在实际使用过程中,假如碰到这种数据库连接池恶性创建连接的现象,都会怎么处理?或会从哪些方面去分析解决这样的,或相似的问题?
10
是这样的,我们的容器链接和数据库连接池等,这些链接资源都是有限的。一般超过这个访问量,都会存在一定的等待,但是这个等待不会太长。一个优秀的处理机制,甚至用户不会感觉到等待。
本人碰到的问题,容器链接100,并发110真心不过分。其实根本原因是数据库那块的处理做的不够好,等待过久导致的。
10
有这样一个场景:
一个web应用服务器器连一个MySQL数据库。web容器的数据库连接池配置100,MySQL服务器的最大连接数配置1000。在实际压测的时候(使用LoadRunner),当虚拟用户数达到110多,就开始出现“无法获取数据库连接”的报错。我们统计了部分机器,它连接数据库确实超过100了。也就是说,几乎每个请求都会获取一个数据库连接,这应该是违背了数据库连接池,池化的本意。
问一下你们在实际使用过程中,假如碰到这种数据库连接池恶性创建连接的现象,都会怎么处理?或会从哪些方面去分析解决这样的,或相似的问题?本人怎么理解你的问题并不是数据库连接池在恶性创建连接呀,原因是你web容器本来就配置了100个数据库连接,而压测的时候用户超过了100,也就是当前有100+个请求连接了数据库资源,所以你再请求的时候肯定无法获取数据库连接了啊(除非其他请求释放资源)。你web容器100跟MySQL的1000没直接关系啊。
是这样的,我们的容器链接和数据库连接池等,这些链接资源都是有限的。一般超过这个访问量,都会存在一定的等待,但是这个等待不会太长。一个优秀的处理机制,甚至用户不会感觉到等待。
本人碰到的问题,容器链接100,并发110真心不过分。其实根本原因是数据库那块的处理做的不够好,等待过久导致的。
那这个就是数据库瓶颈了,可以优化sql啦,索引啦,加缓存啦,异步处理啦等等。
10
有这样一个场景:
一个web应用服务器器连一个MySQL数据库。web容器的数据库连接池配置100,MySQL服务器的最大连接数配置1000。在实际压测的时候(使用LoadRunner),当虚拟用户数达到110多,就开始出现“无法获取数据库连接”的报错。我们统计了部分机器,它连接数据库确实超过100了。也就是说,几乎每个请求都会获取一个数据库连接,这应该是违背了数据库连接池,池化的本意。
问一下你们在实际使用过程中,假如碰到这种数据库连接池恶性创建连接的现象,都会怎么处理?或会从哪些方面去分析解决这样的,或相似的问题?这是问题都没看懂,怎么每一个请求都获取了一个数据库链接呢?莫非是连接完数据库后都没有释放吗
莫非你们的项目,都是每次用的时候申请连接,用完数据连接,立马释放的?
是这样的吧?一个post请求进行一次操作,完成任务了就得释放连接或还给连接池重新分配了,抓手上不释放是很严重的问题啊
本人对线程池的理解就是食堂大妈,100个打饭的窗口有100个大妈工作,每次打完饭大妈会被连接池回收对队列下一个同学打饭,理论上可以支持100个学生同时打饭没有延迟感,要超过这个限制你得需要101个用户同时发起一个post请求,就会产生大妈不够用排队的情况.
行,我们就用食堂大妈为例。每次建立连接,释放连接,实际上是相当于,有人来打饭了,大妈从休息室跑过来,戴好口罩,拿起大勺。释放连接,相当于,这个学生打完饭走了,大妈放下大勺,去掉口罩,回到休息室。
本人想说明的是,数据库建立连接的过程,相对于机器速度来说,是很慢的一个过程。我们真实使用数据库连接的时候,尤其是对性能要求比较高的时候,是不会每次都“获取连接、使用、释放连接”的。而是将获取的链接暂时(有时效)放在一个池中,其它数据库请求来了,优先从池里直接拿到数据库连接的句柄,直接使用。
再用大妈打饭来说,相当于,大妈来给学生打完饭,会在窗口那等一会儿,假如有人打饭,继续,假如等的时间长了,就回去休息。这个等的过程,就是池化要达到的效果。