教你88秒插入1000万条数据到mysql数据库表

我用到的数据库为,mysql数据库5.7版本的


首先自己准备好数据库表

其实我在插入1000万条数据的时候遇到了一些问题,现在先来解决他们,一开始我插入100万条数据时候报错,控制台的信息如下:

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

出现上面的错误是因为数据库表的 max_allowed_packet 这个配置没配置足够大,因为默认的为4M的,后来我调为100M就没报错了

set global max_allowed_packet = 100*1024*1024* 

记住,设置好后重新登录数据库才能看的设置后的值

show VARIABLES like  %max_allowed_packet%

代码如下:

package insert;

importjava.sql.Connection;

importjava.sql.DriverManager;

importjava.sql.SQLException;

importjava.util.Date;

importcom.mysql.jdbc.PreparedStatement;

publicclassInsertTest{

publicstaticvoidmain(String[] args) throws ClassNotFoundException, SQLException {

finalStringurl ="jdbc:mysql://127.0.0.1/teacher";

finalStringname ="com.mysql.jdbc.Driver";

finalStringuser ="root";

finalStringpassword ="123456";

Connection conn =null;

Class.forName(name);//指定连接类型 

conn = DriverManager.getConnection(url, user, password);//获取连接 

if(conn!=null) {

System.out.println("获取连接成功");

insert(conn);

}else{

System.out.println("获取连接失败");

}

}

publicstaticvoidinsert(Connection conn) {

// 开始时间

Long begin =newDate().getTime();

// sql前缀

Stringprefix ="INSERT INTO t_teacher (id,t_name,t_password,sex,description,pic_url,school_name,regist_date,remark) VALUES ";

try{

// 保存sql后缀

StringBuffersuffix =newStringBuffer();

// 设置事务为非自动提交

conn.setAutoCommit(false);

// 比起st,pst会更好些

PreparedStatement  pst = (PreparedStatement) conn.prepareStatement("");//准备执行语句

// 外层循环,总提交事务次数

for(inti =1; i <=100; i++) {

suffix =newStringBuffer();

// 第j次提交步长

for(intj =1; j <=100000; j++) {

// 构建SQL后缀

suffix.append("( "+ uutil.UUIDUtil.getUUID()+" , "+i*j+" , 123456 "+", 男 "+", 教师 "+", www.bbk.com "+", XX大学 "+", "+"2016-08-12 14:43:26"+" , 备注 "+"),");

}

// 构建完整SQL

Stringsql = prefix + suffix.substring(0, suffix.length() -1);

// 添加执行SQL

pst.addBatch(sql);

// 执行操作

pst.executeBatch();

// 提交事务

conn.commit();

// 清空上一次添加的数据

suffix =newStringBuffer();

}

// 头等连接

pst.close();

conn.close();

}catch(SQLException e) {

e.printStackTrace();

}

// 结束时间

Long end =newDate().getTime();

// 耗时

System.out.println("1000万条数据插入花费时间 : "+ (end - begin) /1000+" s");

System.out.println("插入完成");

}

}

-END-


扩展阅读

高并发系统的设计及秒杀实践

缓存在高并发场景下的常见问题

Java面试题75:批量插入几百万条数据

分布式之数据库和缓存双写一致性方案解析

来源:https://my.oschina.net/u/3632227/blog/2347849

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文主要内容 1、JDBC 2、DBUtils 01JDBC概念和数据库驱动程序 A: JDBC概念和数据库驱动程...
    胜浩_ae28阅读 424评论 0 0
  • Java对MySQL数据库进行连接、查询和修改 一般过程:(1) 调用Class.forName()方法加载驱动程...
    彦佐阅读 1,008评论 0 2
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,874评论 18 399
  • 姹紫嫣红,五颜六色, 不是万花丛中的炫耀; 不怕烈日,不惧风雨, 却是为了人间五月天!
    一鸣0202阅读 247评论 0 5
  • 我时常会碰到这样的情况,年初的时候,定了一个又一个目标,并理性的规划,这个月要做什么,下个月要做什么,每天做多长...
    水中沙漠阅读 219评论 1 1