MySQLのトランザクション管理について
現在、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
を追加して同じように動かしたところ、
上記エラーだけではなく、テーブルロックの例外も発生するようになってしまいました。
今までは半年以上発生していなかったエラーなので、この設定はだめみたいです。