JDBC批量插入性能简单分析

批量插入性能分析:仅仅针对性能

  1.使用Statement对象,一次一个,循环插入

  2.使用PreparedStatement对象,一次一个,循环插入

  3.使用PreparedStatement对象,使用addBatch(),executeBatch(),clearBatch()实现批量插入

    注意事项:

    1)数据库的驱动需要是5.1.37之后的版本,否则不支持批量操作

    2)mysql数据库默认不开启批量操作,需要在数据库的url后面加上:?rewriteBatchedStatements=true

    url=jdbc:mysql://localhost:3306/test?rewriteBatchedStatements=true

  4.使用批量插入的同时加上事务管理,一次性提交。

分析一:使用Statement,一次一个,循环插入

  缺点:

  1.每个sql语句都需要进行字符串拼接:效率极差

  2.可能造成内存溢出(sql字符串对象太多)

  3.每次执行一次,数据库每次都要编译一遍sql语句再执行:效率极差

分析二:使用PreparedStatement对象,一次一个,循环插入

  缺点:

  1.每次执行一次,数据库都要执行一次语句:效率差

  优点:

  1.预编译sql语句,省却了数据库多次编译sql语句,只需要一条sql语句,剩下的填充参数即可

分析三:使用PreparedStatement对象,并使用addBatch(),executeBatch(),clearBatch()实现批量插入

  优点:

  1.每次都是多个sql语句一起执行,而且不需要多次 编译,大大节省了系统开销,并增加的插入速度,推荐使用

分析四:在3的基础上使用事务

  优点:一次性将事务中批量插入的数据,持久化到数据库中,不需要多次提交,大大加快的数据的持久化速度和安全性。

参考代码如下(工具类没给,异常未处理,为了简化代码,勿怪)

@Test
public void test() throws Exception {
    Connection connection = JDBCUtils.getConnection(); //获取连接对象
    connection.setAutoCommit(false); //设置事务不自动提交
    String sql = "insert into goods(`name`) values(?)";//预编译sql语句
    PreparedStatement ps = connection.prepareStatement(sql);
    for(int i = 0 ; i< 2000000 ; i++){
        ps.setObject(1,"name"+i); //填充参数
        ps.addBatch(); //攒sql
        if(i % 5000 == 0){
            ps.executeBatch();
            ps.clearBatch();
        }
    }
    ps.executeBatch();//防止漏掉数据
    connection.commit();//提交事务
    JDBCUtils.close(connection,ps);//关闭资源
}

  

  

  

原文地址:https://www.cnblogs.com/linglongfang/p/12690814.html

时间: 2024-08-30 02:53:58

JDBC批量插入性能简单分析的相关文章

jdbc批量插入实现大批量数据快速插入

今天在做一个将excel数据导入数据库的程序时,由于数据量大,准备采用jdbc的批量插入.于是用了preparedStatement.addBatch();当加入1w条数据时,再执行插入操作,preparedStatement.executeBatch().我原以为这样会很快,结果插入65536条数据一共花30多分钟,完全出乎我的意料.于是问了一下同事,他们在处理这种大批量数据导入的时候是如何处理的,发现他们也是用的jdbc批量插入处理,但与我不同是:他们使用了con.setAutoCommit

Mybatis+mysql批量插入性能分析测试

前言 今天在网上看到一篇文章(后文中的文章指的就是它) https://www.jianshu.com/p/cce617be9f9e 发现了一种有关于mybatis批量插入的新方法,而且看了文章发现我原来的方法好像有点问题,但是由于文章中使用的环境是sqlserver而我经常使用的是mysql所以还是需要亲自来试试. 环境说明 项目使用springboot mybatis 数据库mysql5.7 使用本地mysql所以网络可以忽略不计 插入对象完全相同,只有id自增 表结构如下: CREATE

JDBC批量插入数据优化,使用addBatch和executeBatch

>>.在之前的玩转JDBC打造数据库操作万能工具类JDBCUtil,加入了高效的数据库连接池,利用了参数绑定有效防止SQL注入中其实忽略了一点,那就是SQL的批量插入的问题,如果来个for循环,执行上万次,肯定会很慢,那么,如何去优化呢? https://www.awaimai.com/841.html 一.用 preparedStatement.addBatch()配合preparedStatement.executeBatch()去批量插入 1 /** 2 * 执行数据库插入操作 4 *

jdbc批量插入操作(addBatch)

1 /** 2 * 批量插入 3 */ 4 @Test 5 public void testInsert(){ 6 Connection conn=null; 7 Statement st=null; 8 PreparedStatement pst=null; 9 try { 10 conn=DBUtils.getConn(); 11 conn.setAutoCommit(false);//事物不能自动提交 12 st=conn.createStatement(); 13 long start

HBase批量插入的简单代码

由于项目需要从HBase里读取数据,进行MapReduce之后输出到HDFS中. 为了测试方便,我这里写了一个批量插入HBase数据的测试代码.采用的Maven工程. 打算,今后的所有用到的小测试例子都放到这个工程里面了. 代码放到GitHub上面了:https://github.com/quchunhui/qchtest hbase建表命令:create 'qchtest', {NAME => 'info', VERSIONS => 1} 手动插入字段命令:put 'qchtest', 'r

DB2批量插入性能对比

import ibm_db import random import time first_names = '赵钱孙李周吴郑王冯陈褚卫蒋沈韩杨朱秦尤许何吕施张孔曹严华金魏' '陶姜戚谢邹喻柏水窦章云苏潘葛奚范彭郎鲁韦昌马苗凤花方俞任袁柳酆鲍' '史唐费廉岑薛雷贺倪汤滕殷罗毕安常乐于时傅皮卞齐康伍余元顾孟黄穆萧尹' '姚邵湛汪祁毛狄米贝明臧计伏成戴谈宋庞熊纪舒屈项祝董梁杜阮蓝闵季贾路娄' '危江童颜郭梅林刁钟徐邱骆高夏蔡田樊胡凌霍虞万柯管卢莫房缪干解丁宣邓郁单' '洪包诸左石崔龚程嵇邢裴陆翁羊惠甄

jdbc批量插入数据

//插入很多书(批量插入用法) public void insertBooks(List<Book> book) {   final List<Book> tempBook=book;   String sql="insert into book(name,pbYear) values(?,?)";   jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter()   {    public v

JDBC批量插入不生效

&rewriteBatchedStatements=true 只有把rewriteBatchedStatements参数置为true, JDBC驱动才会帮你批量执行SQL

35 JDBC批量插入数据二

package MYSQK; import java.sql.*; /** * PreparedStatement 对象可以对sql语句进行预编译,预编译的信息会存在存储该对象中,当相同的sql语句再次执行时,程序 * 会使用PrepareStatement对象中,而不需再次编译去查询数据库,大大提高了数据的访问效率 */ public class Insert { public static void main(String[] args) throws SQLException{ Conne