tokuhirom's Blog

[mac][osx][java][mysql] JDBC で mysql につなごうとしたら "Communications link failure" のエラーが出るとき

gradle でテストを動かしていたら、途中で JDBC が "Communications link failure" と言って死ぬ場合がある。 これは com.mysql.jdbc.exceptions.jdbc4.CommunicationsException のメッセージだが、このメッセージ自体は、socket を connect することにしたということを示すのみで、それ以上の情報が無い。ただこのエラー自体は、OS レベルでエラー返して発生することがほとんどなので、strace -f とかして調べればよいですね。

ありがちなのは bind-address を 127.0.0.1 に設定しているのに他のサーバーからアクセスしたとからしい。


一方で、テストの実行途中でこのエラーが出る場合は、リソースが枯渇している可能性がある。 つまり、テストケースの中でリソースがリークしている可能性だ。

そういった場合、以下のようなスクリプトをささっと書いて使うのがよい。

これで、特定の名前のプロセスの開いているファイル数を調べて、しきい値よりも多くなったらその値を出す。

perl hoge.pl --limit=2000 java

とかで実行すればいい。

mac の場合、デフォルトだとプロセスあたりに開くことができるファイルの数が少なめに設定されているので、mac でだけ死ぬ場合はこれを疑うといい。


mysql connector/j の出すエラーが不親切なので mysql が悪いのかなとおもってログを見てみたりする場合もあるが、そもそも他の部分でファイルディスクリプタ開きすぎている場合などあるので、mysql だけを疑っていてもダメ(もちろん mysql まわりに問題がある場合もある)。