5

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

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

4

1 回答 1

14

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

  1. 通过java.sql.Connection供应商实现类自定义方法(例如OracleConnection.setDefaultRowPrefetch
  2. Via java.sql.Statement.setFetchSize(int): 向驱动程序提供有关ResultSets从这里获得的所有行获取大小的提示Statement。此方法由PreparedStatementand继承CallableStatement。大多数 JDBC 驱动程序都支持它。
  3. Via java.sql.ResultSet.setFetchSize(int): 向驱动程序提供有关所有这些的行获取大小的提示ResultSet

MS SQL Server JDBC 驱动程序不支持以下任何一种方式:

  1. MSSQL 驱动程序没有这样的方法。
  2. 不幸的是,虽然大多数驱动程序都尊重提示,但 MSSQL 驱动程序却没有。所以对你没用。请参阅Statement.setFetchSize(nSize) 方法在 SQL Server JDBC 驱动程序中的真正作用是什么?
  3. 与 相同的问题Statement

默认情况下,它会从数据库中检索所有行,除非您在 JDBC 驱动程序中指定游标类型。MSSQL 驱动程序不能使用通常的方法直接控制获取大小。

解决方案:

  • 投你StatementSQLServerStatement使用方法setMaxRows(int)。为什么他们没有在史蒂夫鲍尔默知道的标准方法中实现这一点;^)
  • 使用光标类型创建驱动程序。游标的默认提取大小为 1。设置Connection字符串属性selectMethod=cursor。或者,您可以为只进、只读访问创建Statement具有可滚动性的,然后使用该方法来调整性能。 http://technet.microsoft.com/en-us/library/aa342344%28SQL.90%29.aspxcom.microsoft.sqlserver.jdbc.SQLServerResultSet.TYPE_SS_SERVER_CURSOR_FORWARD_ONLYsetFetchSize
  • 使用(专有)SQL 来限制返回的行数(与设置提取大小不同):SET ROWCOUNTSELECT TOP N
  • 改用开源jTDS驱动,专为克服SQL Server驱动的问题而设计。是一位优秀的司机。
于 2013-05-02T02:48:23.847 回答