首页 > 其他分享 >JDBC批量插入大量数据(高性能)

JDBC批量插入大量数据(高性能)

时间:2023-04-22 18:25:54浏览次数:34  
标签:语句 JDBC 批量 springframework 插入 高性能 import org

rewriteBatchedStatements

使用jdbc批量插入功能,rewriteBatchedStatements参数必不可少。对插入而言,所谓的 rewrite 其实就是将一批插入拼接成 insert into xxx values (a),(b),(c)...这样一条语句的形式然后执行,这样一来跟拼接 sql 的效果是一样的。但是此参数默认false,即便使用批处理,性能依然很差。

原因是这样的:

  • 如果批量语句中的某些语句失败,则默认重写会导致所有语句都失败。
  • 批量语句的某些语句参数不一样,则默认重写会使得查询缓存未命中。

因此如果需要使用jdbc批量插入功能,则在数据库连接URL中添加此参数为true
添加参数

上代码

测试环境为springboot,mybatis,mysql5.7.23。

package test;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Objects;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.SqlSessionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.support.JdbcUtils;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.util.StopWatch;

import com.len.LenApplication;

/**
 * 测试jdbc批量插入性能。
 * 
 * @author chenxing
 */
@RunWith(SpringRunner.class)
@SpringBootTest(classes = LenApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class JdbcBatchTest {

    private static final String SAVE_BATCH = "insert into test_demo(a,b,c,d,e,f,g,h,i,j) values(?,?,?,?,?,?,?,?,?,?)";

    private static final Logger log = LoggerFactory.getLogger(JdbcBatchTest.class);

    @Autowired
    SqlSessionTemplate sqlSessionTemplate;

    @Test
    public void testStartJob() {
        SqlSessionFactory sqlSessionFactory = sqlSessionTemplate.getSqlSessionFactory();
        SqlSession sqlSession = null;
        Connection connection = null;
        PreparedStatement statement = null;

        try {
            sqlSession = sqlSessionFactory.openSession(false);
            connection = sqlSession.getConnection();
            connection.setAutoCommit(false);
            statement = connection.prepareStatement(SAVE_BATCH);

            //模拟五万条数据
            int max = 50000;
            //每1000条分批
            int batchSize = 1000;
            int limit = Math.min(max, batchSize);

            StopWatch stopWatch = new StopWatch();
            stopWatch.start("JDBC save batch");
            for (int i = 1; i <= max; i++) {
                statement.setString(1, "a" + i);
                statement.setString(2, "b" + i);
                statement.setString(3, "c" + i);
                statement.setString(4, "d" + i);
                statement.setString(5, "e" + i);
                statement.setString(6, "f" + i);
                statement.setString(7, "g" + i);
                statement.setString(8, "h" + i);
                statement.setString(9, "i" + i);
                statement.setString(10, "j" + i);
                statement.addBatch();

                if (i == limit) {
                    statement.executeBatch();
                    statement.clearBatch();
                    limit = Math.min(limit + batchSize, max);
                }
            }
            connection.commit();
            stopWatch.stop();
            //实测五万数据(10个字段)插入6~7秒左右。
            log.info(stopWatch.getLastTaskName(),":{}",stopWatch.getTotalTimeMillis());
        } catch (SQLException e) {
            e.printStackTrace();
            log.error(e.getMessage());
        } finally {
            SqlSessionUtils.closeSqlSession(Objects.requireNonNull(sqlSession),sqlSessionFactory);
            JdbcUtils.closeStatement(statement);
            JdbcUtils.closeConnection(connection);
        }
    }

}

实测数据

此种方式是对比各种方式后得出的性能最佳,实测五万数据(10个字段)插入6~7秒左右。:

标签:语句,JDBC,批量,springframework,插入,高性能,import,org
From: https://www.cnblogs.com/StarChen20/p/17343632.html

相关文章

  • 高性能分布式网络服务器框架
    该项目是使用C/C++开发的一款高性能的后端分布式服务器网络框架。该项目具有如下要点:使用C++11重写并简化muduo网络库;仿写了tcmalloc的高并发内存池;加入了sylar的日志模块并将其改进为异步日志;使用到了protobuf和Zookeeper来作为分布式协调服务;项目地址:https......
  • JDBC--API--PreparedStatement
     案例:  代码实现:  packageJDbc;importjava.sql.*;importjava.util.Scanner;publicclassjdbcdome_PreparedStatement{publicstaticvoidmain(String[]args)throwsClassNotFoundException,SQLException{Class.forName("com.mysql.jdb......
  • 老杜 JavaWeb 讲解(四) ——Servlet编写JDBC连接数据库
    老杜 JavaWeb 讲解对应视频:08-servlet中编写jdbc程序连接数据库(六)在Servlet(Java小程序)中编写JDBC连接数据库6.1JDBC介绍:JDBC的全称是Java数据库连接(JavaDatabaseconnect),它是一套用于执行SQL语句的JavaAPI。[1]JDBC(JavaDataBaseConnectivity)是Java编程语言中......
  • JDBC--API --ResultSet
        importjava.sql.*;publicclassjdbcdome_ResultSet{publicstaticvoidmain(String[]args)throwsClassNotFoundException,SQLException{Class.forName("com.mysql.jdbc.Driver");Stringurl="jdbc:mysql://127.0.......
  • shardingjdbc
    shardingjdbc:轻量级数据库中间层,实现分表分库HikariCP:当下比较火的数据库连接池qiniu-java-sdk:此SDK适用于Java7及以上版本。使用此SDK构建您的网络应用程序,能让您以非常便捷地方式将数据安全地存储到七牛云上。无论您的网络应用是一个网站程序,还是包括从云端(服务端程序)到......
  • JDBC--API--Statement
    importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.SQLException;importjava.sql.Statement;publicclassjdbcdemo_Statement{publicstaticvoidmain(String[]args)throwsClassNotFoundException,SQLException{Class.forName......
  • (转)一文带你由浅入深地解读 Go Zap 的高性能
    原文:https://blog.csdn.net/EDDYCJY/article/details/117970643简介zap是什么?⚡ZAP[1] 是uber开源的提供快速,结构化,高性能的日志记录包。zap高性能体现在哪里?在介绍zap包的优化部分之前,让我们看下zap日志库的工作流程图大多数日志库提供的方式是基于反射的序列化和字......
  • 【总结】浅刷leetcode,对于位运算提高性能的一些总结
    目录什么是位运算?位运算技巧1.判断奇偶性2.交换两个数3.判断一个数是否是2的幂次方4.取绝对值5.计算平均数结论位运算技巧是计算机科学中非常重要的一部分,它可以用来解决很多实际问题。在本篇博客中,我们将介绍一些常见的位运算技巧,以及它们在实际应用中的使用。什......
  • nginx配置文件生成完成批量配置
    1.创建模板worker_processes1;events{worker_connections1024;}stream{ server{listenlisten-port;proxy_passip:port; proxy_connect_timeout2s;}#foreach($portin[9000..9009])server{listen$port;p......
  • JDBC初识
    jdbc连接DriverManager驱动程序管理器是负责管理驱动程序的,驱动注册以后,会保存在DriverManager中的已注册列表中后续的处理就可以对这个列表进行操作.注册驱动方式1.DriverManager.registerDriver();2.写代码实现Class.forName("com.mysql.jdbc.Driver");利用反射机制3.......