database - 如何使用 SYSCS_DIAG.LOCK_TABLE 检查 Derby 锁(表始终显示为空)?

标签 database glassfish glassfish-3 derby

我正在尝试调试 Glassfish(EJB 应用程序)下的 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”工具和两个“ij” session 来开始诊断过程:

  1. 在第一个 session 中,连接到数据库并使用LOCK TABLE语句锁定一些表
  2. 在第二个 session 中,连接到数据库并运行 SELECT * FROM SYSCS_DIAG.LOCK_TABLE

看看在这种情况下是否可以看到 LOCK_TABLE 诊断表的内容。一旦可以,您就可以使用相同的技术(在运行代码时人为地在 ij session 中持有锁)来进一步调试子例程代码。

wiki 中有一些关于诊断 Derby 锁行为的好建议。在docs .

您可能想投票给 this Derby enhancement request .

关于database - 如何使用 SYSCS_DIAG.LOCK_TABLE 检查 Derby 锁(表始终显示为空)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14670722/

相关文章:

database - 为什么 Postgres 更喜欢 seq 扫描而不是具有显式 where 条件的部分索引?

android - 警告 : Do not hardcode "/data/"; use Context. getFilesDir().getPath() 代替

jakarta-ee - Glassfish 3.1.2.2 : admin console won't load

tomcat - 在 Netbeans 6.9 中,如何更改应用程序服务器

java - 使用 C3P0 和 Postgresql 的 Hibernate 连接

eclipse - Glassfish 需要 20 秒才能进行热部署,对吗?

.net - 用于 .Net 项目的文档数据库/键值存储

database - TADOQuery.Open 执行一条语句但只执行一次

testing - 禁用 Glassfish 中的自动更新检查

具有 GlassFish 和远程连接的 Java Web 服务