欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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数据库表的操作方法,希望对大家有所帮助