The Daily WTF 日本語
フォロー
CodeSOD: 最初の10,000
アリシアは、バッチ処理を必要とする自社開発のエンタープライズ・アプリケーションのスイートを継承したが、クエリーによって謎のIllegalStateExceptionに遭遇した。問題のクエリーは「select * from data_import where id > 10000」であり、問題があったのは、行の存在をチェックし、見つかった場合は例外をスローするという点だった。このクエリーは、行を返すのではなく、COUNT(*)クエリーであるべきだった。この問題は、コードがレコードの状態情報としてIDを使用していたため生じた。プログラムは、IDを10000ずつ追加し、新しいデータをID 1から挿入し、IDが10000を超えるレコードを削除するというプロセスを実行していた。このプロセスは、単一のメソッド内でトランザクションやエラーハンドリングなしに実行され、連番のIDを使用して処理の失敗を追跡していた。このプロセスは、10,000行を超えるインバウンド・データを受け入れたときに失敗し始めたため、INSERTが失敗するようになった。アリシアはこのプロセスを修正したかったが、彼女のボスは、IDのしきい値を10000から100000に変更するという簡単な対処を行った。この変更により、プロセスは壊れた状態で継続することができたが、根本的な問題は解決されず、プロセスは依然として誤った設計に依存していた。IDのしきい値を変更するという決定は、既存のプロセスに対する依存関係のためであったと考えられる。