きっかけ
ECS上で起動しているSpring BootからAWSのAurora(MySQL)を参照しているのですが、JDKを8から11に上げてから、なにやら断続的に例外が出るようになった。
javax.net.ssl.SSLException: closing inbound before receiving peer's close_notify
どうやらコネクションの切断時に出ているようだ。うーん。
環境
Spring Boot
Aurora
- MySQL 5.6.10
原因
ここにおんなじような環境で同じエラーが出てる人がおった。
Java11とMySQLのコネクターのバージョンが8系の組み合わせで発生する模様。
エラーの通り、SSL接続の場合にハンドシェイクというか切断の順番がおかしいっぽい。
いくつか調べてみたのですが、どれが悪いのか見当つかん…
MySQL Bugs: #93590: javax.net.ssl.SSLException: closing inbound before receiving peer's close_notify
[JDK-8215102] Closing connection to Mysql database results in exception - Java Bug System
とりあえず回避編
原因がわからなくても、バグFixしてなくても明日はやってくる。
動いてもらわにゃ困るのだ。
解決方法のひとつは脳筋的にはSSL/TLSで接続しなければよいのだ。
useSSL=false
うん、そうですよね。
だいたいSSL/TLS接続必須ですよね。
今回はMySQL自体のバージョンは5系なので、コネクターも5でよいはず。
というわけで、5.1.47
をバージョン指定で使って無事解決。
compile group: 'mysql', name: 'mysql-connector-java', version: '5.1.47'
そもそも
そもそも、Gradleでバージョンを指定しないのが良くなかったんよな。
GradleでもMavenでも最適なバージョンを調べて指定しようねという話でした。