我正在[ResultSet](http://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html)
从远程Microsoft
SQL Server 2012到使用Microsoft JDBC Driver 4.0的Java客户端检索相对较大的内容时,显然正在处理性能问题。
当我在远程服务器的Microsoft SQL Server Management
Studio上运行相应的查询时,它返回大约。几乎瞬间达到220k行。当我从客户端发出相同的查询时,它停顿了。使用较早版本的数据库(大约只有)的客户端,相同的测试也可以正常工作。400行合格。
我试图通过附加;responseBuffering=adaptive"
到传递给的URL
来解决此问题DriverManager.getConnection()
。建立连接后,我在的结果中看到了此属性(还有其他几个属性)connection.getMetaData().getURL()
,但是[
connection.getClientInfo(responseBuffering)
返回null
,并且客户端仍然处于停止状态。
这里可能出了什么问题,以及如何指示Microsoft SQL
Server(不仅以Java编程方式向其提出建议),它必须以较小的块而不是一次全部返回行,或者通过其他一些措施来缩短JDBC查询时间。
另外两个观察似乎有些奇怪,也许完全指向不同的根本原因:
更新
我已经检查过,发现从我的情况下切换PreparedStatement
到Statement
并不能改善任何情况(在其他情况下显然可以提供帮助)。
更新 这是我当前的查询:
select
PARENT.IDENTIFIER as PARENT_IDENTIFIER,
PARENT.CLASS as PARENT_CLASS,
CHILD.TYPE as CHILD_TYPE,
CHILD.IDENTIFIER as CHILD_IDENTIFIER,
PROPERTY.IDENTIFIER as PROPERTY_IDENTIFIER,
PROPERTY.DESCRIPTION as PROPERTY_DESCRIPTION,
PROPERTY.TYPE as PROPERTY_TYPE,
PROPERTY.PP as PROPERTY_PP,
PROPERTY.STATUS as PROPERTY_STATUS,
PROPERTY.TARGET as PROPERTY_TARGET -- a date
from
OBJECTS as CHILD
left outer join RELATIONS on RELATIONS.CHILD = CHILD.IDENTIFIER
left outer join OBJECTS as PARENT on RELATIONS.PARENT = PARENT.IDENTIFIER
inner join PROPERTIES as PROPERTY on PROPERTY.OBJECT = CHILD.IDENTIFIER
where
PROPERTY.TARGET is not null
order by
case when PARENT.IDENTIFIER is null then 1 else 0 end,
PARENT.IDENTIFIER,
CHILD.IDENTIFIER,
PROPERTY.TARGET,
PROPERTY.IDENTIFIER
自适应缓冲是一个很好的答案。我还建议您SET
通过SQL Server Profiler 检查连接的选项。
开始跟踪时,请确保ExistingConnections
已选择。比较来自JDBC连接和SSMS连接的SPID。
ARITHABORT
想到的是,我所看到的会导致SSMS和JDBC驱动程序之间的性能差异。Microsoft在这里简短地提到了它:http : //msdn.microsoft.com/en-
us/library/ms190306.aspx。在此处堆栈交换信息:https :
//dba.stackexchange.com/questions/9840/why-would-set-arithabort-on-
dramatically-speed-up-a-
query
在Oracle上,通过setFetchSize
在Statement
/
PreparedStatement
对象上使用该方法,我看到了巨大的影响。显然,SQL
Server驱动程序不支持该方法。但是,驱动程序中有一个内部方法。有关详细信息,请参见使用JDBC驱动程序在SQLServer中设置默认行预取。
另外,您在while (rs.next())
循环中做什么?除了阅读专栏外,请尝试进行其他操作,例如rs.getInt(1)
。走着瞧吧。如果一切顺利,则表明瓶颈在于您以前对结果集的处理。如果仍然很慢,则问题必须出在驱动程序或数据库中。
您可以使用SQL Server
Profiler比较通过JDBC和通过SSMS运行的执行。比较CPU,读取,写入和持续时间。如果它们不同,则执行计划可能会有所不同,这使我回到我提到的第一件事:SET
选项。
问题内容: 如果函数需要修改在全局范围内声明的变量,则需要使用全局声明。但是,如果函数只需要读取全局变量,则可以不使用全局声明而这样做: 我的问题是关于Python的设计的:为什么Python被设计为允许在不使用全局声明的情况下读取全局变量?也就是说,为什么只强制分配具有全局性,为什么不强制全局读取呢?(这将使它变得均匀而优雅。) 注意:我可以看到在读取时没有歧义,但是在分配时并不清楚是否打算创建
我收集了大约75000份文件。 数据库的总大小约为45GB 在75k个文档中,约45k个文档的大小分别为900 KB(约42 GB),其余文档的大小分别约为120 KB。 每个文档都映射到其他集合中的ObjectId,并具有一个,两者都已索引。 现在,我需要获取上个月特定客户ID的文档。数量约为5500份文件。这个custId包含大小约为120 KB的小文档。 以下是我的查询: 不过,查询需要2分
我想使用而不是,并重构了以下代码: 这个(版本2): 两者都返回相同的元素。然而,我怀疑我是否真的应该用的更详细的代码替换我所有的。为什么我需要在mapMuli(
我一直在寻找答案,但我没有找到它,我需要在我继续我的测试之前弄明白。 我正在通过安装bash创建一个基于Alpine的映像,如下图所示: Hello.sh 我可以在不向docker-compose.yml添加的情况下访问,所以Alpine的映像中一定有我不理解和希望理解的东西。
问题内容: 我可以将数据发送到服务器,但是只有在使用FromBody-Attribute时才可以。 为什么无法使用Post从主体自动读取json数据? 后端Web API 前端angularjs 问题答案: 仅因为某事是POST请求,所以没有明确的规则如何传递参数。POST请求仍可以包含URL中编码的查询参数。方法参数应该是“简单”类型(字符串,整数等)的查询参数。 通常,复杂类型应该是POST表
问题内容: 我对JAX-WS进行了概述,并注意到了(和)的一些引用。 在什么情况下需要?(我认为JSR 109服务器?!) 问题答案: 是使用SUN的参考实现将Web服务作为标准存档部署在非Java EE5 Servlet容器上时所需的专有部署描述符。 Sun的RI 用作servlet上下文事件的侦听器和调度程序servlet。两者都必须在中声明。然后需要该文件为定义Web服务端点,以使其知道必须