## チーム構成
- **テックリード**: 1 名(私)
### **背景と課題**
* 本番環境で断続的に発生する **OutOfMemoryError(OOM)** の原因を特定するため、**JVMヒープダンプを取得して分析**を開始。
* `Dominators by Retained Size` による可視化の結果、**`mysql-connector-java` を介して作成された JDBC オブジェクトが大量のメモリを保持している**ことを確認。
* 接続リークなどを疑いスタックトレースを調査した結果、**金型部品メンテナンス推奨データ(特に修繕レコード)の異常な蓄積**が根本原因の可能性と判明。
### **原因分析**
* `TblMoldPartMaintenanceRecomendDetail` テーブルにおいて、**同一個体(mold + partInd)に対する `replaceOrRepair=2(修繕)` レコードが、バッチ実行のたびに重複登録されていた**。
* 「個体(moldPartInd)」は新たに導入された概念であり、従来の「rel(mold + part)」では `replaceOrRepair=1(交換)` のみが重複チェック対象だった。
* relデータでは重複があっても**最終的に削除して再挿入する**対応をしていたが、この方式は設計上不自然でコストも高い。
* 修繕データにおいては事後削除の処理もなく、**レコードが無限に蓄積され、結果としてOOMを引き起こしていた**。
### **対応と成果(テックリードとしての取り組み)**
* **設計方針を見直し、rel・個体ともに「事後削除」から「事前除外」へ統一**。
* JPQLの `NOT EXISTS` 条件から `replaceOrRepair=1` の限定を外し、**交換・修繕を問わず、既存レコードがあれば抽出しない仕様に修正**。
* **重複データを一括で削除するマイグレーションSQLを作成し、事前に検証環境で動作確認を実施**。
* 影響範囲・緊急度を判断し、**クリティカルな修正に絞って段階的なリリース方針を提案・実行**。
* 不要な検証データがバグのトリガーである可能性を指摘し、**顧客環境と開発環境の分離ルールの徹底を関係者に提言**。
* これらの対応により、**重複登録を完全に排除し、メモリ使用量の増加を防止。OOMは解消し、バッチ処理の安定性が大幅に向上**。
### **工夫点**
* **VisualVM による Dominator Tree 分析を通じて、単なる実装不備ではなく設計思想に踏み込んで問題を特定**。
* スタックトレースには現れない、**データ設計レベルの不備を疑い、コード・DB・ヒープの三側面から問題を横断的に調査**。
* JDBCドライバによるリソース消費に注目し、**インフラ依存の課題にも対応可能な調査スキルを発揮**。
* 品質が低く見えるコードにも、「なぜこのような構造か」を追究し、**対症療法でなく根本的な改善を実現**。
---
### 成果の要約
**クリティカル障害を設計改善と運用是正により解消し、テックリードとしてプロジェクトの技術的安定を主導。
パフォーマンス・保守性・品質のバランスを最適化した再設計を実現した。**
---