`
islong
  • 浏览: 15036 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

java处理较大数据量到mysql

 
阅读更多



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源码包---java 源码 大量 实例

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    家庭财务管理系统(JAVA,JSP,SSM,MYSQL)

    能及时处理家庭的理财信息,且能对家庭的理财信息进行查询和统计,数据备分功能使得本系统更加完善,能有效地防止理财信息数据破坏和丢失。功能: 记账管理,债务管理,报表管理,系统管理,退出系统

    mysql-connector-java-8.0.18.zip

    数据库(Database)是按照...所以,现在我们使用关系型数据库管理系统(RDBMS)来存储和管理大数据量。所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。

    JAVA上百实例源码以及开源项目源代码

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    MySQL菜鸟详细教程

    所以,现在我们使用关系型数据库管理系统(RDBMS)来存储和管理的大数据量。所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。 • Mysql 支持大型的...

    java源码包4

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    JAVA上百实例源码以及开源项目

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    java源码包3

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    java源码包2

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    mysql 增删改查

    1、MySql.Data.dll 必须是5.6.1以上版本,否则会出现 “向信号量添加给定计数将导致其超出它的最大计数” 的问题。 2、动软代码生成时,必须增加该命名空间 using MySql.Data.MySqlClient; 3、动软代码必须修改 ...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    数据压缩,文件传输 Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧...

    Java毕业设计参考——毕业设计管理系统,技术栈SpringMVC\SSM\JSP\Mysql

    开发一个适合本校的毕业设计管理系统,不仅能够极大地减少教务管理人员的工作量,还能较大地提高学生和教师的效率。 本系统采用B/S模式,主要开发工具为Eclipse(Oxygen.1a Release),用到的编程语言有Java、...

    java-mysql药店仓库管理系统-包含源码-说明文档-演示视频.zip

    随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。...系统界面较友好,易于操作。 关键词:药店仓库管理系统网站设计 ;Java;Mysql

    47.交通事故档案管理系统-基于JSP技术+ Mysql+Java(可运行源码+数据库+开发文档+lw)

    47.交通事故档案管理系统|基于JSP技术+ Mysql+Java+Tomcat的交通事故档案管理系统设计与实现(可运行源码+数据库+开发文档+lw) 对于交通事故档案管理系统所牵扯的管理及数据保存都是非常多的,例如管理员;个人中心、...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    数据压缩,文件传输 Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧...

    课程设计-基于Java web的运动会管理系统(源码+数据库+报告).zip

    在规模上虽然不如大型运动会,但由于比赛项目较多,参赛人数广,数据处理量大且变化时效性要求高,管理较为复杂,其编排,记录,公告工作是一项复杂的工程。 为了解决在运动会管理和组织所面临的各种问题,我们开发...

    基于JAVA的自由教学平台设计开发毕业设计(含论文)

    基于JAVA的自由教学平台设计开发,主要的模块包括查看首页、个人中心、学生管理、教师管理、问题咨询管理、教学资源管理、课程信息管理、我的课程管理、学生评价管理、布置作业管理、作业提交管理、学生分数管理、...

    JAVA毕业设计管理系统

    开发一个适合本校的毕业设计管理系统,不仅能够极大地减少教务管理人员的工作量,还能较大地提高学生和教师的效率。 本系统采用B/S模式,主要开发工具为Eclipse(Oxygen.1a Release),用到的编程语言有Java、...

    基于java的教师评教系统毕业设计

    随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 基于Java的教师评教系统...系统界面较友好,易于操作。 关键词:基于Java的教师评教系统;JAVA;Mysql

Global site tag (gtag.js) - Google Analytics