之前我们在项目中引入了数据库连接池之后,在一定程度上,提升了性能.但是,上次我们只是用20个并发量做的测试,而这显然太小了.所以,这次我们使用了2000个并发量来进行测试.
上次我们把数据库连接池的尺寸,设置成了20.在并发量为20时,没有什么问题.然而,一旦到了2000的并发量,我们从Hibernate的Statistic中就能看到,其中有大量的操作,都卡在了从数据库连接池请求数据库连接这里.
然后,我们调大一点数据库连接池的尺寸,将它改为200,然后将MySQL的接受的最大连接数量改为300.这次,性能稍微提升了一些.
我们可以看到,最后的测试,延迟直接到了30+s.
我们从Hibernate的Statistic中看到,这个延迟,主要是由execute JDBC Statement造成的.
这就很奇怪.起初以为Hibernate的Statistic中的execute JDBC Statement的时间是MySQL执行相应的语句的时间,以为是高并发导致服务器负载过大,导致MySQL执行过慢.于是,监控一下服务器的状态,并打开MySQL的慢查询日志功能,将慢查询的阈值设置为1s,然后在执行一次测试,发现服务器负载并不大,也没有执行的过慢的操作.
这也证明了Hibernate的Statistic中的execute JDBC Statement的时间,并不是MySQL中执行语句的时间.
既然不是MySQL的问题,那么问题应该出在Hibernate和MySQL连接的过程中.于是,我们猜测是网络带宽的问题.怀疑是网络拥塞的问题,登录上腾讯云,查看网络连接的情况:
从这里,我们能够看到,出带宽确实达到了达到了我的服务器的带宽,1Mb.
早就想到过,带宽迟早会是我们的服务的瓶颈,只是没有想到,这就遇到了.
这个问题,只能通过增加带宽来解决了.
Hibernate的Statistic中的execute JDBC Statement的计算,应该是在连接中执行Statement之前,记录一下时间,然后执行完成后,收到MySQL发送过来的成功的消息之后,在记录一下时间,然后取这个时间的差值.