服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - Java怎么实现几十万条数据插入

Java怎么实现几十万条数据插入

2023-10-11 14:54共饮一杯无 Java教程

Java怎么实现几十万条数据插入?30万条数据插入MySQL仅需13秒,本文主要讲述通过MyBatis、JDBC等做大数据量数据插入的案例和结果。

本文主要讲述通过MyBatis、JDBC等做大数据量数据插入的案例和结果。

验证的数据库表结构如下:

CREATE TABLE `t_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户id',
  `username` varchar(64) DEFAULT NULL COMMENT '用户名称',
  `age` int(4) DEFAULT NULL COMMENT '年龄',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户信息表';

话不多说,开整!

实体类、mapper和配置文件定义

User实体
/**
 * 

用户实体

* * @Author zjq * @Date 2021/8/3 */ @Data public class User {private int id; private String username; private int age; }
mapper接口
public interface UserMapper {

    /**
     * 批量插入用户
     * @param userList
     */
    void batchInsertUser(@Param("list") List userList);


}
mapper.xml文件
    
    
        insert into t_user(username,age) values
        
            (
            #{item.username},
            #{item.age}
            )
        
    
jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.password=root
sqlMapConfig.xml




    
    


    
    
        
    


    
    
        
            
            
                
                
                
                
            
        
    


    
    
        
    




不分批次直接梭哈

MyBatis直接一次性批量插入30万条,代码如下:

    @Test
    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();
        try {
            List userList = new ArrayList<>();
            for (int i = 1; i <= 300000; i++) {
                User user = new User();
                user.setId(i);
                user.setUsername("共饮一杯无 " + i);
                user.setAge((int) (Math.random() * 100));
                userList.add(user);
            }
            session.insert("batchInsertUser", userList); // 最后插入剩余的数据
            session.commit();

            long spendTime = System.currentTimeMillis()-startTime;
            System.out.println("成功插入 30 万条数据,耗时:"+spendTime+"毫秒");
        } finally {
            session.close();
        }
    }

可以看到控制台输出:

Cause: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (27759038 >yun 4194304). You can change this value on the server by setting the max_allowed_packet’ variable.

Java怎么实现几十万条数据插入

超出最大数据包限制了,可以通过调整max_allowed_packet限制来提高可以传输的内容,不过由于30万条数据超出太多,这个不可取,梭哈看来是不行了

延伸 · 阅读

精彩推荐