MySQLのトランザクション管理について

投稿者: Anonymous

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

解決

Connection is closed!が出ているので、poolしてるconnectionが死んでいて、そいつを使おうとしているのではないですか?
validationQueryselect 1とか設定しておくと解決できるのではないでしょうか

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *