『Release It! 本番用ソフトウェア製品の設計とデプロイのために』で紹介されていた話。
数百の旅客機と数万人の社員を擁し、世界を股にかける数十億ドル規模の巨大航空会社をストップさせたのが次のコード。
さて、どこに問題があったかわかるだろうか。
package com.example.cf.flightsearch;
…
public class FlightSearch implements SessionBean {
private MonitoredDataSource connectionPool;
private List lookupByCity(…) throws SQLException RemoteException {
Connection conn = null;
Statement stmt = null;
try {
conn = connectionPool.getConnection();
stmt = conn.createStatement();
// 検索のロジックを実行して、
// 結果のリストを返す
} finally {
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
}
}
}
ヒントを一つ。
問題があるのは「finally { … }」の部分だ。
追記
『アジャイルプラクティス 達人プログラマに学ぶ現場開発者の習慣』にも、おそらくこの事件と思われる話が紹介されていました。
つい先日も、大規模な航空座席予約システムでの重大な障害がニュースで報じられた。 システムがクラッシュして飛行機が空港に足止めされて、何千人もの乗客が立ち往生することになった。 航空輸送システム全体の混乱は数日間にもわたって続いたそうだ。 原因は何だったのかって? アプリケーションサーバで起きた、たった1つのSQLの非チェック例外だったんだ。