8304


現在、AWSを6つ用いて、クローラーを稼働させています。  
その6サーバーそれぞれで別々のクローラー(マルチスレッドマルチプロセス)が動いていますが、DBサーバー(InnoDB)は1つで、  
並列に書き込み、読み込みを行っています。

そのせいか、すべてのサーバーのクローラーで、毎日数件から数十件下記のようなエラーが発生します。  
※諸事情により、全文記載できません。

[code]

    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!
    
[/code]

この例外を見るに、トランザクションが開始されていないように見えます。  
ですが、springに自動で管理させているということもあるので、(アプリケーション側の)トランザクション管理にバグがあるというわけでもありません。

とすると、やはり並列にアクセスするため、プロセス間の排他制御ができていないのが原因なのでしょうか？  
一応、synchronizedはしているので、マルチスレッドの排他制御はできています。

この問題について、なにかいい解決策をご存じの方はいらっしゃいませんか？

よろしくお願いいたします。

* * *

先日、`idleConnectionTestPeriodInMinutes=10`を追加して同じように動かしたところ、  
上記エラーだけではなく、テーブルロックの例外も発生するようになってしまいました。  
今までは半年以上発生していなかったエラーなので、この設定はだめみたいです。


CC BY-SA 3.0
2015-03-24T04:29:41.223
8299
2015-03-28T14:15:24.903
2015-03-27T04:33:04.133
8396
8396
question
java mysql spring
MySQLのトランザクション管理について


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


CC BY-SA 3.0
2015-03-24T05:52:51.947
8304
2015-03-24T05:52:51.947
4508
8299
answer


mysqlのエラーログを参照してみてはいかがでしょうか？java側のエラーでは真の原因がわからないことがあります。実はなんらかの原因で密かにmysqlが再起動していて接続が切れるなんてこともあります。


CC BY-SA 3.0
2015-03-28T14:15:24.903
8512
2015-03-28T14:15:24.903
7744
8299
answer