0

我有一个基于 SQL Server 2012 的 Web 应用程序,我使用 Java 更新数据库中的数据。(Windows Server 2008、JSP、Tomcat7、Java7)

相关代码如下:

public static synchronized int execute(String dsName, String packageAndFunction, List fields) {

        // prepare insertStr
        String executeStr = buildStatement(dsName, packageAndFunction, null, fields);
        dbConn  = DBConnection.getInstance();
        Connection conn = dbConn.getConnection();
        CallableStatement stmt = null;
        int result = RESULT_FAILED;
        try {
            stmt = conn.prepareCall(executeStr);

            // fill statement parameters (each ?)
            fillStatement(stmt, fields);

            stmt.execute();
            result = stmt.getInt(fields.size());

        } catch(SQLException e) {
            Log.getInstance().write("Exception on executeGeneral (" + packageAndFunction + ") " + e.toString());
        } finally {
            try {
                stmt.close();
                dbConn.returnConnection(conn);
            } catch(SQLException e) {
                Log.getInstance().write("Exception on executeGeneral (" + packageAndFunction + ") " + e.toString());
            }
        }
        return result;      
    }

大约 90% 的时间,代码运行良好。其余时间,桌子上有某种锁,大概半小时左右就会自行消失。锁甚至阻止对表执行简单的 SELECT 查询(在 SQL Server Management Studio 中)。在严重的情况下,它会阻止整个应用程序工作。

我有一个想法来stmt.executeUpdate()代替stmt.execute(),但我已经尝试对此进行研究,但我没有看到任何证据表明使用stmt.execute()更新会导致锁定。

任何人都可以帮忙吗?谢谢!

4

1 回答 1

2

使用该代码很难诊断。下次发生这种情况时,请打开 SQL 服务器上的活动监视器并查看哪个 sql 命令持有锁。

于 2013-01-03T13:59:41.673 回答