takeda_san’s blog

KotlinとVRを頑張っていく方向。

Java11+mysql-connector-java8.0.14で切断時にjavax.net.ssl.SSLException: closing inbound before receiving peer's close_notifyって出る

きっかけ

ECS上で起動しているSpring BootからAWSのAurora(MySQL)を参照しているのですが、JDKを8から11に上げてから、なにやら断続的に例外が出るようになった。

javax.net.ssl.SSLException: closing inbound before receiving peer's close_notify

どうやらコネクションの切断時に出ているようだ。うーん。

環境

Spring Boot

  • adoptopenjdk/openjdk11:alpine-slim(中身はjdk-11+28)
  • Spring Boot 2.1.2
  • mysql-connector-java 8.0.14

Aurora

原因

ここにおんなじような環境で同じエラーが出てる人がおった。
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で接続しなければよいのだ。

mysql - Spring Boot: Jdbc javax.net.ssl.SSLException: closing inbound before receiving peer's close_notify - Stack Overflow

useSSL=false

うん、そうですよね。
だいたいSSL/TLS接続必須ですよね。

今回はMySQL自体のバージョンは5系なので、コネクターも5でよいはず。
というわけで、5.1.47 をバージョン指定で使って無事解決。

compile group: 'mysql', name: 'mysql-connector-java', version: '5.1.47'

そもそも

そもそも、Gradleでバージョンを指定しないのが良くなかったんよな。
GradleでもMavenでも最適なバージョンを調べて指定しようねという話でした。