首页 > 数据库 >mysql批量插入1000万条数据优化方式

mysql批量插入1000万条数据优化方式

时间:2024-03-18 10:37:32浏览次数:24  
标签:String 数据库 System 插入 connection 万条 mysql 连接池 1000

方式一、mybatis实现

public  void  testBatchInsertUser()  throws  IOException {    
  InputStream  resourceAsStream  =             Resources.getResourceAsStream("sqlMapConfig.xml");    
  SqlSessionFactory  sqlSessionFactory  =  new  SqlSessionFactoryBuilder().build(resourceAsStream);    
  SqlSession  session  =  sqlSessionFactory.openSession();    
  System.out.println("===== 开始插入数据 =====");    
  long  startTime  =  System.currentTimeMillis();    
  int  waitTime  =  10;    
  try 
  {        
    List < User >  userList  =  new  ArrayList < > ();        
    for (int  i  =  1;  i  <=  1000000;  i++) 
    {            
      User  user  =  new  User();            
      user.setId(i);            
      user.setUsername("i "  +  i);            
      user.setAge((int) (Math.random()  *  100));            
      userList.add(user);            
      if (i  %  1000  ==  0) 
      {                
        session.insert("batchInsertUser",  userList);                
        // 每 1000 条数据提交一次事务                
        session.commit();                
        userList.clear();                
        // 等待一段时间                
        Thread.sleep(waitTime  *  10);            
      }        
    }        
    // 最后插入剩余的数据        
    if(!CollectionUtils.isEmpty(userList)) 
    {            
      session.insert("batchInsertUser",  userList);            
      session.commit();        
    }        
    long  spendTime  =  System.currentTimeMillis() - startTime;        
    System.out.println("成功插入 100 万条数据,耗时:" + spendTime + "毫秒");    
  } 
  catch (Exception  e) 
  {        
    e.printStackTrace();    
  } 
  finally 
  {        
    session.close();    
  }
}

这里循环插入注意两点一是调整合适的等待时间,防止出现内存占用过高问题,第二点调整配置文件设置合理的连接池和数据库参数;cpu和磁盘性能足够则直接批处理即可

方式二、JDBC插入

public  void  testJDBCBatchInsertUser()  throws  IOException 
{    
  Connection  connection  =  null;    
  PreparedStatement  preparedStatement  =  null;    
  String  databaseURL  =  "jdbc:mysql://localhost:3306/t_test";    
  String  user  =  "root";    
  String  password  =  "123456";    
  try 
  {        
    connection  =  DriverManager.getConnection(databaseURL,  user,  password);        
    // 关闭自动提交事务,改为手动提交        
    connection.setAutoCommit(false);        
    System.out.println("===== 开始插入数据 =====");        
    long  startTime  =  System.currentTimeMillis();        
    String  sqlInsert  =  "INSERT INTO t_user ( username, age) VALUES ( ?, ?)";        
    preparedStatement  =  connection.prepareStatement(sqlInsert);        
    Random  random  =  new  Random();        
    for (int  i  =  1;  i  <=  300000;  i++) 
    {            
      preparedStatement.setString(1,  "i"  +  i);            
      preparedStatement.setInt(2,  random.nextInt(100));            
      // 添加到批处理中            
      preparedStatement.addBatch();            
      if (i  %  1000  ==  0) 
      {                
        // 每1000条数据提交一次                
        preparedStatement.executeBatch();                
        connection.commit();                
        System.out.println("成功插入第 " +  i + " 条数据");            
      }        
    }         // 处理剩余的数据        
    preparedStatement.executeBatch();        
    connection.commit();        
    long  spendTime  =  System.currentTimeMillis() - startTime;        
    System.out.println("成功插入 100 万条数据,耗时:" + spendTime + "毫秒");    
  } 
  catch (SQLException  e) 
  {        
    System.out.println("Error: "  +  e.getMessage());    
  } 
  finally 
  {        
    if (preparedStatement  !=  null) 
    {            
      try 
      {                
        preparedStatement.close();            
      } 
      catch (SQLException  e) 
      {                
        e.printStackTrace();            
      }        
    }        
    if (connection  !=  null) 
    {            
      try 
      {                
        connection.close();            
      } 
      catch (SQLException  e) 
      {                
        e.printStackTrace();            
      }        
    }    
  }
}

//具体步骤

  • 获取数据库连接
  • 创建statement对象
  • 定义sql语句,使用preparedStatment对象
  • 执行批处理操作
  • 处理剩余数据
  • 关闭Statement和Connection对象

 

总结

1. 批处理,调整批量提交的数量,降低网络传输和处理开销、减少与数据库交互次数。在Java中可以使用Statment或者preparedStatment的addBatch()语句,一次性执行批量sql;设置合理等待时间。

