SpringBoot 应用轻松实现百万数据重清算_百万数据查重 springboot-程序员宅基地

技术标签: Mybatis批量插入  10.sys  springboot  

前言:

       之前有些历史数据统计复杂,没有想好计算规则,就先把数据json串存到库里。现在需要对json进行计算,求和,取最大等,这些可以用java8里面的stream进行计算,然后单独存到一个表里面。历史表里大概300万条数据,一次5000条数据循环计算。大概20多分钟可以解决这些数据。

       需要注意的是Mybatis虽然对sql的长度不做限制(我需要批量插入),但是mysql会对SQL的长度进行限制。mysql的配置文件里面对数据包大小默认限制是1M,如果批量插入很多的话,需要改一下max_allowed_packet = 6M 这个参数。

       思路想好了,为了快速开发计算的程序,我用springboot应用进行开发。下面是代码,去掉核心业务代码。

 

代码:

目录结构:

 

1.runner

@Component
@Slf4j
public class TransferApplicationRunner implements ApplicationRunner {
@Autowired
    TransferService transferService;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        
        Long firstBegin = System.currentTimeMillis();
        transferService.computeSjDiPaymentHistory();
        Long firstEnd = System.currentTimeMillis();
        log.info("computeSjDiPaymentHistory执行时间:{}分钟", (firstEnd - firstBegin) / 1000 / 60);



    }

}

2.TransferServiceImpl

@Slf4j
@Service
public class TransferServiceImpl implements TransferService {
    @Autowired
    StartKey startKey;

    @Autowired
    TemSjDiPaymentHistoryDao temSjDiPaymentHistoryDao;
    @Autowired
    SjDiPaymentHistorySummaryDao sjDiPaymentHistorySummaryDao;


    @Override
    public void computeSjDiPaymentHistory(){
        long id = startKey.getSjStartKey();
        long i = 1;

        while (true) {
            log.info("第{}次循环,从tem_sj_di_payment_history主键{}开始迁移", i, id + 1);

            //获取历史表的数据5000条
            List<TemSjDiPaymentHistory> historyList=temSjDiPaymentHistoryDao.getHistoryById(id);
            //如果历史表为空,跳出循环
            if (CollectionUtils.isEmpty(historyList)) {
                break;
            }

            List<SjDiPaymentHistorySummary> summaryList=new ArrayList<>();
            //循环历史表的记录,进行计算,拼成summarylist
            for (TemSjDiPaymentHistory item:historyList){
                //这里执行计算逻辑
                summaryList.add(parseRecords(item));
            }
            //批量插入汇总表
            sjDiPaymentHistorySummaryDao.batchInsertSummary(summaryList);

            //设置id的值
            id=historyList.get(historyList.size()-1).getId();
            log.info("第{}次循环,已迁移到tem_sj_di_payment_history主键{}", i, id);

            if (historyList.size() < 5000) {
                log.info("计算完成------最后一个id是:{}", id);
                break;
            }
            i++;

        }

    }

3.动态SQL

从历史表中拿数据:

@Mapper
public interface TemSjDiPaymentHistoryDao {

