使用JDBC驱动程序在SQL Server中设置默认行预取

时间:2013-02-25 18:41:30

标签: java sql-server jdbc

我有一个应用程序,我想为Oracle和SQL Server驱动程序定义要为连接预取的默认行数。 Oracle驱动程序有一个OracleConnection接口,它提供setDefaultRowPrefetch方法来执行此操作,但我找不到与SQL Server驱动程序等效的任何内容。

有一种方法可以使用SQL Server JDBC驱动程序为连接定义默认行预取吗?

1 个答案:

答案 0 :(得分:10)

设置行获取大小的常用方法是:

  1. 通过 java.sql.Connection 供应商实施类自定义方法(例如OracleConnection.setDefaultRowPrefetch
  2. 通过 java.sql.Statement.setFetchSize(int) :向驱动程序提供有关从此ResultSets获取的所有Statement的行提取大小的提示。此方法由PreparedStatementCallableStatement继承。大多数JDBC驱动程序都支持它。
  3. 通过 java.sql.ResultSet.setFetchSize(int) :向驱动程序提供有关所有ResultSet的行提取大小的提示。
  4. MS SQL Server JDBC驱动程序不支持以下任何方式:

    1. MSSQL驱动程序没有这样的方法。
    2. 不幸的是,虽然大多数驱动程序都尊重提示,但MSSQL驱动程序却没有。所以对你没用。请参阅What does Statement.setFetchSize(nSize) method really do in SQL Server JDBC driver?
    3. Statement相同的问题。
    4. 默认情况下,除非在JDBC驱动程序中指定游标类型,否则它将从数据库中检索所有行。 MSSQL驱动程序无法使用常用方法直接控制获取大小。

      <强>解决方案:

      • Statement投射至SQLServerStatement并使用方法setMaxRows(int)。为什么他们没有在标准方法Steve Ballmer中实现这一点只知道; ^)
      • 使用游标类型创建驱动程序。游标的默认提取大小为1.设置Connection字符串属性selectMethod=cursor。或者,您可以创建具有Statement可滚动性的com.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驱动程序的问题。这是一个优秀的驱动力。