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;
介于个人水平,贴出来仅供参考,欢迎告诉我更简便高效的方式,先谢过了。
- java处理较大数据量到mysql
- OracleBulkCopy处理数据量较大时超时问题
- 数据量较大时,把数据放入缓存中的处理办法
- mysql大数据量处理
- mysql大数据量处理
- $http传输数据量较大
- ibatis配置(mysql数据库) 大数据量处理
- PHPExcel导出数据量较大时内存溢出
- mysql调优及MySql 处理超大数据量
- Mysql MERGE分表对大数据量的处理
- mysql 数据库处理高并发、 大数据量 .日常军规
- webservice传输数据量较大的情况的解决方案
- oracle数据库数据量较大时更新数据较慢问题
- IE浏览器下载excel数据量较大时第一次下载失败
- 当数据量较大时,两个tab切换的效率问题
- 冒泡排序法,适合不是较大数据量的排序
- Mysql——添加表字段到数据较大表导致表锁死
- java导出dbf文件大数据量的处理方法
- 杭电ACM 2024 C语言合法标识符
- 杭电ACM 2026 首字母变大写
- 杭电ACM 2025 查找最大元素
- 杭电ACM 2500 做一个正气的杭电人
- 杭电ACM 1.1.8 A+B for Input-Output Practice (VIII)
- java处理较大数据量到mysql
- 杭电ACM 2003 求绝对值
- 杭电ACM 2033 人见人爱A+B
- 杭电ACM 2017 字符串统计
- 【编程之美】一摞烙饼的排序 原文地址http://blog.csdn.net/tianshuai11/article/details/7659673
- 杭电ACM 2027 统计元音
- 杭电 2029 Palindromes _easy version
- 杭电ACM 2030 杨辉三角
- 杭电ACM 2040 亲和数