Java SQL Server/JDBC连接问题

Java SQL Server/JDBC连接问题,java,sql,sql-server,jdbc,sql-server-2000,Java,Sql,Sql Server,Jdbc,Sql Server 2000,我在Java服务器应用程序中遇到了一些奇怪的行为,通常需要几毫秒的数据库操作偶尔需要更长的时间(30秒-170秒)才能完成。这并不是孤立于特定的查询,因为我已经看到SQL update和select语句都出现延迟。此外,我的所有select语句都使用NOLOCK选项,因此我排除了可能的锁争用 上次看到延迟时,我设法从JConsole捕获了以下堆栈跟踪;有问题的更新通常需要5毫秒才能完成,但此堆栈跟踪至少需要10-20秒才能访问。跟踪提示我语句已经执行,但是检索结果时有一些延迟,尽管我可能是错的?

我在Java服务器应用程序中遇到了一些奇怪的行为,通常需要几毫秒的数据库操作偶尔需要更长的时间(30秒-170秒)才能完成。这并不是孤立于特定的查询,因为我已经看到SQL update和select语句都出现延迟。此外,我的所有select语句都使用NOLOCK选项,因此我排除了可能的锁争用

上次看到延迟时,我设法从JConsole捕获了以下堆栈跟踪;有问题的更新通常需要5毫秒才能完成,但此堆栈跟踪至少需要10-20秒才能访问。跟踪提示我语句已经执行,但是检索结果时有一些延迟,尽管我可能是错的?很明显,由于这是一个update语句,所以我期望的唯一结果是行计数(即,不是一个大的数据结果集)

大约在延迟的时候,我在SQLServerManagementStudio中看到了一个“传输级错误”

我得到的一个建议是,这些问题是由于SQL Server资源耗尽造成的。有人见过类似的东西吗?有人能解释一下这个问题吗

提前谢谢

堆栈跟踪:

Name: MessageRouterImplThread-2
State: RUNNABLE
Total blocked: 0  Total waited: 224

Stack trace: 
java.net.SocketInputStream.socketRead0(Native Method)
java.net.SocketInputStream.read(SocketInputStream.java:129)
com.microsoft.util.UtilSocketDataProvider.getArrayOfBytes(Unknown Source)
com.microsoft.util.UtilBufferedDataProvider.cacheNextBlock(Unknown Source)
com.microsoft.util.UtilBufferedDataProvider.getArrayOfBytes(Unknown Source)
com.microsoft.jdbc.sqlserver.SQLServerDepacketizingDataProvider.signalStartOfPacket(Unknown Source)
com.microsoft.util.UtilDepacketizingDataProvider.getByte(Unknown Source)
com.microsoft.util.UtilByteOrderedDataReader.readInt8(Unknown Source)
com.microsoft.jdbc.sqlserver.tds.TDSRequest.getTokenType(Unknown Source)
com.microsoft.jdbc.sqlserver.tds.TDSRequest.processReply(Unknown Source)
com.microsoft.jdbc.sqlserver.SQLServerImplStatement.getNextResultType(Unknown Source)
com.microsoft.jdbc.base.BaseStatement.commonTransitionToState(Unknown Source)
com.microsoft.jdbc.base.BaseStatement.postImplExecute(Unknown Source)
com.microsoft.jdbc.base.BasePreparedStatement.postImplExecute(Unknown Source)
com.microsoft.jdbc.base.BaseStatement.commonExecute(Unknown Source)
com.microsoft.jdbc.base.BaseStatement.executeUpdateInternal(Unknown Source)
com.microsoft.jdbc.base.BasePreparedStatement.executeUpdate(Unknown Source)
   - locked com.microsoft.jdbc.sqlserver.SQLServerConnection@c4b83f
org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:101)
org.springframework.jdbc.core.JdbcTemplate$2.doInPreparedStatement(JdbcTemplate.java:798)
org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:591)
org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:792)
org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:850)
org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:858)
org.springframework.jdbc.core.simple.SimpleJdbcTemplate.update(SimpleJdbcTemplate.java:237)
“…数据库操作 通常需要几毫秒的时间 偶尔需要更长的时间(30秒- 170s)完成。”

您所描述的内容听起来像是缓存不正确的查询计划,这是由于统计信息(和/或需要重建的索引)过期或参数嗅探不正确所致。超时可能正在发生,因为服务器占用的时间超过默认连接超时时间

我将与您的DBA交谈,首先更新统计信息,如果这不起作用,则重新生成查询中涉及的表的索引

在您的数据库上运行此操作(通常的警告是,在未与管理员/DBA交谈的情况下,不要在生产环境中运行ninhg,并自行承担风险等):

或者,您提到一天中的时间是一个因素。是否当时正在进行备份或计划作业


更新:您可以启动探查器跟踪:但不要局限于您的数据库。这样的跟踪,只要是按照该帖子从SSM开始的,其影响相对较低(3-5%ish)。

似乎表明“传输级别错误”。数据库是否在单独的计算机上

“数据库在单独的计算机上吗?”-通常是这样的!:)是的,它在一台单独的机器上(尽管我的开发人员不是!)。在过去,ManagementStudio中的“传输级别错误”不会消失(即,如果我从IDE重新运行查询),这表明存在网络问题。但是,当我重新运行同一个查询时,这个错误就消失了,所以我想知道这是否更多地指向了资源问题。Mitch,目前表太小了,以至于即使是不正确的查询(即表扫描)也会被忽略。因此,我更倾向于认为备份作业(或其他工作)可能会导致服务器资源流失。不幸的是,它是一个共享的生产服务器,因此很难追查任何罪犯。
EXEC sp_updatestats

EXEC sp_refreshview 

EXEC sp_msForEachTable 'EXEC sp_recompile ''?'''