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;
介于个人水平,贴出来仅供参考,欢迎告诉我更简便高效的方式,先谢过了。