`
wen866595
  • 浏览: 268341 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

mybatis 批量插入插件

阅读更多

 

背景

项目中有个设计不合理的表,总共 8 个字段,有 5 个索引,有几个索引字段还是 32 位的字符串。该表数据量已达 1 亿,最近每天新增 100 万。根据日志看,有次用户上传一个有 200 行记录的 excel,需要往这个表插入 3940 条记录,耗时 72 秒。这么大延迟是没法接受的。

 

要分析数据库方面的问题,首先是找 DBA 分析下表的情况,说跟以往没多大区别,只是跟这个表有关的插入的执行计划很多。因为这个表的批量插入是这样的:

<select id="batchSave" parameterType="java.util.List">
    INSERT INTO TABLE_NAME(ID,NAME) 
<foreach collection="list"item="itm" separator="union all">
    (SELECT #{itm.id}, #{itm.name} FROM DUAL)
</foreach></select>

这是用 MyBatis 对 Oracle 做批量插入的唯一方法。副作用是:假定 List 的最大长度是 N,那么 Oracle 服务器端就可能有 N 个插入的执行计划。这么多执行计划,DBA 也不乐意去分析呀,而且生成的每个执行计划确实都是很简单的。

 

优化

如果放弃 union all 的方式,则每条记录都需要各提交一次到数据库,显然也不好。

为了解决 N 个执行计划的问题,做到真正的批量插入,只能修改 MyBatis 的执行逻辑,因此就有了这个项目:mybatis-batchinsert-plugin

目前可以批量插入,但不支持返回主键等其他的功能,有空再完善。

 

2
1
分享到:
评论
4 楼 wen866595 2015-08-05  
cywhoyi 写道
wen866595 写道
cywhoyi 写道
我觉得是否考虑数据路由,你这样方式治标不治本


不知道你说的“数据路由”是怎样的方案?

我做这个插件主要是希望达到:
1、解决Oracle服务器端对一个表做插入的执行计划过多的问题;
2、避免用 union all 拼接成一条 sql,导致一条sql里的绑定变量过多;
3、兼容 MyBatis 的用法,在书写方式上不用改变。

这个插件对性能提升不会很显著,在我们的开发数据库上测试时,以1000条为1批,插入40w数据,用 union all 的方式平均一条需要 32ms,用插件大概是 27ms。

不好意思现在回复你,我看了github使劲上性能提升不大,我现在私库里面采用的想法是能否把数据切成多份,然后在路由hash过去,但是对于developer是无缝的,当然包括DML和查询


看起来你是想做分表?如果是单单一个独立的表,是容易的,但如果有多个表之间的关联,就复杂很多了,去尝试下也是不错的。而我目前只想保持最小的改动。
3 楼 cywhoyi 2015-08-05  
wen866595 写道
cywhoyi 写道
我觉得是否考虑数据路由,你这样方式治标不治本


不知道你说的“数据路由”是怎样的方案?

我做这个插件主要是希望达到:
1、解决Oracle服务器端对一个表做插入的执行计划过多的问题;
2、避免用 union all 拼接成一条 sql,导致一条sql里的绑定变量过多;
3、兼容 MyBatis 的用法,在书写方式上不用改变。

这个插件对性能提升不会很显著,在我们的开发数据库上测试时,以1000条为1批,插入40w数据,用 union all 的方式平均一条需要 32ms,用插件大概是 27ms。

不好意思现在回复你,我看了github使劲上性能提升不大,我现在私库里面采用的想法是能否把数据切成多份,然后在路由hash过去,但是对于developer是无缝的,当然包括DML和查询
2 楼 wen866595 2015-08-03  
cywhoyi 写道
我觉得是否考虑数据路由,你这样方式治标不治本


不知道你说的“数据路由”是怎样的方案?

我做这个插件主要是希望达到:
1、解决Oracle服务器端对一个表做插入的执行计划过多的问题;
2、避免用 union all 拼接成一条 sql,导致一条sql里的绑定变量过多;
3、兼容 MyBatis 的用法,在书写方式上不用改变。

这个插件对性能提升不会很显著,在我们的开发数据库上测试时,以1000条为1批,插入40w数据,用 union all 的方式平均一条需要 32ms,用插件大概是 27ms。
1 楼 cywhoyi 2015-08-03  
我觉得是否考虑数据路由,你这样方式治标不治本

相关推荐

    mybatisr代码生成插件(中文注释,生成批量插入及修改)

    总的来说,"mybatis-generator代码生成插件(中文注释,生成批量插入及修改)"是一款强大的开发辅助工具,它通过自动化代码生成,降低了开发难度,提高了代码质量,尤其是在处理复杂数据关系和大量数据操作时,其...

    Mybatis Plus 自定义批量插入或批量更新(根据唯一索引)

    本文将深入探讨如何在 Mybatis Plus 中自定义批量插入和批量更新,并根据唯一索引来确保数据的唯一性。 首先,了解 Mybatis Plus 的批量操作基础。Mybatis Plus 提供了 `batchInsert()` 和 `batchUpdate()` 方法来...

    mybatisX-idea插件

    它包括自动填充、条件构造器、主键自动生成、批量插入、关联查询等功能,使得在处理数据库操作时更加高效。 2. **MybatisX-idea插件的功能**: - **一键跳转**:该插件允许用户在DAO接口方法与对应的XML映射文件...

    idea插件(mybatis插件)

    根据压缩包子文件的文件名称"mybatis_plus",我们可以推测这可能是指Mybatis Plus,这是一个Mybatis的扩展插件,它在Mybatis的基础上提供了一些额外的功能,如一键生成 CRUD 操作、支持主键自增、支持批量插入、支持...

    mybatis-plus_batch_insert:mybatis_plus添加批量插入

    本篇文章将详细介绍如何在 MyBatis-Plus 中实现批量插入。 ### 1. MyBatis-Plus 简介 MyBatis-Plus 是 MyBatis 的轻量级框架,它在 MyBatis 的基础上做了增强,但不改变其基本结构。MyBatis-Plus 提供了包括单表 ...

    mybatis_plus插件2.7版本破解

    5. **批量操作**:支持多条SQL语句一次性执行,提高数据库操作的效率,如批量插入、更新等。 6. **填充实体对象**:在查询结果与实体类映射过程中,MyBatis Plus可以自动将查询结果填充到对应的实体对象中,减少了...

    mybatis-generator-plugin:Mybatis Generator代码生成插件扩展,增加:查询单条数据插件(SelectOneByExamplePlugin),MySQL分页插件(LimitPlugin),数据模型链式插件(ModelBuilderPlugin),示例条件增强插件(ExampleEnhancedPlugin),示例目标包修改插件(ExampleTargetPlugin),批量插入插件(BatchInsertPlugin),逻辑删除插件(LogicalDeletePlugi

    应该说使用Mybatis就一定离不开代码生成插件,而此插件本身还提供了插件扩展功能用于增强插件本身,官方已经提供了一些扩展,本项目的目的也是通过该插件机制来强化Mybatis Generator本质,方便和减少我们平时的代码...

    MyBatis 3.5.9 官方html文档 包含MyBatis-Spring插件官方文档

    7. **ExecutorType**:MyBatis提供了三种执行器类型:SIMPLE(默认,每个语句都会开启新的事物并执行)、REUSE(复用已经存在的SqlSession,减少创建和关闭SqlSession的开销)、BATCH(批量操作,适用于大量插入、...

    Oracle + Mybatis实现批量插入、更新和删除示例代码

    本篇文章重点讨论如何在Oracle数据库环境下,利用MyBatis进行批量插入、更新和删除操作,这有助于提高数据库操作的效率,减少资源消耗。 批量操作在处理大量数据时尤其重要,因为单条记录的事务提交会消耗更多的...

    mybatis自动sql生成插件源码

    本项目提供的"mybatis自动sql生成插件源码"则进一步提升了开发效率,通过拦截器(Interceptor)在运行时自动生成SQL语句,适用于具有主键或唯一索引的单表操作。 首先,`AutoMapperInterceptor.java`是这个插件的...

    idea2018.1版本mybatis plus插件

    7. **批量操作**:支持批量插入、更新、删除,避免了多次数据库交互带来的性能损耗。 8. **通用Mapper和Service**:MyBatis Plus提供了通用的Mapper和Service,只需简单配置即可实现基本的CRUD操作。 回到这个IDEA...

    2018mybaits_plugin

    4. **批量插入**:支持单表数据的批量插入,提高数据导入效率。 5. **查询Wrapper**:提供了QueryWrapper、UpdateWrapper等工具类,使得条件构造更加方便。 6. **数据权限控制**:内置了数据权限控制功能,可以轻松...

    集成Mybatis分页插件和通用Mapper的示例项目

    3. 批量操作:支持单表的批量插入、更新等操作。 4. 动态SQL:通过注解或条件对象实现动态SQL,使得SQL更简洁,代码更易维护。 **三、集成步骤** 1. **引入依赖**:首先,在项目的pom.xml文件中添加PageHelper和...

    spring-boot-mybatis-interceptor:mybatis自定义主键插件,通过该插件生成分布式唯一雪花ID作为数据库表的主键

    Mybatis自定义插件生成...通过拦截器拦截Mybatis的insert语句,通过自定义注解获取到主键,并为该主键赋值雪花ID,插入数据库中。 2、技术架构 项目总体技术选型 SpringBoot2.1.7 + Mybatis + Maven3.5.4 + Mysql + lom

    MybatisX-1.5.7

    3. **增强型Mapper接口**:在原有Mybatis的基础上,MybatisX添加了一些便捷的方法,如分页查询、批量插入、批量更新等,使Mapper接口功能更加强大。 4. **数据权限控制**:MybatisX支持基于角色的数据权限控制,...

    mybatis plus 3.2.1破解版

    4. **批量插入与更新**:支持单个对象和List对象的批量插入和更新操作,提高数据库操作效率。 5. **分页插件**:内置了物理分页插件,兼容多种数据库,如MySQL、Oracle等,无需手动编写分页代码。 6. **数据权限...

    Mybatis增强工具包(Mybatis plus) v3.5.3.2.zip

    支持批量插入和更新操作,如 `insertBatch()` 和 `updateBatch()` 方法,这对于处理大量数据时能显著提高效率。 5. **分页查询**: 内置了分页插件,可以方便地实现分页查询,支持多种数据库的分页方式,如 MySQL...

    mybatis-generator

    "mybatis-generator-plus"是MBG的一个增强版,它在原版的基础上增加了一些实用功能,如批量插入和分页查询。 批量插入是开发中常见的需求,特别是在数据处理量较大的场景下。mybatis-generator-plus通过自动生成...

    hibernate与mybatis一起使用取长补短

    例如,批量插入、分页查询、联表查询等。 3. **事务管理**: Hibernate的事务管理功能强大,适用于需要分布式事务的场景。而对于局部的、简单事务控制,MyBatis的灵活配置也能满足需求。 4. **灵活性**: 结合两者,...

Global site tag (gtag.js) - Google Analytics