2014-10-10 104 views
28

我一直在看周圍,hereherehere有關使用rewriteBatchedStatements=trueMySQL和JDBC與rewriteBatchedStatements =真

的優勢。如果我的理解是正確的,與rewriteBatchedStatements=true的JDBC將儘可能多的查詢,可能集成到一個網絡數據包中,從而降低網絡開銷。我對嗎?

然後它引起我的注意,在max_allowed_packet的MySQL服務器中定義的值可能會導致查詢問題(查詢未在服務器上執行)。

所以我的第二個問題是,JDBC是否知道分配給max_allowed_packet的值,因此使數據包小於max_allowed_packet的定義值,或者這是開發人員必須考慮的事情?

如果我理解錯誤,請讓我知道。

+0

爲什麼要投票?謹慎解釋? – dazito 2014-10-10 20:45:44

回答

39

with rewriteBatchedStatements = true J​​DBC會將盡可能多的查詢打包到單個網絡數據包中,從而降低網絡開銷。我對嗎?

是。下面的代碼

String myConnectionString = 
     "jdbc:mysql://localhost:3307/mydb?" + 
     "useUnicode=true&characterEncoding=UTF-8"; 
try (Connection con = DriverManager.getConnection(myConnectionString, "root", "whatever")) { 
    try (PreparedStatement ps = con.prepareStatement("INSERT INTO jdbc (`name`) VALUES (?)")) { 
     for (int i = 1; i <= 5; i++) { 
      ps.setString(1, String.format(
        "Line %d: Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.", 
        i)); 
      ps.addBatch(); 
     } 
     ps.executeBatch(); 
    } 
} 

將派個人INSERT語句即使我已經造就了一批批

INSERT INTO jdbc (`name`) VALUES ('Line 1: Lorem ipsum ...') 
INSERT INTO jdbc (`name`) VALUES ('Line 2: Lorem ipsum ...') 

不過,如果我更改連接字符串包括rewriteBatchedStatements=true

String myConnectionString = 
     "jdbc:mysql://localhost:3307/mydb?" + 
     "useUnicode=true&characterEncoding=UTF-8" + 
     "&rewriteBatchedStatements=true"; 

那麼JDBC會發送一個或多個多行INSERT語句

INSERT INTO jdbc (`name`) VALUES ('Line 1: Lorem ipsum ...'),('Line 2: Lorem ipsum ...') 

確實JDBC知道分配給max_allowed_pa​​cket的值,因此使數據包小於max_allowed_pa​​cket的定義值...?

是。如果啓用MySQL通用日誌並檢查它,您會看到MySQL Connector/J在連接時會檢查一堆變量,其中一個是max_allowed_packet。您還可以設置一個小的max_allowed_packet值,並驗證JDBC是否將批次拆分爲多個多行INSERT語句,如果整個批次的單個語句將超過max_allowed_packet

+3

但對ACID有副作用:如果沒有rewriteBatchedStatements,我們可能會插入一部分行,但現在即使只有一個重複鍵,我們也可以插入任何內容。 – auntyellow 2014-12-31 14:47:23

+3

請注意:您不應關閉'con'和'ps',因爲它會被try-with-resources塊自動關閉。 – Benjamin 2016-04-28 12:42:32

+0

@Benjamin - 我已經更新了代碼。謝謝。 – 2016-10-27 00:35:16