测试需求平台 10-DBUtils 优化数据连接与 SQL Limit 实现分页
🎉 此分享将会是一个系列分享,将使用最新的 Acro Vue 前端框架,和 Python Flask 服务从 0-1 手把手实现一个测试需求平台,内容将囊括基础、扩展和实战,由浅入深带你实现测试开发岗位中平台工具技术能力入门和提升。
作者:大奇 MegaQi | Info 签约作者 ,专注测试开发技术实战干货分享,欢迎访问主页长期关注。
本篇将对数据库进行优化,包括链接池优化和 limit 使用技巧。
1.数据库连接优化
在项目中链接数据是直接通过 pymysql 去做的链接请求关闭,每次操作都要独立重复请求,其实是比较浪费资源,在并发不大的小项目虽然无感知,但如果有频繁请求的项目中,就会有性能问题,那么可以通过使用连接池技术,管理来进行优化
1.1 Python DBUntils
DBUnitls 是一套 Python 的数据库连接池包,对链接对象进行自动链接和释放,提高高频高并发下数据访问性能,大概的原理如:
DBUntils 按照配置初始化多个数据库连接存储在连接池中
在程序创建连接的时候,从空闲的连接池中获取,不需要重新初始化连接,提升链接速度;
在程序使用完毕后,把连接放回连接池,并不真正地关闭,等待其他请求使用,减少频繁数据的打开和关闭操作。
DBUntils 提供两种方式,并都能自动管理
PersistentDB (persistent_db) 提供线程专用的连接
PooledDB (pooled_db) 提供线程间可共享的连接
官方 [注解-1] 给出的示意图如下,仅够参考下,不进行扩展
使用此功能需要安装依赖 pip install DBUtils
,一般比较常用就是共享的方式,以 pooled_db 为例子,使用方法很简单
一些参数说明,上边说明中第一参数为 creator 指定那种连接模式,第二参数为 mincached
mincached :启动时开启的空的连接数量
maxcached :连接池最大可用连接数量
maxshared : 连接池最大可用共享连接数量
maxconnections : 最大允许连接数量
maxusage :单个丽娜姐最大复用次数
blocking :达到最大数量时是否阻塞
这里只是对连接的管理,DBUntils 的基本知识点讲完了,关于性能对比可以网上搜索相关内容,另外其他的数据库操作还按照自己使用方法进行操作即可。
1.2 实例改造
以已经实现的 product.py 查询列表接口做一个实际改改造,具体的应用会在后边的需求实现中体现。
2.SQL 中 limit
2.1 基础知识
项目中对于较多的数据显示,需要实现分页数据查询,这可以利用 SQL 语法关键词 limit ,它可以限制查询结果返回的数量,也可以指定起始索引,来完成分页查询效果,语法形式与参数解释:
i:指定。一个返回记录行的偏移量(可省略即表示从 0 开始)
n:第二个参数指定返回记录行的最大数目
两个示例如:
这里有个 注意事项,网上好多关于 limit 最后一个参数用 -1 可以表示,指定偏移量到最后,这个目前在新的 MYSQL 版本已经无效,会报语法错误,办法是用个较大的数代替。
如何实现分页查询,通过观察我们可以这样,如果前端传递的 page 页数(初始为 1),每页的数量为 page_size,那么第一个参数计算偏移量可设置为 (page-1) * page_size
,第二参数表可设置为page_size
, 例如 前端请求第一页 20 个,则计算后后两个参数为( 0, 20),再如请求第 2 页 20 个,则计算后两个参数为 ( 20, 20 ),这样就可以实现分页数据查询效果。
2.2 实践案例
具体案例这里截图一张后边实现提测需求查询,通过参数 size,page 计算 limit 参数实现分页的数据查询逻辑。
这个知识点最后,扩展一个小优化,如果是分页数据特别,第一个参数偏移量太大的时候会带来性能的问题,优化的方式是使用子查询优化(前提条件是有自增 ID 的表),即先通过查询偏移量 ID,然后条件 “>=ID + limit 数量" 进行查询。
3 Moment.js
JavaScript 日期处理类库( http://momentjs.cn/ ),它提供了一些经常用的时间处理方法,在 node.js 和 浏览器中都可以直接使用。
3.1 安装和使用
在我们前端项目中安装和引用如下:
也可通过 require 定义,或 html 直接引用
3.2 常用方法
3.2.1 格式化时间
通过 format('字符串') 对日期进行格式化。
格式字符串很多,可以根据需要自行组合
3.2.2 相对时间
通过fromNow
、toNow
、to
等方法计算相对时间
3.2.3 时间计算
subtract()
通过减去时间来改变原始的 momentadd()
通过增加时间来改变原始的 momentstartOf()
/ endOf()
通过将原始的 moment 设置为时间单位的开头/末尾来对其进行更改注:以上计算本身还是 moment 如果项展示还需要借助format
或calendar
对于moment.js
以上是大奇认为比较常用的一些方法,还有更多的用法方便在时间上的快捷操作,按照项目需要随用随事到官方查看使用文档即可。
本篇主要讲解了几个后边要用到扩展知识点,在当今的开发环境生态下,有很多类似这样好用的前后端开发工具包,我们要善于发现和利用它们,尽量避免无效重复造轮子,把时间花费在功能实现上。
版权声明: 本文为 InfoQ 作者【MegaQi】的原创文章。
原文链接:【http://xie.infoq.cn/article/565d02c7737becf0e0f667a25】。文章转载请联系作者。
评论