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.
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.