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查询语句能在将来的使用中重用。
mysql批量数据导入探究
标签: