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或类似的东西
另一个理论是,在精确的时刻(成功调用存储过程之后,在打印结果集的中间),网络带宽是满的。这个理论的问题是,我没有设置任何其他超时