Java快速插入100W笔数据

在这里插入图片描述

Java快速插入100W笔数据


在这里插入图片描述


1.code

application.properties

server.port=8088

spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver
spring.datasource.jdbc-url=jdbc:sqlserver://10.xxx.xxx.140:1433;DatabaseName=xxxxx
spring.datasource.username=xxxx
spring.datasource.password=xxxx

controller

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Controller;


import java.math.BigDecimal;
import java.sql.*;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Random;

import static javafx.scene.input.KeyCode.CONVERT;

@Controller
public class SimulationController {


    @Value("${spring.datasource.driver-class-name}")
    private String driver;
    @Value("${spring.datasource.jdbc-url}")
    private String url;
    @Value("${spring.datasource.username}")
    private String username;
    @Value("${spring.datasource.password}")
    private String password;


    /***
     * Sqlserver 100W  20s
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public void SqlBatchInsert() throws ClassNotFoundException, SQLException {

        long start = System.currentTimeMillis();

        Class.forName(driver);
        Connection connection = DriverManager.getConnection(url, username,password);
        connection.setAutoCommit(false);

        //主键自增,从第二个栏位开始
        PreparedStatement cmd = connection.prepareStatement(
                "INSERT INTO mock_data(mock_attribute,description,mock_height,mock_salary,mock_datetime,mock_timestamp) values(?,?,?,?,?,?)");


        Timestamp now= new Timestamp(System.currentTimeMillis());

        Date date = new Date( System.currentTimeMillis());
        String time = String.valueOf(date.getTime());

        for (int num = 1; num <= 1100000; num++) {// 1000000万条数据
            cmd.setString(1, getRandomString(50));
            cmd.setString(2, createDesc());
            cmd.setInt(3,(int)(Math.random()*1000)+num);
            cmd.setBigDecimal(4,(new BigDecimal(Math.random()+num)));
            //cmd.setFloat(4,(float) (Math.random()+num));
            cmd.setTimestamp(5,now);
            cmd.setString(6,time);
            cmd.addBatch();
            if (num % 100000 == 0) {
                cmd.executeBatch();
                System.out.println("已插入:" + num);
            }
        }
        cmd.executeBatch();
        connection.commit();

        cmd.close();
        connection.close();

        long end = System.currentTimeMillis();
        System.out.println("SqlServer插入100W数据耗时:" + (end - start) / 1000 + "秒");
    }

    //指定长度的随机字符串
    public String getRandomString(int length){
        String str="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        Random random=new Random();
        StringBuffer sb=new StringBuffer();
        for(int i=0;i<length;i++){
            int number=random.nextInt(62);
            sb.append(str.charAt(number));
        }
        return sb.toString();
    }
    
    //随机长度的随机字符串
    public String createDesc(){

        int result = (int)(Math.random()*100);
        return getRandomString(result);
    }
}

2.数据类型对比

在这里插入图片描述

3.特殊情况

  • 遇到一个不太好搞定的类型decimal
    在这里插入图片描述
  • 偶尔double转过来就会有溢出的问题
    Arithmetic overflow error converting numeric to data type numeric
    在这里插入图片描述
  • 最后循环套循环,终于插完了100W笔
        for(int x = 1 ;x <= 1000; x++){
            for (int num = 1; num <= 1000; num++) {// 1000000万条数据
                cmd.setString(1, getRandomString(50));
                cmd.setString(2, createDesc());
                cmd.setInt(3,(int)(Math.random()*1000)+num);
                cmd.setBigDecimal(4,(new BigDecimal(Math.random()+num)));
                //cmd.setFloat(4,(float) (Math.random()+num));
                cmd.setTimestamp(5,now);
                cmd.setString(6,time);
                cmd.addBatch();
                if (num % 100000 == 0) {
                    cmd.executeBatch();
                    System.out.println("已插入:" + num);
                }
            }
            cmd.executeBatch();
            connection.commit();
            System.out.println(x);
        }

        cmd.close();
        connection.close();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

百世经纶『一页書』

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值