JDBC,DBCP和SQL Server“超出锁定请求超时期限”
我有好奇的情况。
我如何获得com.microsoft.sqlserver.jdbc.SQLServerException: Lock request time out period exceeded.
在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
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; } });
cs.execute()
以这种方式调用存储过程
exec sp_prepexec @p1 output,N'@P0 int,@P1 int',N'exec my_sproc @P0,@P1', 1, 2
这个调用是成功的,之后调用了方法extractReturnedResults()
。 它使用getMoreResults()。 第一次迭代成功,第二次我得到异常。 它发生在我的制作系统上,我无法再重现它。 存储过程本身没有抛出锁定超时,因为代码被封装在try / catch中。 只是为了仔细检查我已经删除了try / catch阻塞,模拟锁定超时以及我在调用execute()
收到异常 - 这是有道理的。 这就像在执行存储过程之后发生锁定超时以及在打印结果集中间发生锁定超时? 我只在try / catch块内定义了lock_timeout。 我没有在jdbc连接字符串中设置queryTimeout或类似的东西?
另一个理论是网络带宽在该时刻(在成功调用存储过程并在打印结果集中间)完成。 这个理论的问题是我没有其他的超时设置。
链接地址: http://www.djcxy.com/p/74417.html上一篇: JDBC, DBCP and SQL Server "Lock request time out period exceeded"
下一篇: Convert a Result Set from SQL Array to Array of Strings