OPTOFC 參數介紹
OPTOFC 是 "optimize-OPEN-FETCH-CLOSE" 的縮寫,正如其名,該參數主要用於優化 JDBC 中的 PreparedStatement 執行 SELECT 語句時的性能。
具體來説, OPTOFC 通過減少網絡請求次數來提高性能,適用於以下場景:
1. 當前 Statement 對象是 PreparedStatement 的實例。
2. 執行的是 SELECT 語句。
3. ResultSet 的類型為 ResultSet.TYPE_FORWARD_ONLY 。
4. ResultSet 的併發類型為 ResultSet.CONCUR_READ_ONLY 。
作用
1. 減少網絡請求:在未使用 OPTOFC 時, OPEN 和 FETCH 消息會分別發送,導致兩次網絡往返。使用 OPTOFC 後,這兩個消息會在同一次網絡請求中一起發送,從而減少一次網絡往返。
2. 自動關閉遊標:如果一次性將所有行從數據庫中取出,服務器會自動關閉遊標。在 ResultSet.close() 時,可以減少一次網絡請求。
開啓方法
通過在 JDBC URL 中添加 OPTOFC=1 來開啓 OPTOFC 優化:
jdbc:gbasedbt-sqli://:/:OPTOFC=1
作用1、“OPEN”和“FETCH”消息會在同一次網絡請求中一起發送,如果不使用OPTOFC,就有2次往返(如果沒有變長列,也只有1次網絡往返)
作用2、如果一次把所有行從庫裏FETCH出來,那麼server會自動關閉遊標,ResultSet.close()時,可以減少一次網絡請求
示例1.無變長列
數據準備:
create database testdb with log;
create table t1(name varchar(10));
insert into t1 values('GBase8s');
(1)URL未添加加OPTOFC
@Test
public void test1() throws SQLException {
String url = "jdbc:gbasedbt-sqli://192.168.226.180:12888/testdb";
try (Connection conn = DriverManager.getConnection(url, "gbasedbt", "111111")) {
long startTime = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {
try (PreparedStatement ps = conn.prepareStatement("SELECT * FROM t1");
ResultSet rs = ps.executeQuery()) {
rs.next();
}
}
System.out.println("time:" + (System.currentTimeMillis() - startTime));
}
}
輸出:
time:2822
URL添加OPTOFC=1
@Test
public void test1() throws SQLException {
String url = "jdbc:gbasedbt-sqli://192.168.226.180:12888/testdb:OPTOFC=1";
try (Connection conn = DriverManager.getConnection(url, "gbasedbt", "111111")) {
long startTime = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {
try (PreparedStatement ps = conn.prepareStatement("SELECT * FROM t1");
ResultSet rs = ps.executeQuery()) {
rs.next();
}
}
System.out.println("time:" + (System.currentTimeMillis() - startTime));
}
}
輸出:
time:1697
示例2.有變長列
數據準備:
create table t2(name char(10));
insert into t2 values('Gbase8s');
(1)URL沒加OPTOFC
輸出:
time:2276
有變長列時,即使沒加OPTOFC=1,OPEN和FETCH也是一起發送的,所以time短
(2)URL添加OPTOFC=1
輸出:
time:1679
示例3.不滿足 ResultSet.TYPE_FORWARD_ONLY
@Test
public void test1() throws SQLException {
String url = "jdbc:gbasedbt-sqli://192.168.226.180:12888/testdb:OPTOFC=1";
try (Connection conn = DriverManager.getConnection(url, "gbasedbt", "111111")) {
long startTime = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {
try (PreparedStatement ps = conn.prepareStatement("SELECT * FROM t1", ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
ResultSet rs = ps.executeQuery()) {
rs.next();
}
}
System.out.println("time:" + (System.currentTimeMillis() - startTime));
}
}
輸出:
time:2848
結論:不滿足條件時,OPTOFC=1 無效。
通過本文的介紹,希望你已經瞭解了 GBase 8s JDBC 參數 OPTOFC 的作用、使用方法以及通過實際示例驗證其優化效果。 OPTOFC 參數通過減少網絡請求次數,顯著提高了 PreparedStatement 執行 SELECT 語句時的性能。希望這些內容能幫助你在實際開發中更好地優化數據庫操作。如果你在使用過程中遇到任何問題,歡迎隨時在社區中提問,我們在這裏為你提供支持!