2015-09-17 37 views
1

獲取使用服務器遊標和使用流式傳輸獲取結果之間在行爲方面有什麼區別?服務器光標獲取與流式傳輸之間的區別

前者(服務器遊標)可以被激活:

  • 對於每一個語句通過設置連接屬性useCursorFetch=truedefaultFetchSize=N。 (凡ñ大於零的數字。)由最初設置在連接上useCursorFetch=truecom.mysql.jdbc.Connection.setUseCursorFetch(true),隨後java.sql.Statement.setFetchSize(N)的聲明

  • 或個人陳述。

後者(streaming)可以被激活:通過設置java.sql.Statement.setFetchSize(Integer.MIN_VALUE)或者通過在主叫statment com.mysql.jdbc.Statement.enableStreamingResults()

  • 在單個語句。

  • ,可能通過設置在連接屬性,其中X是一個數字等於Integer.MIN_VALUEdefaultFetchSize=X每個語句。

用這些替代方法開發時需要考慮什麼?一個很好的答案可能會觸及性能,鎖定控制資源分配(/取消分配)等主題。

回答

3

檢查MySQL的連接器/ J的源代碼(v5.1.39):

當使用服務器光標(setUseCursorFetch(true)),如果結果集類型是TYPE_FORWARD_ONLY,它似乎是「流」模式是一種特殊情況其中取出的塊只有1行:

​​

參見MysqlIO.java對於其中RowDataCursor被實例化的條件:

// 
    // Handle cursor-based fetch first 
    // 

    if (this.connection.versionMeetsMinimum(5, 0, 2) && this.connection.getUseCursorFetch() && isBinaryEncoded && callingStatement != null 
      && callingStatement.getFetchSize() != 0 && callingStatement.getResultSetType() == ResultSet.TYPE_FORWARD_ONLY) { 
     ServerPreparedStatement prepStmt = (com.mysql.jdbc.ServerPreparedStatement) callingStatement; 

     boolean usingCursor = true; 

MySQL 5.7文檔指出使用服務器遊標會在服務器端生成臨時表(如果大小允許,則爲內存表),因此這可能會影響服務器性能。

相關問題