ハマった話をつらつらと、、、
担当システムのミドルウェア全般のバージョンが古く(※一部サポート外など、、、)
ミドルウェア周りのバージョンアップを行おうとした話
<現行システム>
・Java:1.8.0_222
・Mysql:5.7.12(Amazon Aurora)
・Spring:4.3.16(2020年12月末で正式にEOL)
・JDBCドライバ:mysql-connector-java 5.1.34 (MySQL Connector/J)
<背景>
年中無休で稼働する社内システムで時々以下のエラーが発生
・Communications link failure
・No operations allowed after connection closed.
調査したところ、まず色々ミドルウェアのバージョンが古い、、、
これまで目を背けてしまっていたような、、、、
ということで
まず、現在のJDBCドライバがMysql5.7に対応していないことが発覚したので
※https://docs.oracle.com/cd/E17952_01/connector-j-5.1-relnotes-en/index.html
JDBCドライバのバージョンをあげることから開始する
1.アプリのpom.xmlのmysql-connector-javaのバージョンを変更
<!-- MySqlConnector -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
</dependency>
2.STG環境でテスト実施
3.本番リリース
、、、がエラー発生。。。。
ログを確認したところ、SELECT文の結果を取得できていない。。。
マスタデータの取得なので必ず取得できないといけないのだが、、、
※エラーが発生した原因はマスタデータの取得ができる前提で後続処理がつくられていたから、、
SQLツールから同じSELECT文を発行し、SELECT結果が取得できることを確認。
ますます、???????
その日は切り戻しをして、後日原因調査とした。。。
4.原因調査
本番環境のみでしか再現しない状態。
うかつに本番DBを見れないので、、、
※STG環境で再現させるのが最優先※
4-1.STG環境と本番環境のDBの差分を確認。
Mysqlのバージョン等々、、、
完全一致はしないが特に問題があるように見えない
4-2.JDBCドライバのバージョンに問題あり?
※https://docs.oracle.com/cd/E17952_01/connector-j-5.1-relnotes-en/index.html
骨が折れるし効率的でないので、、、別のアプローチ
4-3.SELECT文に問題がないかを確認。
まず、SELECT結果が Total:0 で取得できていないクエリを凝視!!!
条件設定が正常に機能しなかった疑いがあるかも、、、
判定不能な文字が含まれてしまっているとか、、、
Mapper.xmlに書かれたSQL文をサクラエディタなどで確認。
文字コードなど、、、
結果的には、取得できないMapper.xmlと正常に取得できるMapper.xmlをWinMareにかけることで原因が分かった
調査に2日ぐらいかかった、、、
JDBCドライバのバージョンを変えてSQLを投げてみたり、、
ORマッパーを調べまくったり、JDBCドライバのバージョン変遷を追っかけたり、、、
Mapper.xml内だけ見てると、改行が統一されてるのでおかしいと思わなかった、、、
<気になる点など>
・javaのjreが入っており、jstat(Javaアプリのメモリ計測)が使用できない。。。
※特別な要件がなければ基本的にJDKを入れる方がいいかも
<参照したものなど>
・meavenのセントラルリポジトリ(https://central.sonatype.dev/)
⇒pomに設定できるバージョンが存在するかなどを確認できる