背景
使用传统的方式制造百万千万甚至亿级的测试数据花费时间过长。对于测试数据的要求也越多,姓名、身份证、银行卡等字段需要随机,流水号等字段要求不重复等。
设计
1、 使用MySql的Batch处理批量插入数据。
2、 将执行数据插入的程序和数据库部署到同一台服务器,降低网络通信延迟。
3、 使用java开发框架封装姓名、身份证、银行卡等随机字段的生成方法。
4、 使用多线程调用,进一步提升效率。
5、 总体的设计见下图。
实现
1、 初始化数据库连接的URL,重要参数:rewriteBatchedStatements=true
如果不加这个参数,jdbc会将批量插入一行一行的逐条处理,就没有达到我们所想要的批量插入的效率。示例代码片断如下:
当rewriteBatchedStatements=false,上面的代码片断会发送10次insert命令。
当rewriteBatchedStatements=true,只会发送一条insert命令。
数据库连接字符串拼接代码片断如下:
2、 SQL字符串准备(prepareStatement)
3、 需要随机值的字段赋随机值(姓名、身份证、手机、银行卡等)
4、 需要递增的、不可重复的字段赋递增的值(流水号、批次号等)
5、 执行addBatch()命令
ps.addBatch();
6、 每一千条SQL执行一次executeBatch()
效果
1、 优势:
a) 可针对任意MySql数据库的任意表进行插入,无需编写SQL。
b) 与传统造数据方式向比节约更多时间——
普通的方式插入1万行数据约需要44秒;
优化的方式插入1万行数据约需要0.6秒。
c) 封装了姓名、身份证等随机值生成方法,使得数据更真实。
2、 劣势:
a) 可写死的字段仍然需要一个默认值,当字段较多时手动赋值花费较多时间。
b) 目前仅支持MySql的数据库。
3、 改进:
a) 在初始化数据库连接之后可增加一个步骤:读取该表的现有数据,可写死的字段的值以现有数据作为默认值,可省去人工录入大量默认值的操作。
b) 持续集成——其他常见数据库支持(SQLServer、oracle等);更多随机字段生成方法(住址、工作单位、爱好等)。
作者:王珂
版权申明:本文为公众号原创,如需转载,请在公众号后台留言。
图片来源:网络
领取专属 10元无门槛券
私享最新 技术干货