2013-02-25 23 views
3

我有一個應用程序,我想要爲Oracle和SQL Server驅動程序同時使用預定義連接的預取行數。 Oracle驅動程序有一個OracleConnection接口,它提供setDefaultRowPrefetch方法來執行此操作,但我沒有找到任何與SQL Server驅動程序等效的內容。使用JDBC驅動程序在SQL Server中設置默認行預取

有一種方法可以爲使用SQL Server JDBC驅動程序的連接定義默認行預取?

回答

10

通常的方法來設置行獲取大小:

  1. 通過java.sql.Connection供應商實現類自定義的方法(如OracleConnection.setDefaultRowPrefetch
  2. 通過java.sql.Statement.setFetchSize(int):給出一個提示以駕駛者爲到從Statement獲得的所有ResultSets的行提取大小。該方法由PreparedStatementCallableStatement繼承。大多數JDBC驅動程序都支持它
  3. 通過java.sql.ResultSet.setFetchSize(int):給驅動程序提供關於所有這個行取數大小的提示ResultSet

MS SQL Server的JDBC驅動程序不支持任一方式:

  1. MSSQL司機有沒有這樣的方法。
  2. 不幸的是,雖然大多數驅動程序都尊重該提示,但MSSQL驅動程序不支持。所以對你沒用。見What does Statement.setFetchSize(nSize) method really do in SQL Server JDBC driver?
  3. Statement一樣的問題。

默認情況下,它會從數據庫檢索全部行,除非您在JDBC驅動程序中指定了遊標類型。 MSSQL驅動程序不能使用通常的方法直接控制獲取大小。

解決方案:

  • 投下你StatementSQLServerStatement和使用方法setMaxRows(int)。爲什麼他們沒有在標準方法Steve Ballmer內執行此操作只知道; ^)
  • 使用遊標類型創建驅動程序。遊標的默認抓取大小爲1.設置Connection字符串屬性selectMethod=cursor。或者,您可以創建Statementcom.microsoft.sqlserver.jdbc.SQLServerResultSet.TYPE_SS_SERVER_CURSOR_FORWARD_ONLY可進行只向前訪問的只讀訪問,然後使用setFetchSize方法調整性能。 http://technet.microsoft.com/en-us/library/aa342344%28SQL.90%29.aspx
  • 使用(專有)SQL限制的行數返回(不一樣的東西設置獲取大小):SET ROWCOUNTSELECT TOP N
  • 切換到開源JTDS驅動程序,特製克服SQL Server驅動程序的問題。這是一個出色的驅動程序。
+0

+1推薦JTDS司機 – Drux 2014-10-24 18:35:34

+0

驚人,Postgres的,您還可以通過在連接字符串中一個放慢參數,以及:'&defaultRowFetchSize = XX'(但要注意這還不夠,你還必須任一組由自動提交關閉默認(另一個查詢參數)或改變它爲「採取」,奇怪... – rogerdpack 2017-08-18 20:32:00

相關問題