JDBC優化之Batch、Fetch
Batch和Fetch兩個特性非常重要。
Batch相當於JDBC的寫緩衝,Fetch相當於讀緩衝。
JDBC插入比較,相差25倍
不帶Batch 28189ms
Batch 1108ms
JDBC讀取比較,相差4倍
不帶Fetch 3120ms
Fetch 764ms
如果把JDBC類比為JAVA IO的話,
不使用Fetch和Batch相當於直接使用FileInputStream和FileOutputStream
而設定了Fetch和Batch相當於使用BufferedInputStream和BufferedOutputStream
Batch相當於JDBC的寫緩衝,Fetch相當於讀緩衝。
-
import java.sql.Connection;
-
import java.sql.DriverManager;
-
import java.sql.PreparedStatement;
-
import java.sql.ResultSet;
-
import java.sql.SQLException;
-
import java.util.ArrayList;
-
import java.util.List;
-
-
public class Test {
-
private static int _1W = 10000;
-
private static List<String> list = new ArrayList<String>(100 * _1W);
-
static {
-
for (int i = 0; i < 10 * _1W; i++) {
-
list.add(String.valueOf(i));
-
}
-
}
-
-
public static void main(String[] args) throws ClassNotFoundException, SQLException {
-
long start = System.currentTimeMillis();
-
fetchRead();
-
long end = System.currentTimeMillis();
-
System.out.println((end - start) + "ms");
-
}
-
-
public static void batchWrite() throws SQLException, ClassNotFoundException {
-
// 1108ms
-
Class.forName("oracle.jdbc.OracleDriver");
-
Connection connection = DriverManager.getConnection("jdbc:oracle:thin:127.0.0.1:1521:orcl", "xxx", "xxx");
-
connection.setAutoCommit(false);
-
PreparedStatement cmd = connection.prepareStatement("insert into t values(?)");
-
for (int i = 0; i < list.size(); i++) {
-
cmd.setString(1, list.get(i));
-
cmd.addBatch();
-
if (i % _1W == 0) {
-
cmd.executeBatch();
-
}
-
}
-
cmd.executeBatch();
-
connection.commit();
-
}
-
-
public static void jdbcWrite() throws ClassNotFoundException, SQLException {
-
// 28189ms
-
Class.forName("oracle.jdbc.OracleDriver");
-
Connection connection = DriverManager.getConnection("jdbc:oracle:thin:127.0.0.1:1521:orcl", "xxx", "xxx");
-
connection.setAutoCommit(false);
-
PreparedStatement cmd = connection.prepareStatement("insert into t values(?)");
-
for (String s : list) {
-
cmd.setString(1, s);
-
cmd.execute();
-
}
-
connection.commit();
-
}
-
-
public static void jdbcRead() throws ClassNotFoundException, SQLException {
-
// 3120ms
-
Class.forName("oracle.jdbc.OracleDriver");
-
Connection connection = DriverManager.getConnection("jdbc:oracle:thin:127.0.0.1:1521:orcl", "xxx", "xxx");
-
connection.setAutoCommit(false);
-
PreparedStatement cmd = connection.prepareStatement("select * from t");
-
ResultSet rs = cmd.executeQuery();
-
int i = 0;
-
while (rs.next()) {
-
rs.getString(1);
-
i = i + 1;
-
}
-
System.out.println("count:" + i);
-
}
-
-
public static void fetchRead() throws ClassNotFoundException, SQLException {
-
//764ms
-
Class.forName("oracle.jdbc.OracleDriver");
-
Connection connection = DriverManager.getConnection("jdbc:oracle:thin:127.0.0.1:1521:orcl", "xxx", "xxx");
-
connection.setAutoCommit(false);
-
PreparedStatement cmd = connection.prepareStatement("select * from t");
-
cmd.setFetchSize(_1W);
-
ResultSet rs = cmd.executeQuery();
-
int i = 0;
-
while (rs.next()) {
-
rs.getString(1);
-
i = i + 1;
-
}
-
System.out.println("count:" + i);
-
}
- }
不帶Batch 28189ms
Batch 1108ms
JDBC讀取比較,相差4倍
不帶Fetch 3120ms
Fetch 764ms
如果把JDBC類比為JAVA IO的話,
不使用Fetch和Batch相當於直接使用FileInputStream和FileOutputStream
而設定了Fetch和Batch相當於使用BufferedInputStream和BufferedOutputStream
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1063033/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- jdbc batchJDBCBAT
- 聊聊jdbc的batch操作JDBCBAT
- JDBC優化策略總結JDBC優化
- JDBC批量Insert深度優化JDBC優化
- 【效能優化】消除行遷移 table fetch continued row優化
- MSSQL優化之索引優化SQL優化索引
- CUDA優化之指令優化優化
- Oracle arraysize 和 fetch size 引數 與 效能優化 說明Oracle優化
- sql優化之邏輯優化SQL優化
- MySQL 效能優化之索引優化MySql優化索引
- MySQL 效能優化之SQL優化MySql優化
- 【BATCH】BATCH-CopyBAT
- Android優化之佈局優化Android優化
- web前端優化之圖片優化Web前端優化
- TableView 優化之資料模型優化View優化模型
- Web效能優化之圖片優化Web優化
- 最優化之無約束優化優化
- CUDA程式優化心得之序列優化優化
- Webpack之模組化優化Web優化
- JDBC 批量插入資料優化, 使用 addBatch 和 executeBatchJDBC優化BAT
- Java 之 JDBCJavaJDBC
- Java之JDBCJavaJDBC
- Java之JDBC①JavaJDBC
- MySQL調優之索引優化MySql索引優化
- Android效能優化之佈局優化Android優化
- MySQL優化之系統變數優化MySql優化變數
- SQL Server優化之SQL語句優化SQLServer優化
- oracle優化一例之sql優化Oracle優化SQL
- ajax、axios、fetch之間的詳細區別以及優缺點iOS
- 前端技術整理之fetch前端
- 效能優化之 NSDateFormatter優化ORM
- 資料庫優化之臨時表優化資料庫優化
- Android效能優化篇之服務優化Android優化
- 九、Android效能優化之網路優化Android優化
- Android 效能優化之記憶體優化Android優化記憶體
- Android 效能優化(八)之網路優化Android優化
- MySQL 效能優化之快取引數優化MySql優化快取
- Java 之 JDBC(二)JavaJDBC