    @Select("SELECT id,apply_id,query,success,message,records,create_time,update_time FROM tem_sj_di_payment_history where id>#{id} limit 5000")
    List<TemSjDiPaymentHistory> getHistoryById(long id);
}

将数据批量插入到新表:

 

总结:

1.mysql对语句长度有限制,Mybatis对动态语句是没有限制的

2.SqlServer对SQL的参数和语句长度是有限制的

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u012904383/article/details/86006068

智能推荐

http_proxy 密码遇到特殊字符处理方法_添加代理之后有@字符怎么解决-程序员宅基地

文章浏览阅读1w次。参考:http://www.bijimi.com/other/os/27486.htmlexport http_proxy="http://用户名:密码@代理IP:代理端口"如export http_proxy="http://myname:12345!2#@server:888"就会提示Error parsing proxy URL:... bad port number_添加代理之后有@字符怎么解决

python黑帽子-第一章-实现一个TCP代理_python实现tcp代理-程序员宅基地

文章浏览阅读197次。就是再客户端和服务器中间,建立一个中间商。客户端把需要发给服务器的数据,先转发给中间商,然后中间商再转发给服务器。服务器再把响应信息发给中间商,中间商再转发给客户端。_python实现tcp代理

QGIS3教程(10)执行表连接_qgis属性表连接-程序员宅基地

文章浏览阅读480次。现在,我们在人口普查区域图层中拥有了人口数据,我们可以设置其样式以创建人口密度分布的可视化效果。要消除额外的标题行,请在“记录和字段选项”下,将“要放弃的标题行数”设置为。要连接具有此图层的表,我们需要每个要素的唯一且通用属性。在字段计算器对话框中,选择作为输入图层,输入字段名称,然后选择结果字段类型。然后在右侧,单击“文件名”旁边的“并浏览到包含加利福尼亚人口 CSV 的解压缩文件夹。我们将使用加利福尼亚州人口普查区域的形状文件和美国人口普查局的人口数据表来创建加利福尼亚州的人口密度地图。_qgis属性表连接

redis集群的优缺点,5种使用方式优缺点介绍-程序员宅基地

文章浏览阅读2.9k次。Redis Cluster优点:数据依照slot存储分布在多个节点,节点间数据共享,能够动态调整数据分布;可扩展性;无中心架构;高可用性;能够降低运维成本,有效提高系统的可用性以及扩展性。Redis Cluster缺点:数据通过异步复制,不保证数据的强一致性;Client 实现复杂;节点会因为某些原因发生阻塞被判断下线;多个业务使用同一套集群的时候,不能够依据统计区分冷热数据,资源隔离性较差,非常容易出现互相影响;Slave 在集群中充当“冷备”,不能缓解读压力;Key批量操作限制;_redis集群的优缺点

服务器端渲染网页生成map,使用PhantomJS在服务器端渲染并生成Echarts图片-程序员宅基地

文章浏览阅读484次。一,使用的jar包org.apache.commonscommons-exec1.3com.github.abel533ECharts3.0.0.2com.google.code.gsongsonorg.springdocspringdoc-openapi-ui1.3.4com.codebornephantomjsdriver1.4.4二,项目目录结构三,创建要用的js(echarts-scree..._com.github.abel533 jar包

项目之爬取奇怪的小网站_"import urllib.request import re import os headers-程序员宅基地

文章浏览阅读366次。网址是不会给你们的 !!这两篇代码都是本人的前期作品,十分丑陋,望轻喷一、对目录页的爬取:import urllib.requestimport urllib.parseimport reimport osheaders = { 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 12_0 like Mac OS X) App..._"import urllib.request import re import os headers = { \"user-agent\":\"mozilla/"

随便推点

plane_communication.py可能就是XTDrone的关键程序,就像普罗米修斯的command_to_mavros.h ,和GAAS的px4_mavros_run.py几乎一样_construct_target(self, x, y, z, yaw, yaw_rate = 1)-程序员宅基地

文章浏览阅读855次,点赞5次,收藏16次。plane_communication.py可能就是XTDrone的关键程序,就像普罗米修斯的state_from_mavros.h command_to_mavros.h 看它订阅的消息和发布的消息_construct_target(self, x, y, z, yaw, yaw_rate = 1):

Java知识点总结(一)_java类图翻译 +setname(name:steing):void-程序员宅基地

文章浏览阅读343次。Java知识点总结文章目录**Java知识点总结**前序Java中包含的模块java基础1.JavaSE部分1.1Java和PHP的区别?合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的..._java类图翻译 +setname(name:steing):void

java启动监听器报错_初识 Java-监听器-程序员宅基地

文章浏览阅读511次。使用Listener类当java web应用程序在web容器中运行时,在java web应用程序内部会不断发生各种事件,例如web应用的启动,暂停,销毁等。以及web应用中session开始和结束这些web应用对开发者来说通常是看不见的。其实在servletapi中。提供了大量的监听器来监听web应用事件,其中Listener类是最为常用的。此类允许当web内部事件发生时回掉事件监听器的方法。2..._org.apache.cocoon.blockdeployment.blockdeploymentservletcontextlistener

Java swing 设计常用方法及作用_javaswing函数大全-程序员宅基地

文章浏览阅读400次。星号可以通配0到多个任意字符(引入包的时候可以用这个偷点懒,但是会把上一级包含的所有包引入,如果需要对程序大小有较为严格的要求,不建议使用,因为会引入其他你不需要的包)这些方法只是 Java Swing 中的一小部分,还有很多其他的方法可以用来实现各种功能。Java Swing 是 Java 中的一个 GUI 工具包,它提供了丰富的组件和容器,可以用来构建各种图形用户界面。7.setBackground(Color color): 设置组件的背景色。_javaswing函数大全

毕业设计:基于java的搜索引擎系统设计与实现_视觉 检索系统java-程序员宅基地

文章浏览阅读124次。基于Java的搜索引擎系统是一个用于对大量数据进行快速查询和搜索的软件系统。对其进行性能评估是为了确保系统能够快速、准确地响应搜索请求,并提供良好的用户体验。以下是基于Java的搜索引擎系统设计与实现的系统性能评估的总结和分析。1、查询速度评估:查询速度是搜索引擎系统最重要的性能指标之一。通过测试系统对搜索请求的响应时间,可以评估查询速度。可以使用不同的搜索关键词和数据集进行测试,观察系统在不同情况下的查询速度表现。同时,还可以分析系统对于不同搜索请求的响应时间的差异,找出可能需要优化的部分。_视觉 检索系统java

TextView 判断自动换行_android 判断文字是否换行-程序员宅基地

文章浏览阅读2k次。先看 需求: 布局中有四种样式 (标签必须在一起 不能截断) 因为没办法用字段区分这四种类型, 所以只能用一个item布局实现效果原理是这样的, 主要是中间的内容 跟后面的标签 会出现这样的问题, 项目中解决的方案是 用两个TextView : content 和 label , content动态计算, 计算换行逻辑: content +label 一行 或者 label不截断的情况下两行_android 判断文字是否换行

推荐文章

热门文章

相关标签