标签:
最近工作碰到一个问题,如何将大量数据(100MB+)导入到远程的mysql server上。
尝试1:
Statement执行executeBatch的方法。每次导入1000条记录。时间为12s/1000条。比较慢。
对于1M次的插入这意味着需要4个多小时,期间还会因为网络状况,数据库负载等因素而把载入延迟提升到85s/1000条甚至更高。
效果较差。
尝试2:
使用PreparedStatement,该方法需要预先给定insert操作的“格式”。
实测用这种方式插入的效率为每秒钟数十行。
注意,将rewriteBatchedStatements设为true之后,在不到一分钟时间里面就将78万条数据全部导入数据库了。这是一个行之有效的方法。
代码:
1 import java.io.BufferedReader; 2 import java.io.FileReader; 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.PreparedStatement; 6 7 /** 8 * 9 */ 10 public class PreparedStatementTestMain { 11 private static PreparedStatement ps; 12 public static void main(String[] args) { 13 try{ 14 Class.forName("com.mysql.jdbc.Driver"); 15 Connection conn = DriverManager.getConnection("jdbc:mysql://remote-host/test?user=xxx&password=xxx"); 16 String sql = "insert into test values(?,?,?,?,?,?,?,?,?,?,?)"; 17 ps = conn.prepareStatement(sql); 18 19 BufferedReader in = new BufferedReader(new FileReader("xxxx")); 20 String line; 21 int count =0; 22 while((line = in.readLine())!=null){ 23 count+=1; 24 String[] values = line.split("\t",-1); 25 //ps.setInt(1,count); 26 for(int i =1;i<values.length;i++) { 27 // if(i==6){ 28 // ps.setInt(i+1,Integer.parseInt(values[i])); 29 // }else{ 30 // if(values[i]==null){ 31 // ps.setString(i," "); 32 // }else { 33 ps.setString(i, values[i]); 34 // } 35 // } 36 } 37 ps.addBatch(); 38 System.out.println("Line "+count); 39 } 40 ps.executeBatch(); 41 ps.close(); 42 }catch(Exception e){ 43 e.printStackTrace(); 44 } 45 } 46 }
尝试3:
使用mysqlimport工具。经过实测,速度接近于尝试2中加上rewriteBatchedStatements之后的速度。不过前提是数据必须要保存为文件。
rewriteBatchedStatements到底为什么对速度优化这个多?
一种说法:这样做的目的是为了让mysql能够将多个mysql insert语句打包成一个packet和mysql服务器通信。这样可以极大降低网络开销。
另一种说法:
Rewriting Batches
? “rewriteBatchedStatements=true”
? Affects (Prepared)Statement.add/executeBatch()
? Core concept - remove latency
? Special treatment for prepared INSERT statements
——Mark Matthews - Sun Microsystems
PreparedStatement VS Statement
数据库系统会对sql语句进行预编译处理(如果JDBC驱动支持的话),预处理语句将被预先编译好,这条预编译的sql查询语句能在将来的使用中重用。
标签:
原文地址:http://www.cnblogs.com/xiamodeqiuqian/p/5150743.html