当前需要做个测试,mysql数据库需要5000万数据来完成性能测试,于是我们写了个函数来完成这个功能。
函数定义如下:
#批量插入数据库的函数
BEGIN
#定义需要插入数据库表中的字段;
DECLARE id BIGINT(20);
DECLARE phone_number varchar(11);
#定义变量控制插入数据库表的行数
DECLARE sid bigint(20) DEFAULT 1;
DECLARE count bigint(20);
declare total bigint(20) DEFAULT 50000000;
#开启循环判断
while sid < total do
SET count = sid + 100000; //每次插入数据库条数,防止条数太多提交失败;
#开始事务
start transaction;
WHILE (sid < count) DO //循环插入数据库数据
SET id = sid;
SET phone_number = CONCAT(1, ROUND(ROUND(RAND(),10)*10000000000));
INSERT INTO t_contact_phone(sid,phone_number)
VALUES(id,phone_number);
#累计行数
SET sid = sid+1;
END WHILE;
commit; //提交事务
end while; //结束循环
END
执行上述函数即可创建5000万条数据在测试库用于测试。
当我们需要同时执行大批量操作,那如果依然顺序单线程执行,会比较耗时,为了提高效率,我们需要通过多线程异步方式来提高效率;
比方说大批量数据的同步方案,只能通过批量查询+多线程+异步的方式来完成。才能更短的时间内更高效的完成任务。
public class SynchronizationData {
private static final Logger logger = LoggerFactory.getLogger(SynchronizationData.class); @Autowired private ApplicationSumaryMapper applicationSumaryMapper;//需要同步的数据表(mybatis完成) @Autowired private ContactPhoneMapper contactPhoneMapper;//需要插入的数据表一(mybatis完成) @Autowired private MiddleFieldMapper middleFieldMapper; //需要插入的数据表二(mybatis完成) private static ExecutorService executor = Executors.newFixedThreadPool(2); //定义线程池用于多线程执行。 //需要同步总条数 private long totalNumber = 0; //需要同步的最大进件id; private long maxSid = 0; //当前已经同步的sid private long currentSid = 0; private long currentPage = 0; private long maxPage = 0; public void startSynData() { //获取当前系统中最大的sid maxSid = applicationSumaryMapper.getMaxSid(); logger.info("需要同步的最大进件id(SID)为:", maxSid);