Java “JDBC、DBCP和SQL Server”;已超过锁定请求超时时间”;

Java “JDBC、DBCP和SQL Server”;已超过锁定请求超时时间”;,java,sql-server,jdbc,locking,timeout,Java,Sql Server,Jdbc,Locking,Timeout,我有个奇怪的案子 如何获取com.microsoft.sqlserver.jdbc.SQLServerException:超过了锁定请求超时时间。关于getMoreResults()?是什么导致了这种情况 堆栈跟踪: ... Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Lock request time out period exceeded. at com.microsoft.sqlserver.jdbc.SQ

我有个奇怪的案子

如何获取
com.microsoft.sqlserver.jdbc.SQLServerException:超过了锁定请求超时时间。
关于
getMoreResults()
?是什么导致了这种情况

堆栈跟踪:

... Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Lock request time out period exceeded. at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:197) at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1493) at com.microsoft.sqlserver.jdbc.SQLServerStatement.getMoreResults(SQLServerStatement.java:1191) at org.apache.tomcat.dbcp.dbcp.DelegatingStatement.getMoreResults(DelegatingStatement.java:270) at org.apache.tomcat.dbcp.dbcp.DelegatingStatement.getMoreResults(DelegatingStatement.java:270) at org.springframework.jdbc.core.JdbcTemplate.extractReturnedResults(JdbcTemplate.java:1045) at org.springframework.jdbc.core.JdbcTemplate$5.doInCallableStatement(JdbcTemplate.java:988) at org.springframework.jdbc.core.JdbcTemplate$5.doInCallableStatement(JdbcTemplate.java:1) at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:928) ... 34 more ... 原因:com.microsoft.sqlserver.jdbc.SQLServerException:超出了锁定请求超时期限。 位于com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:197) 位于com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1493) 位于com.microsoft.sqlserver.jdbc.SQLServerStatement.getMoreResults(SQLServerStatement.java:1191) 位于org.apache.tomcat.dbcp.dbcp.DelegatingStatement.getMoreResults(DelegatingStatement.java:270) 位于org.apache.tomcat.dbcp.dbcp.DelegatingStatement.getMoreResults(DelegatingStatement.java:270) 位于org.springframework.jdbc.core.JdbcTemplate.extractReturnedResults(JdbcTemplate.java:1045) 位于org.springframework.jdbc.core.JdbcTemplate$5.doInCallableStatement(JdbcTemplate.java:988) 位于org.springframework.jdbc.core.JdbcTemplate$5.doInCallableStatement(JdbcTemplate.java:1) 位于org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:928) ... 34多 JdbcTemplate代码如下所示:

return execute(csc, new CallableStatementCallback>() { public Map doInCallableStatement(CallableStatement cs) throws SQLException { boolean retVal = cs.execute(); int updateCount = cs.getUpdateCount(); if (logger.isDebugEnabled()) { logger.debug("CallableStatement.execute() returned '" + retVal + "'"); logger.debug("CallableStatement.getUpdateCount() returned " + updateCount); } Map returnedResults = createResultsMap(); if (retVal || updateCount != -1) { returnedResults.putAll(extractReturnedResults(cs, updateCountParameters, resultSetParameters, updateCount)); } returnedResults.putAll(extractOutputParameters(cs, callParameters)); return returnedResults; } }); 返回执行(csc,新CallableStatementCallback>(){ 公共映射doInCallableStatement(CallableStatement cs)引发SQLException{ 布尔retVal=cs.execute(); int updateCount=cs.getUpdateCount(); if(logger.isDebugEnabled()){ debug(“CallableStatement.execute()返回“'+retVal+””); debug(“CallableStatement.getUpdateCount()返回”+updateCount); } Map returnedResults=createResultsMap(); 如果(retVal | | updateCount!=-1){ putAll(extractedReturnedResults(cs,updateCountParameters,resultSetParameters,updateCount)); } returnedResults.putAll(extractOutputParameters(cs,callParameters)); 返回结果; } });
cs.execute()
以这种方式调用存储过程
exec sp_preexec@p1 output,N'@P0 int,@p1 int',N'exec my_存储过程@P0,@p1',1,2

该调用成功,之后调用了方法
extractReturnedResults()
。它使用getMoreResults()。第一次迭代是成功的,第二次出现异常。它发生在我的生产系统上,我不能再复制它了。存储过程本身没有抛出锁超时,因为代码包装在try/catch中。为了再次检查,我已经删除了try/catch阻塞、模拟锁定超时,并且在调用时收到异常
execute()
——这很有意义。这就像在存储过程执行之后和打印结果集中间发生的锁超时?我只在try/catch块中定义了锁定超时。我没有在jdbc连接字符串中设置queryTimeout或类似的东西

另一个理论是,在精确的时刻(成功调用存储过程之后,在打印结果集的中间),网络带宽是满的。这个理论的问题是,我没有设置任何其他超时