本文大纲

《如何做性能测试》

性能测试案例2

正文

性能测试案例:JDBC批处理与非批处理性能对比

目的

本次测试的主要目的是评估JDBC批处理(batch)与非批处理在Oracle和MySQL数据库中的性能表现。具体目标是通过比较两种插入方法的速度,了解它们之间的差异,并对实际应用中的数据插入操作提供参考建议。

软硬件条件

  • 测试机 :

    • 型号:ThinkPad T400 笔记本电脑
    • 操作系统:Windows XP
    • CPU:P8600 @ 2.4G
    • 内存:2GB
    • IP 地址:192.168.10.124
  • 数据库服务器 :

    • 型号:ThinkPad T400 笔记本电脑
    • 操作系统:虚拟机 Windows Server 2003,分配了500MB内存
    • IP 地址:192.168.10.139
  • 数据库 :

    • MySQL: 版本 5.0.18,默认安装配置
      • 数据表定义:

        CREATE TABLE `dev`.`test_insert` (
          `id` INT NOT NULL,
          `uname` VARCHAR(10) NULL,
          PRIMARY KEY (`id`)
        ) ENGINE = InnoDB;
    • Oracle: 版本 10G,默认安装配置
  • JDBC驱动 :

    • MySQL:mysql-connector-java-5.0.8
    • Oracle:ojdbc6.jar(之前使用 ojdbc14.jar,导致部分插入失败)

测试方法

使用Java来编写测试程序,执行SQL语句来评估不同数据插入方式的性能。具体操作如下:

  • 使用JDBC连接数据库,并通过Main方法分别进行批处理和非批处理的数据插入。
  • 所有测试均在10万条记录的情况下进行,事务在所有数据插入完成后一次性提交。

结果

以下是MySQL和Oracle数据库在不同插入方式下的性能对比结果:

数据库 插入方法 每秒插入记录数 (条/秒)
MySQL 非批处理 5700
MySQL 批处理 62500
Oracle 非批处理 4464
Oracle 批处理 27778

结论

  • MySQL数据库 :

    • JDBC的batch插入10万条记录比for循环逐条执行insert SQL语句快约10.9倍(5700 vs. 62500 条/秒)。
  • Oracle数据库 :

    • JDBC的batch插入10万条记录比for循环逐条执行insert SQL语句快约6.2倍(4464 vs. 27778 条/秒)。

注

  • 对于MySQL,建议在JDBC连接字符串中添加rewriteBatchedStatements=true参数,并确保使用5.1.13或更高版本的驱动程序以实现高效的批处理插入。例如:

    String connectionUrl = "jdbc:mysql://192.168.1.100:3306/test?rewriteBatchedStatements=true";
  • 对于Oracle,推荐使用ojdbc6.jar驱动,避免之前使用ojdbc14.jar时遇到的部分插入失败的问题。

通过以上测试结果和建议,我们能够更好地理解JDBC批处理与非批处理在实际应用中的性能差异,并采取合适的策略优化数据插入操作。