非侵入代码 java 自动分批提交数据组件

本贴最后更新于 2779 天前,其中的信息可能已经沧海桑田

一段时间没来这里看看了,既然来了,就留下来点什么呗!

最近遇到的一个问题,以前的业务代码里面有一个批量 update 的操作,一直跑着挺稳定的,最近突然出现了问题,仔细一看,原来是随着业务访问量越来越大,每次 update 的记录条数也会越来越多,当大于 mybatis 的限制后,就 GG 了;
又因为多处业务都耦合了这一个批量操作,导致想去改有提心吊胆害怕踩到其他不知名的地雷,考虑一番之后,决定增加一个注解使用 AOP 针对性的增强这个批量更新逻辑,具体思路就自己去看代码咯!!!略略略
应用到自己的项目后,较好的解决了现在的问题,大家也可以拿去当小白鼠,扩大测试范围,有问题请吱声~~~

使用教程

已上传至 gitHub: 非侵入代码的 java 自动分批提交数据组件,详见 readme.md

BatchHacker.jar 功能介绍

mybatis 框架在执行批量插入或者更新的时候限制入参 List 长度为 2100 以内,随着业务数据的增长,List 长度总有超过这个数的时候,如果你嫌修改以前的业务代码麻烦的话,此时就有这个 jar 包的用武之地了,在不侵入代码的前提下,突破 mybatis 批处理数据量 2100 个的限制,另一个应用场景是,即使没有用到 mybatis,也可以作为自动分批提交的工具,防止一次性提交数据过大导致数据库自动提高锁级别

Maven 配置

1.在 Maven 配置文件中 profiles 节点新增

        <profile>
            <id>washmore</id>
            <repositories>
                <repository>
                    <id>public</id>
                    <url>http://maven.washmore.tech/nexus/content/repositories/public</url>
                    <releases>
                        <enabled>true</enabled>
                    </releases>
                    <snapshots>
                        <enabled>true</enabled>
                    </snapshots>
                </repository>
            </repositories>
            <pluginRepositories>
                <pluginRepository>
                    <id>central</id>
                    <url>http://maven.washmore.tech/nexus/content/repositories/public</url>
                    <releases>
                        <enabled>true</enabled>
                    </releases>
                    <snapshots>
                        <enabled>true</enabled>
                    </snapshots>
                </pluginRepository>
            </pluginRepositories>
        </profile>

2.在项目中引入最新版本的 Maven 依赖

    <dependency>
      <groupId>tech.washmore</groupId>
      <artifactId>util.batchhacker</artifactId>
      <version>1.4-SNAPSHOT</version>
    </dependency>

使用方法

1.首先将 AOP 增强拦截器托管给 spring
使用 xml 声明式:
在 spring 配置文件中增加一行代码

    <import resource="classpath*:batchhacker/spring-aop.xml"/>

或者使用注解式:
新建类 BatchHackerConfig 类(确保此类能被自动扫描到):

@Configuration
@ImportResource("classpath*:batchhacker/spring-aop.xml")
public class BatchHackerConfig {
}

2.然后在批量操作的方法上增加 @BatchHacker 注解即可,如果入参中有多个 List 的话,则需要在批量数据 List 参数上额外增加 @BatchHackerParam 注解;
入参形式支持:
a.单个 List 类型参数;
b.多个参数,其中一个为 List 类型;
c.多个参数,含多个 List 类型的参数,其中一个 List 参数带有 @BatchHackerParam 注解;
d.单个 Map 类型参数,其中有且仅有一个 key 对应的 value 为 List 类型;
出参形式只支持 Integer(int)

tips:

这个玩意还有个缺陷,this 关键字调用的方法无法增强,因为没有被 AOP 切到,Spring AOP 官方给出的建议也是在应用 AOP 的时候尽量避免内部方法调用的出现,硬是要破解也是可以的,将 this 替换为从 Spring 环境中拿出来的 bean 再进行方法调用,但是这样一来需要修改原逻辑代码,就违背了使用这个小插件的初衷了!当然,你也可以将这一个过程使用注解 +AOP 实现,不过,那又是另一个小插件的故事了(根据注解自动代理/增强内部方法调用)...有兴趣的可以自行尝试(^U^)ノ~YO

  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    944 引用 • 1459 回帖 • 17 关注
  • MyBatis

    MyBatis 本是 Apache 软件基金会 的一个开源项目 iBatis,2010 年这个项目由 Apache 软件基金会迁移到了 google code,并且改名为 MyBatis ,2013 年 11 月再次迁移到了 GitHub。

    170 引用 • 414 回帖 • 386 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3187 引用 • 8213 回帖
  • AOP
    21 引用 • 13 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...