Jam*_*s B 10 java sql sql-server stored-procedures jtds
我正在使用Java 1.6,JTDS 1.2.2(也只是尝试1.2.4无效)和SQL Server 2005来创建CallableStatement来运行存储过程(没有参数).我看到运行相同存储过程的Java包装器比使用SQL Server Management Studio慢30%.我运行MS SQL分析器,两个进程之间的I/O差别不大,所以我认为它与查询计划缓存无关.
存储的proc不带参数,也不返回任何数据.它使用服务器端游标来计算填充表所需的值.
我无法看到从Java调用存储过程如何增加30%的开销,当然它只是数据库的一个管道,SQL被发送下来然后数据库执行它....数据库是否可以提供Java应用不同的查询计划?
我已经发布了MSDN论坛和sourceforge JTDS论坛(主题:"在JTDS中存储过程比在DB中更直接")我想知道是否有人有任何关于为什么会发生这种情况的建议?
提前致谢,
-詹姆士
(NB不要害怕,一旦找到解决方案,我会在这里整理其他论坛中的任何答案)
Java代码片段:
sLogger.info("Preparing call...");
stmt = mCon.prepareCall("SP_WB200_POPULATE_TABLE_limited_rows");
sLogger.info("Call prepared. Executing procedure...");
stmt.executeQuery();
sLogger.info("Procedure complete.");
Run Code Online (Sandbox Code Playgroud)
我运行了sql profiler,发现了以下内容:
Java app:CPU:466,514阅读次数:142,478,387撰写:284,078期限:983,796
SSMS:CPU:466,973阅读次数:142,440,401写作:280,244持续时间:769,851
(两个DBCC DROPCLEANBUFFERS在分析之前运行,并且都产生正确的行数)
所以我的结论是他们都执行相同的读写操作,只是他们这样做的方式不同,你们怎么想?
事实证明,查询计划对于不同的客户端是显着不同的(Java客户端在插入期间更新索引不在更快的SQL客户端中,同样,它执行连接的方式也不同(嵌套循环Vs.收集流,嵌套循环Vs索引扫描,唉!)).这就是为什么,我还不知道(当我到底时,我会重新发帖)
结语
我无法让它正常工作.我试图均质连接属性(arithabort
,ansi_nulls
在Java和管理工作室客户端之间等).它最终导致两个不同的客户端具有非常相似的查询/执行计划(但仍然具有不同的实际plan_ids).我发布了我在MSDN SQL Server论坛上发现的摘要,因为我发现不仅在JDBC客户端和管理工作室之间,而且在Microsoft自己的命令行客户端SQLCMD之间有不同的性能,我还检查了一些更激进的事情,如网络流量也可以将存储的proc包装在另一个存储过程中,只是为了咧嘴笑.
我有一种感觉问题出在游标执行方式的某个地方,并且它以某种方式导致Java进程被暂停,但是为什么不同的客户端应该在没有其他运行时产生这种不同的锁定/等待行为并且运行相同的执行计划有点超出我的技能(我不是DBA!).
结果,我已经决定用4天的时间浪费在这样的事情上,所以我会勉强编写代码(如果我诚实的话,存储过程需要重新编码才能更多增量而不是重新编写代码. - 无论如何,每周计算所有数据),然后用白垩来体验.我会把这个问题保持开放,非常感谢所有把帽子戴在戒指上的人,这一切都很有用,如果有人想出更进一步的话,我很想听到更多的选择......如果有人发现的话这篇文章是因为在他们自己的环境中看到这种行为,所以希望这里有一些你可以自己尝试的指针,希望能比我们更充分地看到.
我现在已经准备好了周末!
-詹姆士