Search code examples
databaseglassfishglassfish-3derby

How to inspect Derby lock with SYSCS_DIAG.LOCK_TABLE (table always showing as empty)?


I'm trying to debug an issue with a Derby deadlock under Glassfish (EJB app). I want to view the lock table at various points so I wrote the following code. The problem is every where I place a call to it, the lock table is always coming back as empty. What am I missing?

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 );
    }
}

This is Derby 10.8 under Glassfish 3.1.2.1. I'm obtaining the DataSource with:

@Resource(mappedName="jdbc/myderbyjndi")
private DataSource dataSource;

All other Derby activity is via entity beans and the entity manager.


Solution

  • I got an answer from the Derby mailing list that I figure I should add for completeness. Apparently the entity manager is not actually sending the commands out the the database right away (I think that sounds familiar but I had forgotten about it), so that would explain why the lock table did not show any locks. If I add an entityManager.flush() before I do the lock table dump, I get a good list of locks. Now I am able to debug my sequences that lead to a deadlock.