使用 Microsoft SQL Server JDBC Driver 及其提供的 Statement 和 ResultSet 对象时,可使用多种技术来提高应用程序的性能和可靠性。
使用适当的语句对象
使用 JDBC 驱动程序的某个 Statement 对象时(如 SQLServerStatement、SQLServerPreparedStatement 或 SQLServerCallableStatement 对象),请确保所使用的对象适用于您的作业。
-
如果不带 OUT 参数,则无需使用 SQLServerCallableStatement 对象。而是使用 SQLServerStatement 或 SQLServerPreparedStatement 对象。
-
如果不想多次执行语句或不带 IN 或 OUT 参数,则无需使用 SQLServerCallableStatement 或 SQLServerPreparedStatement 对象。而是使用 SQLServerStatement 对象。
为 ResultSet 对象使用适当的并发
创建生成结果集的语句时,不要请求可更新的并发,除非您的实际意图就是更新这些结果。对于读取较小的结果集来说,默认的只进、只读游标模型速度最快。
限制结果集的大小
考虑使用 setMaxRows 方法(或 SET ROWCOUNT 或 SELECT TOP N SQL 语法)来限制从可能较大的结果集中返回的行数。如果必须处理大型结果集,请考虑通过设置连接字符串属性 responseBuffering=adaptive(默认模式)来使用自适应响应缓冲。此方法使应用程序无需服务器端游标即可处理大型结果集,并最大限度地减少应用程序使用的内存。有关详细信息,请参阅使用自适应缓冲。
使用适当的提取大小
对于只读服务器游标,需要权衡的是与服务器之间的往返通信与驱动程序所使用的内存量。对于可更新的服务器游标,提取大小还会影响结果集对更改的敏感度和服务器上的并发。在显式调用 refreshRow 方法或游标离开提取缓冲区之前,当前提取缓冲区中的行更新并不可见。如果使用 CONCUR_SS_SCROLL_LOCKS (1009),则较大的提取缓冲区具有较好的性能(较少的服务器往返通信),但具有较低的更改敏感度且服务器上的并发会减少。若要获得最大的更改敏感度,请将提取大小设为 1。然而,需要注意的是,这样会导致每提取一行就发生一次服务器往返通信。
对较大的 IN 参数使用流
可使用已逐渐具体化的流或 BLOB 和 CLOB,来处理对较大的列值的更新或对较大的 IN 参数的发送。JDBC 驱动程序通过多次往返通信将其“分块”发送到服务器,这样您便可以设置和更新超出内存允许范围的值。