Mybatis为什么第一次访问数据库会慢?

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握手,直接复用第一次提供的数据库长连接,提升了效率,见下图:
这里写图片描述

访问的耗时点

  1. 连接耗时
  2. 由于本次采样的两次访问时用的是同样的业务,参数基本一致,这样在数据库查询时,会直接读取缓存中的数据,节约部分访问时间,第二次业务访问时会比较快
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
压力测试 服务器是学生服务器,就是腾讯那个10元的服务器,在本地利用jmeter压测工具设置5000个线程、10000个请求时,首页的QPS为1024,而秒杀接口则为1678,可能服务器的问题,我感觉QPS不应该这么低。 <img src="https://github.com/suyeq/steamMall/blob/master/TestResult.png" width=350px height=200px> # 项目的运行 在数据库中创建steam库,然后导入sql文件,修改相应的的配置,关于主从配置请自行百度啦,运行起项目,然后需要把`GameService`类以及`CommentService`类里面的`afterPropertiesSet`方法里面的代码注释掉,这是第一次启动加载缓存的代码。 # 架构以及详细实现 ## 1.登录注册 * 两次md5,对密码加密 * 分布式session,将用户的登录信息缓存在redis中 * 权限检查,每次操作在权限允许下才能进行 * 注册,需要邮箱验证码,邮箱验证码会在缓存中存在90s的时间 ## 2.页面数据 * 首页及其他页面因为读多写少,利用Mysql主从复制实现读写分离,写入在主Mysql下进行,读取在从Mysql进行 * 关于数据的不一致性,可以在写入的时候先写入缓存,读取的时候也先在缓存中读取,这样就可以避免数据的不一致性 * 缓存利用Redis,内存满的情况下,键的删除策略采用volatile-lru * 热卖榜以及排序功能依据Redis的zset实现,缓存时间为30s * 为了减少网络时延的影响,引入了redis的管道技术,实行批处理 * 为了更好地加快性能,在redis缓存层之上加了加了一层本地的缓存 ## 3.秒杀功能 原理:尽量减少Mysql的访问 * 将先将需要秒杀的数据缓存在Redis中,在秒杀接口里做预减少库存 * 判断秒杀订单里有无对应的信息,有则秒杀重复 * 将user信息与秒杀资源信息加入消息队列中 * 消息接受者减少库存,新增秒杀订单 * 客户端不断轮询缓存,查询到对应的秒杀订单,则秒杀成功<br> 秒杀的一些优化(借鉴了网上的思路): * 增加了秒杀的随机路径,防刷 * 在秒杀开始前需要验证码输入,延缓压力 * 利用redis的缓存,限制每个用户的每分钟的秒杀次数 ## 4.页面的渲染 * 页面的渲染采取了jquery加ajax技术的字符串拼接以及thymleaf模板的渲染 * 大部分是用的字符串拼接,只有少部分采用的模板渲染 * 前端主要是由字符串拼接,后台主要是模板渲染 ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值