java批量写入数据到本地_java连接mysql批量写入数据

1、采用公认的MYSQL最快批量提交办法

public void index() throws UnsupportedEncodingException,

Exception

{

//1000个一提交

int COMMIT_SIZE=25000;

//一共多少个

int COUNT=100000;

long a=System.currentTimeMillis();

Connection conn= null;

try {

Class.forName("com.mysql.jdbc.Driver"); String

url="jdbc:mysql://10.10.3.13/new_lxyy_db?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true";

String user="root";

String password="dsideal";

conn= DriverManager.getConnection(url,user,password);

long starTime = System.currentTimeMillis();

conn.setAutoCommit(false);

PreparedStatement pstmt = conn.prepareStatement("load data local

infile '' "+ "into table loadtest fields terminated by

','");

StringBuilder sb = new StringBuilder();

for (int i = 1; i <= COUNT; i++)

{

sb.append(i + "," + i+"abc" + "\n");

if (i % COMMIT_SIZE == 0) {

InputStream is = new

ByteArrayInputStream(sb.toString().getBytes());

((com.mysql.jdbc.Statement)

pstmt).setLocalInfileInputStream(is);

pstmt.execute();

conn.commit();

sb.setLength(0);

}

}

InputStream is = new

ByteArrayInputStream(sb.toString().getBytes());

((com.mysql.jdbc.Statement)

pstmt).setLocalInfileInputStream(is);

pstmt.execute();

conn.commit();

long endTime = System.currentTimeMillis();

System.out.println("program runs " + (endTime - starTime) +

"ms");

} catch (SQLException e) {

e.printStackTrace();

}finally{

conn.close();

}

//在最好的一行加上:

System.out.println("\r插入数据条数:"+COUNT+",提交的阀值:"+COMMIT_SIZE+",执行耗时 :

"+(System.currentTimeMillis()-a)/1000f+" 秒 ");

renderNull();

}

2、对于表采用MyIsam引擎,效果嗷嗷的!

插入数据条数:40000,提交的阀值:1000,执行耗时 : 0.379 秒 插入数据条数:40000,提交的阀值:500,执行耗时 : 0.527 秒 插入数据条数:40000,提交的阀值:2000,执行耗时 : 0.306 秒 插入数据条数:40000,提交的阀值:5000,执行耗时 : 0.253 秒 插入数据条数:40000,提交的阀值:10000,执行耗时 : 0.198 秒 插入数据条数:40000,提交的阀值:15000,执行耗时 : 0.197 秒

插入数据条数:40000,提交的阀值:20000,执行耗时 : 0.255 秒 插入数据条数:40000,提交的阀值:25000,执行耗时 : 0.208 秒

插入数据条数:100000,提交的阀值:25000,执行耗时 : 0.402 秒

以上数据是在吴缤的MYSQL机器上获取的,我的机器上的海豚数据如下:

插入数据条数:100000,提交的阀值:25000,执行耗时 : 0.226 秒

注:后来黄海在研究如何批量更新数据时,找到了如下的方法:

把数据保存到一个文本文件中,字段间用TAB分隔,然后在mysql中执行

LOAD DATA INFILE "/PATH/oo.txt" REPLACE INTO TABLE xx;

有时间应该试试,据说效果不错啊!

后来补充了一个从数据库生成CSV文件的代码:

a4c26d1e5885305701be709a3d33442f.png

import java.io.BufferedInputStream;

import java.io.BufferedReader;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.FileReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import java.util.List;

import java.util.Properties;

import au.com.bytecode.opencsv.CSVReader;

import au.com.bytecode.opencsv.CSVWriter;public classMain {

public static voidmain(String[] args) throws Exception

{

testexportcsv();

}private static voidtestexportcsv() throws IOException, SQLException, ClassNotFoundException

{//当前目录

String v_path=Main.class.getResource("/").getPath()+"dsideal_config.properties";//读取配置信息

String driverClass = readValue(v_path, "driverClass");

String jdbcUrl=readValue(v_path, "jdbcUrl");

String user=readValue(v_path, "user");

String password=readValue(v_path, "password");

File tempFile= new File("c:/allbill.csv");//加载驱动程序

Class.forName(driverClass);//连续数据库

Connection conn =DriverManager.getConnection(jdbcUrl, user, password);if(!conn.isClosed())

{//生成 UTF-8格式的CSV文件

OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(tempFile),"UTF-8");//statement用来执行SQL语句

Statement stmt=conn.createStatement();//要执行的SQL语句

String sql = "select * from t_resource_structure";

ResultSet rs=stmt.executeQuery(sql);

CSVWriter writer= new CSVWriter(osw,',');

writer.writeAll(rs,false);

writer.close();

rs.close();

stmt.close();

}

conn.close();//测试一下读取

BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(tempFile.getAbsolutePath()),"UTF-8"));

CSVReader reader= newCSVReader(br);

List myEntries =reader.readAll();

System.out.println(myEntries.get(0)[3].toString());

reader.close();

}//根据key读取value

public staticString readValue(String filePath,String key) {

Properties props= newProperties();try{

InputStreamin = new BufferedInputStream (newFileInputStream(filePath));

props.load(in);

String value=props.getProperty (key);returnvalue;

}catch(Exception e) {

e.printStackTrace();return null;

}

}

}

a4c26d1e5885305701be709a3d33442f.png

在Sqlite中我们可以使用Replace into

的方法进行更新,参考:

转:http://www.cnblogs.com/littlehb/archive/2013/07/19/3200955.html

你可能感兴趣的:(java批量写入数据到本地)