c#Mybatis为什么第一次访问数据库会慢?
今天同事问我,为什么在使用mybatis第一次做业务访问数据库的时候,会明显感觉到很慢,在jemeter上可以明显看到同样的业务,先后两次访问的统计数据相差几十毫秒,于是我们抓取了3个包,看具体慢在了那里?
业务服务器:11.12.112.208
数据库服务器:11.12.112.209
服务启动
启动208上的业务服务器,可以看到208和209之间,没有建立任何连接,这也证明了,mybatis在初次启动时,数据库连接是默认没有连接的,图见下:
第一次业务访问
在本次访问数据库过程中,通过wireshark分析抓取的数据包,发现,创建了2个跟数据库的长连接,用于完成本次业务,通过下图,可以看到2个TCP流
首先,进行3次握手,如下图蓝框所示,然后跟数据库直接做一些数据交互,例如登录以及数据库的信息,如当前数据库的版本号码,如下图红框,No1——No14是连接建立的交互,可以看到一个数据库连接的建立消耗了41ms左右,第二次建立连接,明显时间减少了很多,下面图中只花费了3ms就完成了连接建立,猜测是部分数据进行了缓存,提升了交互效率。
第二次连接建立的过程类似,如下图,不在详细描述:
在每次做业务前,会首先发送SELECT 1,探测连接是否正常,然后SET autocommit=0,设置为非自动提交,然后发送业务sql语句,可以通过wireshark看到完成的流程:
第二次业务访问
第二次同样的业务进行访问时,通过网络包可以看到,没有进行TCP握手,直接复用第一次提供的数据库长连接,提升了效率,见下图:
访问的耗时点
- 连接耗时
- 由于本次采样的两次访问时用的是同样的业务,参数基本一致,这样在数据库查询时,会直接读取缓存中的数据,节约部分访问时间,第二次业务访问时会比较快