美文网首页Java库程序员BUG
教你88秒插入1000万条数据到mysql数据库表

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

作者: 程序员BUG | 来源:发表于2018-11-23 23:51 被阅读40次

我用到的数据库为,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

相关文章

网友评论

    本文标题:教你88秒插入1000万条数据到mysql数据库表

    本文链接:https://www.haomeiwen.com/subject/zpxeqqtx.html