JDBC,DBCP和SQL Server“超出锁定请求超时时间”

时间:2013-09-19 20:01:33

标签: java sql-server jdbc locking timeout

我有一个好奇的案子。

如何在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或类似的内容吗?

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

0 个答案:

没有答案