Java处理30W数据入库的问题!

30W的数据保存在txt文件中,格式如下:

部门名称,部门id,上级部门id,等级

部门名称1,001,01,2 //01表示企业id
部门名称2,002,001,2
部门名称3,003,002,2

其中每条记录要插入的表有部门表,部门关系表,名片表。

问题:该如何处理这些数据保存到mysql数据库,获得较高的性能??

楼主不妨看下我的代码,处理1000万10几分钟就OK了:

[code="java"]
package net.ltan.test;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.sql.Connection;
import java.sql.DriverManager;

public class SQLTools {

    private static int failed = 0;
    private static int success = 0;
    private static final String MYSQLDRIVER = "com.mysql.jdbc.Driver";
    private static final String MYSQLURL = "jdbc:mysql://localhost:3306/db?user=root&password=&useUnicode=true&characterEncoding=utf8&autoReconnect=true";//使用时修改下数据库连接信息

    /**
     * 数据库更新
     * @param sql
     */
    public static void executeSQL(StringBuilder sql) {
            try {
                    Class.forName(MYSQLDRIVER);
                    Connection conns = DriverManager.getConnection(MYSQLURL);
                    conns.prepareStatement(sql.toString()).execute();
            } catch (Exception e) {
                    e.printStackTrace();
            }
    }

    /**
     * 把SQL批量插入数据库
     */
    public static void getSql(){
            try {
                    File file=new File("d:/csdn/");
                      String test[];
                      test=file.list();
                      for(int i=0;i<test.length;i++){
                              BufferedReader br = new BufferedReader(new FileReader(new File("d:/csdn/"+test[i])));
                              StringBuilder sb = new StringBuilder();
                              String temp = null;
                              while((temp=br.readLine())!=null){
                                      sb.append(temp);
                              }
                              System.out.println("开始导入:"+test[i]);
                              executeSQL(sb.delete(sb.length()-1, sb.length()));
                      }
            } catch (Exception e) {
                    e.printStackTrace();
            }
    }

    /**
     * 把txt转换成批量SQL
     */
    public static void toSql(){
            try {
                    StringBuilder sb = new StringBuilder();
                    BufferedReader br = new BufferedReader(new FileReader(new File("d:/www.csdn.net.sql")));//数据库地址
                    BufferedWriter bw = null;
                    String temp = null;
                    while((temp = br.readLine())!=null){
                            if (success%10000==0) {
                                    sb.append("INSERT INTO CSDN (username,password,email) VALUES ");
                                    bw = new BufferedWriter(new FileWriter(new File("d:/csdn/csdn_sql_"+(success/10000)+".txt")));//转换后存放数据库的目录
                            }
                            String str[] = temp.split("\\s#\\s");
                            if (str.length == 3) {
                                    sb.append("(");
                                    for (int i = 0; i < str.length; i++) {
                                            sb.append((i!=3-1?"'"+sqlSpecialChars(str[i])+"',":"'"+sqlSpecialChars(str[i])+"'"));//Mysql特殊字符转意
                                    }
                                    sb.append("),");
                                    bw.write(sb.toString());
                                    bw.newLine();
                                    bw.flush();
                                    sb.setLength(0);
                                    ++success;
                                    System.out.println("转换成功:"+success+"次。");
                            }else {
                                    ++failed;
                                    System.out.println("转换失败:"+failed+"次。");
                            }
                    }
                    System.out.println("转换完成,共转换:"+success+"次。失败:"+failed+"次。");
                    System.out.println("-----------------开始导入SQL到数据库--------------");
                    getSql();
            } catch (Exception e) {
                    e.printStackTrace();
            }
    }

    /**
     * 转意MYSQL中的特殊字符
     * @param str
     * @return
     */
    public static String sqlSpecialChars(String str) {
    str = str.replaceAll("\"", "\\\\\"");
    str = str.replaceAll("\\\\", "\\\\\\\\");
    str = str.replaceAll("'", "\\\\'");
    return str;
    }

    public static void main(String[] args) {
            toSql();
    }

}
[/code]

  1. 用BufferedReader一行行读。
  2. 一边读一边拼sql。
  3. 起个batch,定个阀值,超过阀值就执行下batch。

再就是
1. 先拆文件称几个小文件。
2. 分开几个线程,单独走上面的流程。

30W估计也用不到这么麻烦。

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);

如果是一次性的任务的话,用bufferedReader一行一行读,拼写sql,用navicat导入sql文件就可以了,如果是经常要这么执行的话,可以拼够1000或者5000(视系统性能而定)条就批量插入一次,花不了多少时间。

拆分txt文件+SQL批量插入

第一种方式就是编程解决,楼上有热心人提供代码,稍作修改可以用来。
第二种方式是借助工具,楼上有人提到用navicat导入,也是个不错的方式。
还有一种可以借助etl工具,例如开源的kettle,可以直接读取txt文件,设置导入规则,后往mysql表里插入。