• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

java处理较大数据量到mysql

mysql 搞代码 4年前 (2022-01-09) 24次浏览 已收录 0个评论

1、 jdbd采用批处理插入大量数据,速度还是相当的慢,一个拥有一个自增字段、三个字符串字段的表,往里面插入1W条数据消耗一分多钟。代码如下: public class DBbatchdeal {/** * * @param conn jdbc链接 * @param tableName 表明 * @param lists 数据集 * @



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

<span>public class DBbatchdeal {		/**	 * 	 * @param conn      jdbc链接	 * @param tableName 表明	 * @param lists  数据集	 * @param n      每行字段个数 出去自增字段	 * @param flag  第一列是否自增字段	 * @return  是否成功	 */	public boolean deal(Connection conn,String tableName,ArrayList 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 lists =new ArrayList();			     for(int i=0;i<10000;i++){			    	 String[] str={"1307"+i,"passwd"+i,"20130709121212"};			    	 lists.add(str);			     }			     deal.deal(conn, "testTable", lists, 3, true);			}	}</span>


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

结果如下:

Java2Sh内容如下:

<span>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 re<a>本文来源gao*daima.com搞@代#码&网6</a>tCode;		    }	   	   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();	}	}</span>


其中shh.sh内容为:

mysql -h localhost -u root -ppwd /dblog

loaddata.sql内容为:

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

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


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:java处理较大数据量到mysql

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址