88秒插入1000万条数据到MySQL数据库表的操作方法
程序员文章站
2022-10-31 17:36:18
我用到的数据库为,mysql数据库5.7版本的
首先自己准备好数据库表
其实我在插入1000万条数据的时候遇到了一些问题,现在先来解决他们,一开始我插入100万条数据时...
我用到的数据库为,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; import java.sql.connection; import java.sql.drivermanager; import java.sql.sqlexception; import java.util.date; import com.mysql.jdbc.preparedstatement; public class inserttest { public static void main(string[] args) throws classnotfoundexception, sqlexception { final string url = "jdbc:mysql://127.0.0.1/teacher" ; final string name = "com.mysql.jdbc.driver" ; final string user = "root" ; final string password = "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( "获取连接失败" ); } } public static void insert(connection conn) { // 开始时间 long begin = new date().gettime(); // sql前缀 string prefix = "insert into t_teacher (id,t_name,t_password,sex,description,pic_url,school_name,regist_date,remark) values " ; try { // 保存sql后缀 stringbuffer suffix = new stringbuffer(); // 设置事务为非自动提交 conn.setautocommit( false ); // 比起st,pst会更好些 preparedstatement pst = (preparedstatement) conn.preparestatement( "" ); //准备执行语句 // 外层循环,总提交事务次数 for ( int i = 1 ; i <= 100 ; i++) { suffix = new stringbuffer(); // 第j次提交步长 for ( int j = 1 ; j <= 100000 ; j++) { // 构建sql后缀 suffix.append( "('" + uutil.uuidutil.getuuid()+ "','" +i*j+ "','123456'" + ",'男'" + ",'教师'" + ",'www.bbk.com'" + ",'xx大学'" + ",'" + "2016-08-12 14:43:26" + "','备注'" + ")," ); } // 构建完整sql string sql = prefix + suffix.substring( 0 , suffix.length() - 1 ); // 添加执行sql pst.addbatch(sql); // 执行操作 pst.executebatch(); // 提交事务 conn.commit(); // 清空上一次添加的数据 suffix = new stringbuffer(); } // 头等连接 pst.close(); conn.close(); } catch (sqlexception e) { e.printstacktrace(); } // 结束时间 long end = new date().gettime(); // 耗时 system.out.println( "1000万条数据插入花费时间 : " + (end - begin) / 1000 + " s" ); system.out.println( "插入完成" ); } }
总结
以上所述是小编给大家介绍的88秒插入1000万条数据到mysql数据库表的操作方法,希望对大家有所帮助