DBとしてMySQL 5.1を使用して、永続的なジョブストアを備えたQuartz 1.6.1を実行しているアプリケーションがあります。このアプリケーションは、Tomcat6 で問題なく起動していました。ある時点で、すべての起動時に次の例外をスローし始めました。
- MisfireHandler: Error handling misfires: Failure obtaining db row lock: Lock wait timeout exceeded; try restarting transaction
org.quartz.impl.jdbcjobstore.LockException: Failure obtaining db row lock: Lock wait timeout exceeded; try restarting transaction [See nested exception: java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction]
at org.quartz.impl.jdbcjobstore.StdRowLockSemaphore.executeSQL(StdRowLockSemaphore.java:112)
at org.quartz.impl.jdbcjobstore.DBSemaphore.obtainLock(DBSemaphore.java:112)
at org.quartz.impl.jdbcjobstore.JobStoreSupport.doRecoverMisfires(JobStoreSupport.java:3075)
at org.quartz.impl.jdbcjobstore.JobStoreSupport$MisfireHandler.manage(JobStoreSupport.java:3838)
at org.quartz.impl.jdbcjobstore.JobStoreSupport$MisfireHandler.run(JobStoreSupport.java:3858)
Caused by: java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3491)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3423)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1936)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2542)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1734)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1885)
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:76)
at org.quartz.impl.jdbcjobstore.StdRowLockSemaphore.executeSQL(StdRowLockSemaphore.java:92)
... 4 more
このアプリケーションは、データ ソース接続プーリングに C3P0 を使用して JPA w/Hibernate も利用していることに言及する必要があります。この例外は、JPA がスキーマの更新を終了した直後に常にスローされます。
まず、Quartz 1.6.5 にアップグレードしたところ、例外はなくなりましたが、アプリケーションがフリーズしているように見えます。ログの最後のもの-例外があった場所-は次のとおりです。
...hbm2ddl stuff...
2969 [Thread-1] INFO org.hibernate.tool.hbm2ddl.SchemaUpdate - schema update complete
- Handling 6 trigger(s) that missed their scheduled fire-time.
何も来ず、webapp はリクエストを処理しません。それらは無期限にハングアップします。
例外の直後にSHOW INNODB STATUSを使用してmysqlコマンドライン クライアントを実行すると、一貫して 2 つの疑わしいトランザクションが表示されます。
----------
SEMAPHORES
----------
OS WAIT ARRAY INFO: reservation count 49, signal count 49
Mutex spin waits 0, rounds 2100, OS waits 0
RW-shared spins 115, OS waits 49; RW-excl spins 0, OS waits 0
------------
TRANSACTIONS
------------
Trx id counter 0 165688
Purge done for trx's n:o < 0 165685 undo n:o < 0 0
History list length 12
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 0 0, not started, OS thread id 5012
MySQL thread id 8, query id 1798 localhost 127.0.0.1 root
SHOW INNODB STATUS
---TRANSACTION 0 165687, ACTIVE 300 sec, OS thread id 3772
2 lock struct(s), heap size 320, 1 row lock(s)
MySQL thread id 30, query id 1795 localhost 127.0.0.1 my_app
---TRANSACTION 0 165685, ACTIVE 360 sec, OS thread id 5460
2 lock struct(s), heap size 320, 1 row lock(s), undo log entries 1
MySQL thread id 34, query id 1680 localhost 127.0.0.1 my_app
この問題をさらに調査する方法についてのガイダンスを探しています。おそらく、これら 2 つのトランザクションの所有者、またはそれらがロックしているリソースを特定できたらどうでしょうか?
更新: qrtz_simple_triggersテーブルのすべての行を問題なく削除しました。次に、 qrtz_triggersテーブルで同じことをしようとしたところ、MySQL クライアントが「ロック待機タイムアウトを超えました」というエラーをスローしました。この時点で、(まだハングしている) アプリケーションを停止し、qrtz_triggersテーブルのすべての行を削除することができました。これが完了すると、アプリケーションを正常に起動できました。
新しい Quartz バグを記録する必要があるようですが、ここで実際に何が起こっているかについて、より多くの情報を提供できるようにしたいと考えています。では、元の質問によると、これらの種類の問題をトラブルシューティングするにはどうすればよいですか?