Java Web 项目开发,有时需要测试代码操作数据库的性能,往往需要大量的测试数据。编造大量测试数据,有多种方法,如 Java 多线程插入数据,Jmeter 发包工具插入数据,导入 excel 文件数据等等。笔者经常使用的一种方法是,用 MySQL 存储过程制造测试数据,以下做个简单总结。
以 MySQL 数据库表 tbl_mgm_menu 为例,其建表语句如下。
DROP TABLE IF EXISTS `tbl_mgm_menu`;
CREATE TABLE `tbl_mgm_menu` (
`menu_id` int(10) NOT NULL AUTO_INCREMENT COMMENT '菜单主键',
`menu_name` varchar(30) NOT NULL DEFAULT '' COMMENT '菜单名称',
`menu_logo` varchar(64) NOT NULL DEFAULT '' COMMENT '菜单logo',
`menu_url` varchar(64) NOT NULL DEFAULT '' COMMENT '菜单url',
`menu_seq` int(2) NOT NULL DEFAULT '0' COMMENT '菜单顺序',
`rec_st` char(1) NOT NULL DEFAULT '1' COMMENT '记录状态,0:无效;1:有效',
`rec_crt_ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`rec_upd_ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`menu_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1001 DEFAULT CHARSET=utf8;
完整过程如下:
- 清空表数据;
- 创建存储过程,命名为 myproc,具体作用是向表格中循环插入 1000 条数据。如果需要更多的数据,修改 while 循环终止数值即可;
- 调用存储过程。
SQL 语句如下所示。
TRUNCATE TABLE tbl_mgm_menu ;
DROP PROCEDURE IF EXISTS myproc ;
DELIMITER //
CREATE PROCEDURE myproc ()
BEGIN
DECLARE num INT ;
SET num = 1 ;
WHILE
num < 1001 DO
INSERT INTO tbl_mgm_menu (
menu_name,
menu_logo,
menu_url,
menu_seq,
rec_st
)
VALUES
(
CONCAT('name', CAST(num AS CHAR)),
CONCAT('logo', CAST(num AS CHAR)),
CONCAT('/url', CAST(num AS CHAR)),
num,
"1"
) ;
SET num = num + 1 ;
END WHILE ;
END //
CALL myproc () ;
本机 windows 环境下,调用存储过程执行一次, 执行结果如下。
共 1 行受到影响
执行耗时 : 40.051 sec
传送时间 : 0 sec
总耗时 : 40.052 sec
制造完数据后,表格数据如下所示(仅展示部分数据)。
至此,使用 MySQL 存储过程制造数据完成。