我们正在测试来自 jTDS 和 Microsoft 的 JDBC 驱动程序,并且我们在查询执行中遇到了不必要的暂停。我们的应用程序打开了许多 ResultSets 并从每个 ResultSets 中只获取几行。每个查询选择大约 100k 行,但我们只获取大约 50 行(这足以填满一页)。问题是第一个查询之后的每个查询都包含大约 2 秒的暂停,在此期间驱动程序将前一个 ResultSet 中的所有行加载到临时存储(内存或磁盘)中,因此可以稍后遍历它们。因为我们在最坏的情况下大约有 6 次查询,所以会有大约 10s 的暂停,这使得应用程序对用户没有响应。MSSQL 版本是 2005。
为了消除这种暂停,我们尝试通过 Microsoft JDBC 驱动程序的连接字符串参数启用 MARS(多个活动结果集)(由于缺乏文档,我们尝试了https://sites.google.com/上列出的所有内容站点/sqlconnect/sql2005strings)。连接字符串示例:
jdbc:sqlserver://TESTDBMACHINE;instanceName=S2005;databaseName=SampleDB;MarsConn=yes
但他们都没有解决问题。Microsoft JDBC 驱动程序似乎接受连接字符串中的任何内容 - 如果您将 MarsConn=yes 替换为 PleaseBeFast=yes,MS 驱动程序将忽略该参数并且甚至不记录该事实。我不知道 MARS 是仅用于缓存先前活动结果集中的行的客户端功能,还是服务器功能。我什至不知道如何从服务器端检测给定的连接是否正在使用 MARS。如果您可以对此发表评论,将受到欢迎。
暂停的另一个解决方案是使用可滚动(双向)结果集。这消除了暂停,但使获取时间变慢了 80% 并且更多的网络消耗。我们现在正在考虑实现一个 JDBC 连接包装器,它保留一个实际连接池并自动向不同的“ResultSet free”连接发出查询。但这有点麻烦,因为我们需要在每个连接与其活动的 ResultSet 之间保持链接。此外,它会消耗来自服务器的更多连接,并可能给 DBA 带来麻烦。如果存在活动事务,则此解决方案无济于事,所有查询都必须在同一连接上发出。
您是否知道一些参数、配置、特定 API、链接或技巧可以消除第二次和后续查询执行的暂停?