我有一个基于 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()
更新会导致锁定。
任何人都可以帮忙吗?谢谢!