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; 有時間應該試試,據說效果不錯啊!

如果有亂碼問題,可以參考:http://hi.baidu.com/setcookie/item/ae43ea14403d29f9dceeca3a

 

后來補充了一個從數據庫生成CSV文件的代碼:

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 class Main {
   
    /**
     * @param args
     * @throws Exception 
     */
    public static void main(String[] args) throws Exception 
    {        
        testexportcsv();
    }
    private static void testexportcsv() 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 = new CSVReader(br);
         List<String[]> myEntries = reader.readAll();         
         System.out.println(myEntries.get(0)[3].toString());
         reader.close();
        }
    
    //根據key讀取value
    public static String readValue(String filePath,String key) {
     Properties props = new Properties();
           try {
            InputStream in = new BufferedInputStream (new FileInputStream(filePath));
            props.load(in);
            String value = props.getProperty (key);
               return value;
           } catch (Exception e) {
            e.printStackTrace();
            return null;
           }
    }
}

 

在Sqlite中我們可以使用Replace into 的方法進行更新,參考:

http://www.cnblogs.com/liping13599168/archive/2011/05/24/2054908.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM