java处理较大数据量到mysql

来源:互联网 发布:js求100以内相加的和 编辑:程序博客网 时间:2024/05/17 23:09


 

 1、 jdbd采用批处理插入大量数据,速度还是相当的慢,一个拥有一个自增字段、三个字符串字段的表,往里面插入1W条数据消耗一分多钟。代码如下:

   

public class DBbatchdeal {/** *  * @param conn      jdbc链接 * @param tableName 表明 * @param lists  数据集 * @param n      每行字段个数 出去自增字段 * @param flag  第一列是否自增字段 * @return  是否成功 */public boolean deal(Connection conn,String tableName,ArrayList<String[]> lists ,int n,boolean flag){StringBuffer sql = new StringBuffer();        sql.append("insert into ").append(tableName)            .append(" values(");        sql=(flag==true?sql.append("null ,"):sql);        for(int i=0;i<n-1;i++){        sql.append("?, ");        }        sql.append("?);");        int size=lists.size();        int m= (true==flag?n-1:n);                PreparedStatement preStmt=null;        long a=System.currentTimeMillis();            try {preStmt = conn.prepareStatement(sql.toString(),ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);            for(int j=0;j<size;j++){            String[] str=lists.get(j);            for(int k=0;k<n;k++){                preStmt.setString(k+1, str[k]);            }                preStmt.addBatch();                if(j%100==0){                preStmt.executeBatch();                    preStmt.clearBatch();                }            }             preStmt.executeBatch();            }            catch (SQLException e) {e.printStackTrace();}finally{try {if(null!=preStmt){preStmt.close();}} catch (SQLException e) {e.printStackTrace();}}long b=System.currentTimeMillis();System.out.println("插入"+size+"条数据所需要的时间:"+(b-a));             return true;}public static void main(String[] args) throws ClassNotFoundException, SQLException { Class.forName("com.mysql.jdbc.Driver"); Connection conn=DriverManager.getConnection("jdbc:mysql://ip***/db", "root", "pwd");     DBbatchdeal deal=new DBbatchdeal();     ArrayList<String[]> lists =new ArrayList<String[]>();     for(int i=0;i<10000;i++){     String[] str={"1307"+i,"passwd"+i,"20130709121212"};     lists.add(str);     }     deal.deal(conn, "testTable", lists, 3, true);}}


2、因为上面的方法处理的较慢,又想了个较为麻烦点儿的方式,用mysql的load data来导入数据。具体就是写段导入数据的脚本用java来执行,测试了下1w条记录插入的时间还是相当短的。

结果如下:

                         

Java2Sh内容如下:

           

import java.io.BufferedWriter;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.io.Writer;public class Java2Sh {/** * 对文件进行赋权 * @param infile  文件全路径 * @return  runtime执行返回码  */   public int chmodrun(String infile) {         int retCode = 0;      try {        Runtime rtime = Runtime.getRuntime();        Process child = rtime.exec("chmod 777 " +infile);        retCode=child.waitFor();        System.out.println("chmod :"+retCode);      }      catch (Exception e) {        System.out.println("chmod  failed "+infile);        e.printStackTrace();      }      return retCode;    }         /**     *执行脚本文件 * @param infile  文件全路径 * @return  runtime执行返回码     */   public int shellFile(String infile) {         int retCode = 0;      try {        Runtime rtime = Runtime.getRuntime();        Process child = rtime.exec("sh " +infile);        retCode=child.waitFor();        System.out.println("shell file :"+retCode);      }      catch (Exception e) {        System.out.println("shell file  failed "+infile);        e.printStackTrace();      }      return retCode;    }      public void writeData() throws IOException{//生成mysql2.txt   String str="13311122,passwds,20130710235959";   BufferedWriter out =new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File("D:\\mysql2.txt"))));   for(int i=0;i<10000;i++){   out.write(str);   out.write("\n");   }   out.flush();   out.close();   }      public static void main(String[] args) throws IOException {   Java2Sh j2=new Java2Sh();   long a=System.currentTimeMillis();   j2.chmodrun("/shh.sh");   j2.shellFile("/shh.sh");   long b=System.currentTimeMillis();   System.out.println("==========="+(b-a));//   j2.writeData();}}

其中shh.sh内容为:

    mysql -h localhost -u root -ppwd < /loaddata.sql > /dblog

loaddata.sql内容为:

use dbname;
LOAD DATA INFILE '/mysql2.txt' INTO TABLE testTable FIELDS TERMINATED BY ','  (cardnum,cardpwd,times);
commit;


介于个人水平,贴出来仅供参考,欢迎告诉我更简便高效的方式,先谢过了

原创粉丝点击