使用自适应缓冲

自适应缓冲是 Microsoft SQL Server 2005 JDBC Driver 版本 1.2 的一项新增功能,其作用是在无需服务器游标开销的情况下检索任何类型的大值数据。

通常,当 Microsoft SQL Server 2005 JDBC Driver 执行查询时,驱动程序会从服务器将所有结果检索到应用程序内存中。尽管这种方法可以最大程度地减少 SQL Server 上的资源占用,但它可能会在 JDBC 应用程序中针对生成非常大的结果的查询引发 OutOfMemoryError

为了允许应用程序处理非常大的结果,Microsoft SQL Server 2005 JDBC Driver 版本 1.2 提供了自适应缓冲。应用程序开发人员可能出于以下原因而希望在语句中使用自适应缓冲:

  • **查询生成非常大的结果集:**应用程序可能执行一个 SELECT 语句,此语句生成的行数超过了应用程序可在内存中存储的行数。在先前的版本中,应用程序必须使用服务器游标才能避免 OutOfMemoryError。而在版本 1.2 中,应用程序可以使用自适应缓冲。借助于自适应缓冲,可以对任意大的结果集执行只进只读传递,而不需要服务器游标。

  • 查询生成非常大的 SQLServerResultSet 列或 SQLServerCallableStatement **OUT 参数值:**应用程序可能检索单一值(列或 OUT 参数),而此值太大,无法全部进入应用程序内存中。通过自适应缓冲,客户端应用程序可以使用 getAsciiStreamgetBinaryStream,getCharacterStream 方法将此类值作为流来进行检索。当应用程序从流中读取数据时,它将从 SQL Server 中检索值。

设置自适应缓冲

应用程序可以通过三种方法请求语句执行应使用自适应缓冲:

当使用 get<类型>Stream 方法读取一次大值,并且 SQL Server 按返回的顺序访问 ResultSet 列和 CallableStatement OUT 参数时,自适应缓冲在处理结果时可以最大程度地减少应用程序内存占用。使用自适应缓冲时:

  • SQLServerResultSetSQLServerCallableStatement 类中定义的 get<Type>Stream 方法默认情况下返回只读取一次的流,尽管可以重置流(如果应用程序已进行标记)。如果应用程序要对流执行 reset,它必须先对该流调用 mark 方法。

  • SQLServerClobSQLServerBlob 类中定义的 get<Type>Stream 方法返回的流始终可以重定位至流的开始位置,而不必调用 mark 方法。

当应用程序使用自定义缓冲时,由 get<Type>Stream 方法检索的值仅供检索一次。如果您在调用同一列或同一参数的 get<Type>Stream 方法后,试图对同一对象调用任何 get<Type> 方法,则将引发异常并显示消息“数据已访问,不可用于此列或此参数”。

将应用程序内存占用减至最小

开发人员应遵循以下重要指南,将应用程序占用的内存减至最小:

  • 避免通过使用连接字符串属性 selectMethod=cursor 来允许应用程序处理非常大的结果集。Microsoft SQL Server 2005 JDBC Driver 版本 1.2 的自适应缓冲功能允许应用程序在不使用服务器游标的情况下处理非常大的只进、只读结果集。

  • 通过使用 getAsciiStreamgetBinaryStreamgetCharacterStream 方法(而不使用 getBlobgetClob 方法)将大文本或二进制值作为流进行读取。在版本 1.2 中,SQLServerCallableStatement 类提供了新的 get<Type>Stream 方法来实现此目的。

  • 确保在 SELECT 语句中将可能具有大值的列放在列列表的最后,并且使用 SQLServerResultSetget<Type>Stream 方法按选择列时的顺序来访问这些列。

  • 确保在用来创建 SQLServerCallableStatement 的 SQL 语句的参数列表中,最后声明可能具有大值的 OUT 参数。此外,确保使用 SQLServerCallableStatementget<Type>Stream 方法,按照声明 OUT 参数时的顺序访问这些参数。

  • 避免同时对同一连接执行一条以上的语句。如果在处理上一条语句的结果之前执行另一条语句,则可能导致将未处理的结果缓冲到应用程序内存中。

另请参见

其他资源

借助 JDBC 驱动程序提高性能和可靠性