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   語句時的性能。希望這些內容能幫助你在實際開發中更好地優化數據庫操作。如果你在使用過程中遇到任何問題,歡迎隨時在社區中提問,我們在這裏為你提供支持!