`
cheerwong
  • 浏览: 12698 次
  • 性别: Icon_minigender_1
文章分类
社区版块
存档分类
最新评论

使用iBatis插入数据速度的测试

阅读更多
性能测试时遇到一个问题,独立的线程只负责数据入库,但测试发现数据入库速度比产生的慢,导致数据堆积,虚拟机内存使用完,于是做一个测试,看看到底入库的速度有多快。

测试关键代码:
private static void executeBatch() throws SQLException
{
    long beginTime = System.currentTimeMillis();
    sqlMapClient.startBatch();
    for (ActiveRecord activeRecord : activeRecordList)
    {
        sqlMapClient.insert("insert", activeRecord);
    }
    sqlMapClient.executeBatch();
    System.out.printf("%d records:executeBatch finished in %d milliseconds from the begining\r\n", activeRecordList.size(), System.currentTimeMillis() - beginTime);
}

private static void execute() throws SQLException
{
    long beginTime = System.currentTimeMillis();
    for (ActiveRecord activeRecord : activeRecordList)
    {
        sqlMapClient.insert("insert", activeRecord);
    }
    System.out.printf("%d records:execute finished in %d milliseconds from the begining\r\n", activeRecordList.size(), System.currentTimeMillis() - beginTime);
}


测试结果:
# java -classpath ./:ibatis/ibatis-2.3.4.726.jar:ibatis/ojdbc5.jar ibatis.ActiveRecordTest
1 records:execute finished in 30 milliseconds from the begining
1 records:executeBatch finished in 12 milliseconds from the begining
10 records:execute finished in 108 milliseconds from the begining
10 records:executeBatch finished in 111 milliseconds from the begining
100 records:execute finished in 935 milliseconds from the begining
100 records:executeBatch finished in 1184 milliseconds from the begining
1000 records:execute finished in 9695 milliseconds from the begining
1000 records:executeBatch finished in 9344 milliseconds from the begining
10000 records:execute finished in 95788 milliseconds from the begining
10000 records:executeBatch finished in 82613 milliseconds from the begining

结果分析:
从10000条记录插入耗时82613ms计算,大约每秒钟可入库120条记录,因为这个测试代码只做了这一件事,所以正式业务代码的效率还会比这个低,我们遇到的问题刚好是用户行为轨迹的业务,业务要求的TPS是90,相当于每秒钟最少产生90条记录,加上业务代码的逻辑,已经比较接近iBatis入库速度的上限。
建议:
如果入库的数据量接近或超过iBatis的上限,可以考虑将数据分批,多个线程占用单独的数据库连接进行入库。
分享到:
评论

相关推荐

    iBATIS实战

    5.2 插入数据 84 5.2.1 使用内联参数映射 84 5.2.2 使用外部参数映射 85 5.2.3 自动生成的键 86 5.3 更新和删除数据 88 5.3.1 处理并发更新 88 5.3.2 更新或删除子记录 89 5.4 运行批量更新 90 5.5 使用存储过程 91 ...

    Step By Step写测试(书签版).pdf

    5.10 插入数据(Insert) 5.11 执行SQL语句(Execute) 5.12 commit&rollback; 5.13 其它命令 5.14 事务管理 5.15 Martini项目下的ibatis文件配置 5.16 数据库测试FAQ 6 Spring和SQL跟踪 6.1 @Tracer 6.2 FAQ 7 ...

    AppFramework_V1.0

    <br>第三,在插入数据时无法方便的使用字段默认值。最明显的就是类似于LAST_UPDATE_TIME了,通常为了保证这个字段的一致性,通常在插入新记录时采用当前数据库时间作为字段值。但IBatisNet接收的实体类对象属性...

    AppFramework_V1.0_New

    <br>第三,在插入数据时无法方便的使用字段默认值。最明显的就是类似于LAST_UPDATE_TIME了,通常为了保证这个字段的一致性,通常在插入新记录时采用当前数据库时间作为字段值。但IBatisNet接收的实体类对象属性...

    .net源码生成工具DataBase2Sharp

     9、测试数据脚本的生成,在外键非常复杂的表中,我们想添加一条记录都是很容易哦,这个可以更加表的外键关系调整插入测试数据的顺序,很周到吧。  10、增加Select、Update、Insert和Delete基本语句代码的生成,...

    spring chm文档

    7.9.2. 使用元数据驱动的自动代理 7.10. 使用TargetSources 7.10.1. 热交换目标源 7.10.2. 池化目标源 7.10.3. 原型目标源 7.10.4. ThreadLocal目标源 7.11. 定义新的通知类型 7.12. 更多资源 8. 测试 8.1....

    Spring-Reference_zh_CN(Spring中文参考手册)

    7.9.2. 使用元数据驱动的自动代理 7.10. 使用TargetSources 7.10.1. 热交换目标源 7.10.2. 池化目标源 7.10.3. 原型目标源 7.10.4. ThreadLocal目标源 7.11. 定义新的通知类型 7.12. 更多资源 8. 测试 8.1. 简介 8.2...

    AppFramework数据库访问组件_代码生成插件_V1.1.rar

    <br>第三,在插入数据时无法方便的使用字段默认值。最明显的就是类似于LAST_UPDATE_TIME了,通常为了保证这个字段的一致性,通常在插入新记录时采用当前数据库时间作为字段值。但IBatisNet接收的实体类对象属性...

    Spring中文帮助文档

    11.5.1. 使用SimpleJdbcInsert插入数据 11.5.2. 使用SimpleJdbcInsert来获取自动生成的主键 11.5.3. 指定SimpleJdbcInsert所使用的字段 11.5.4. 使用SqlParameterSource提供参数值 11.5.5. 使用SimpleJdbcCall...

    Spring API

    11.5.1. 使用SimpleJdbcInsert插入数据 11.5.2. 使用SimpleJdbcInsert来获取自动生成的主键 11.5.3. 指定SimpleJdbcInsert所使用的字段 11.5.4. 使用SqlParameterSource提供参数值 11.5.5. 使用SimpleJdbcCall...

    Spring 2.0 开发参考手册

    7.9.2. 使用元数据驱动的自动代理 7.10. 使用TargetSources 7.10.1. 热交换目标源 7.10.2. 池化目标源 7.10.3. 原型目标源 7.10.4. ThreadLocal目标源 7.11. 定义新的通知类型 7.12. 更多资源 8. 测试 8.1....

    【白雪红叶】JAVA学习技术栈梳理思维导图.xmind

    插入 快速 归并 堆 桶 基数 常用算法 贪婪 回溯 剪枝 动态规划 数据挖掘算法 KMP算法 GZZ算法 HASH分桶 关联规则算法 APRORIVE算法 分布式 负载均衡 水平伸缩 集群 分片 Key-hash 异步 ...

    springmybatis

    创建用户表,并插入一条测试数据 程序代码 程序代码 Create TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `userName` varchar(50) DEFAULT NULL, `userAge` int(11) DEFAULT NULL, `userAddress` ...

    Spring面试题

    ☆ Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。 ☆ Spring Web 模块:...

    JdbcTemplateTool.zip

    创建一张表employee插入一些测试数据.DROP TABLE IF EXISTS `employee`; CREATE TABLE `employee` (  `id` int(11) NOT NULL,  `name` varchar(300) NOT NULL,  `join_date` datetime NOT NULL,...

Global site tag (gtag.js) - Google Analytics