我試圖調試Glassfish(EJB應用程序)下的Derby死鎖問題。我想在各個點查看鎖表,所以我寫了下面的代碼。問題出在我撥打電話的每一個地方,鎖定表總是回覆爲空。我錯過了什麼?如何使用SYSCS_DIAG.LOCK_TABLE檢查Derby鎖(表總是顯示爲空)?
private void dumpLockTable()
{
try (Connection connection = dataSource.getConnection())
{
PreparedStatement ps = connection.prepareStatement("SELECT * FROM SYSCS_DIAG.LOCK_TABLE");
ResultSet rs = ps.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();
int columns = rsmd.getColumnCount();
StringBuilder sb = new StringBuilder();
sb.append("Lock Table\n");
while(rs.next())
{
for (int col = 1; col <= columns; col++)
{
sb.append(rs.getString(col));
sb.append("\t|");
}
sb.append("\n");
}
logger.info(sb.toString());
}
catch (SQLException sqle)
{
logger.throwing(LOG_CLASS_NAME, "dumpLockTable", sqle);
}
}
這是Glassfish 3.1.2.1下的Derby 10.8。我正在通過以下方式獲取數據源:
@Resource(mappedName="jdbc/myderbyjndi")
private DataSource dataSource;
所有其他的Derby活動都是通過實體bean和實體管理器實現的。
我給了那一槍。 ij>獨佔模式鎖表app.mytable; 0行插入/更新/刪除 ij> select * from SYSCS_DIAG.LOCK_TABLE; ... 0行插入/更新/刪除 這兩個ij會話都將鎖表顯示爲空。 – Integrator
請注意,derby.log在死鎖異常發生時顯示一些有限的鎖定數據,所以它必須在某個時刻創建鎖定。 – Integrator
確保您未處於AUTOCOMMIT模式,無論是在IJ會話還是在您的應用程序中。在AUTOCOMMIT模式下,通常會進行鎖定,但在每個語句結束時提交事務,釋放鎖定。 –