質問: 現在、AWSを6つ用いて、クローラーを稼働させています。 その6サーバーそれぞれで別々のクローラー(マルチスレッドマルチプロセス)が動いていますが、DBサーバー(InnoDB)は1つで、 並列に書き込み、読み込みを行っています。 そのせいか、すべてのサーバーのクローラーで、毎日数件から数十件下記のようなエラーが発生します。 ※諸事情により、全文記載できません。 ``` Caused by: org.springframework.orm.hibernate3.HibernateJdbcException: JDBC exception on Hibernate data access: SQLException for SQL [n/a]; SQL state [null]; error code [0]; could not inspect JDBC autocommit mode; nested exception is org.hibernate.exception.GenericJDBCException: could not inspect JDBC autocommit mode Caused by: org.hibernate.exception.GenericJDBCException: could not inspect JDBC autocommit mode Caused by: java.sql.SQLException: Connection is closed! ``` この例外を見るに、トランザクションが開始されていないように見えます。 ですが、springに自動で管理させているということもあるので、(アプリケーション側の)トランザクション管理にバグがあるというわけでもありません。 とすると、やはり並列にアクセスするため、プロセス間の排他制御ができていないのが原因なのでしょうか? 一応、synchronizedはしているので、マルチスレッドの排他制御はできています。 この問題について、なにかいい解決策をご存じの方はいらっしゃいませんか? よろしくお願いいたします。 --- 先日、`idleConnectionTestPeriodInMinutes=10`を追加して同じように動かしたところ、 上記エラーだけではなく、テーブルロックの例外も発生するようになってしまいました。 今までは半年以上発生していなかったエラーなので、この設定はだめみたいです。
回答: mysqlのエラーログを参照してみてはいかがでしょうか?java側のエラーでは真の原因がわからないことがあります。実はなんらかの原因で密かにmysqlが再起動していて接続が切れるなんてこともあります。