2. 索引,在大量数据插入前暂时去掉索引,最后再打上,这样可以大大减少写入时候的更新索引的时间。

3. 数据库连接池,使用数据库连接池可以减少数据库连接建立和关闭的开销,提高性能。在没有使用数据库连接池的情况,记得在finally中关闭相关连接

 

标签:String,数据库,System,插入,connection,万条,mysql,连接池,1000
From: https://www.cnblogs.com/cgy-home/p/18079800

相关文章

  • 前端快速处理几十万条数据的方式?
    在前端处理大量数据时,可以采用以下几种方式来提高处理速度和性能:数据分页:将数据分成多个页面,并按需加载。只加载当前页面的数据,而不是一次性加载全部数据。这可以减少初始加载时间和内存占用,并提高用户体验。虚拟滚动:对于需要展示大量列表或表格数据的情况,可以使用虚......
  • Redis作为缓存,MySQL数据库如何与Redis保持一致性(双写一致性)?
    Redis作为缓存,MySQL数据库如何与Redis保持一致性(双写一致性)?双写一致性:​ 修改了数据库中的数据的同时,也要更新缓存的数据,保证数据库和缓存中的数据保持一致。请求数据的执行流程:​ 请求去访问Redis,如果Redis缓存中有数据则返回数据,如果Redis缓存中没有数据则去查数据库,数......
  • 捉虫日记 | MySQL 8.0从库某些情况下记录重放的CREATE TABLE、DROP TABLE语句到慢日志
    作者:卢文双资深数据库内核研发本文首发于2023-11-3020:47:35https://dbkernel.com问题描述当主从复制采用binlog的行模式时,如果从库启用slow_query_log、log_slow_replica_statements且从库重放CREATETABLE、DROPTABLE时因特殊情况(比如被从库其他SQL占用MDL......
  • Red Hat Enterprise Linux 7 / Oracle Linux 7 安装 MySQL
    如果你的系统只支持RedHatEnterpriseLinux7/OracleLinux7,并且你已经下载了`mysql80-community-release-el7-11.noarch.rpm`包,那么你可以按照以下步骤来安装MySQL:1.首先,使用`rpm`命令来安装`mysql80-community-release-el7-11.noarch.rpm`包:```bashsudorp......
  • Linux安装jdk和mysql
    Linux安装jdk和mysqlJDK安装操作步骤:使用FinalShell自带的上传工具将jdk的二进制发布包上传到Linux空jdk-8u171-inux-x64.tar.gz(这里注意自己的路径即可)解压安装包,命令为tar-zxvfjdk-8u171-linux-x64.tar.gz-C/usr/local配置环境变量,使用vim命令修改/etc/profile文件,在文件......
  • 诚意满满之MySQL实现事务隔离的秘诀:锁与MVCC
    如果对事务没有太多理解,可以看前面三篇:诚意满满之讲透事务诚意满满之讲透事务隔离级别诚意满满之MySQL如何实现原子性、持久性不看前三篇也没有关系,知识点是独立的。MySQL的四个事务隔离级别:读未提交、读已提交、可重复读、串行读。其中,读未提交即是不加任何限制,串行读则......
  • mysql 获取临时密码
    安装MySQL服务器后,你需要进行初始化设置。以下是一些基本步骤:1.**启动MySQL服务器**```bashsudosystemctlstartmysqld```2.**获取临时密码**在首次启动MySQL服务器时,系统会为root用户生成一个临时密码。你可以通过查看MySQL日志来获取这个临时密码:```bashsudo......
  • mysql数据库的安装(图文详解)
    如果之前电脑有装过mysql数据库,一定要卸载干净,再重新安装!!!卸载教程点击下面这个链接https://www.cnblogs.com/wbxh/articles/180792221、下载mysql的安装包下载地址https://dev.mysql.com/downloads/installer/2、开始mysql的安装(这里以5.7为例)3、安装完成......
  • 疫苗接种管理系统(JSP+java+springmvc+mysql+MyBatis)
    本项目包含程序+源码+数据库+LW+调试部署环境,文末可获取一份本项目的java源码和数据库参考。项目文件图 项目介绍疫苗接种管理系统是一种旨在提高疫苗注射效率、确保接种记录准确性的信息系统。在全球疫情常态化防控的背景下,此类系统对于实现疫苗的快速分发、接种情况追......
  • 养老公寓管理系统(JSP+java+springmvc+mysql+MyBatis)
    本项目包含程序+源码+数据库+LW+调试部署环境,文末可获取一份本项目的java源码和数据库参考。项目文件图 项目介绍随着社会老龄化的加速,养老服务成为社会关注的焦点。养老公寓作为服务老年人群的重要居住形式,其管理水平直接影响到老年人的生活质量和家属的满意度。一个功......