【发布时间】:2009-09-28 00:10:48
【问题描述】:
我在我的 Java 服务器应用程序中遇到了一些奇怪的行为,通常需要几毫秒的数据库操作偶尔会花费更长的时间(30 到 170 秒)才能完成。这并不孤立于特定查询,因为我已经看到 SQL 更新和选择语句都发生延迟。此外,我所有的 select 语句都使用 NOLOCK 选项,所以我已经排除了可能的锁争用。
上次我看到延迟时,我设法从 JConsole 捕获了以下堆栈跟踪;有问题的更新通常需要 5 毫秒才能完成,但此堆栈跟踪可访问至少 10 - 20 秒。跟踪向我表明该语句已执行,但检索结果有一些延迟,尽管我可能是错的?显然,由于这是一条更新语句,所以我期望的唯一结果是行数(即不是大量的数据结果集)。
在延迟发生时,我在 SQL Server Management Studio 中看到“传输级别错误”。
我的一个建议是,这些问题是由于 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)
【问题讨论】:
标签: java sql sql-server jdbc sql-server-2000