答えは、Statementのクローズで例外が発生するケースがあることです。
Statementのクローズで例外が発生すると、このままでは
Connectionのクローズが実行されません。
対策としては、javaで言うと、java6までのレガシーシステムの古い流儀では
finally句等を使用して、トランザクションの最後に必ずclose処理が走る様にすることです。
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) {
try {
stmt.close();
} catch (Exception e){
//NO OPARATION(復帰の可能性は無い)
}
}
if (conn != null) {
conn.close();
}
}
}
}
或いは、DbUtilsを使用して
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 {
DbUtils.closeQuietly(stmt);
DbUtils.closeQuietly(con);
}
}
}
java7以降や、もうちょっと新しい書き方は
いわゆるローンパターンと呼ばれるものがあります。
専用構文やAPIがなくても、高階関数が使用できる言語ならば
簡単に自作できます。
高階関数を簡単に説明すると、関数を引数 or 返値として
取る関数のことを言います。
(高階関数は、後で時間が有れば話すかもしれません
関数型プログラミング関連の話です。)
なぜか、scalaと言う言語には、これが標準ライブラリには
用意されていません。
javaでは、try-with-resources Statement
c#だとusingステートメントを使用します。
Scala using(ローンパターン)
http://www.ne.jp/asahi/hishidama/home/tech/scala/sample/using.html
もう少しカッコよく実装すると、こんな感じだけど
scalaの暗黙の変換があるので、気にしないでください。
http://qiita.com/piyo7/items/c9be1f39bcfea43a778a
その二
try-catch構文で、関数や処理で例外を、細かくキャッチしている。
これは、try-catch構文の趣旨とは違う書き方です。
try-catchでcatchするのは、アプリケーションの一番外側のみに
するのが、基本であり、catchするのは、catchで復帰処理が可能性で
処理が続行できる場合や、特別な事情がある場合のみとするのが
一般的だと思われます。
当たり前ですが、特別な事情が、頻繁にあらわれるはずがないので
頻発する場合は、設計をミスっています。
また、上で一般的と言いましたが、その様な常識は
以下の本等で仕入れてください。
すすめてなんですが、自分は読んでいません
言い訳をすると、下記の様に
パラパラめくってみると何処かで読んだようなことばかりで
初心者向けに見えるので、読む優先順位が低いです。
ですが、評判が良いことや、知っている人が呼んでいて
特に、文句を言っていないところを見ると、良い本なのだと思います。
定量的な評価がない
「経験豊富なプログラマーにとって、リーダブルコードに
目新しい物はなにもない」
http://snowlong.hatenablog.com/entry/2015/08/31/141137
蛇足
ですが、代わりに自分は、以下を読みました。
(自分は、数年前から、もっと尖がった関数型プログラミング等に
興味があり普通の書き方も、ある程度知っています。)
その他、リファクタリング本などなど
続き
リーダブルコードより、もっと定量的なものが欲しく
1000ページ越えの本を読むのを厭わないのであれば
次の本がおすすめです。
色々なプロジェクトのデータの統計値を見せながらの説明があるので
ある程度説得力があります。
Effective Java
(2版だけど)
https://www.amazon.co.jp/EFFECTIVE-JAVA-Java-Joshua-Bloch/dp/4621066056
まとめ
以上、挙げたほかにも、色々な常識・知識があります。
常識は、現場だけでは、仕入れられません。
現場には、staticおじさん等のような、ワカランチンが
仕切っていることも、珍しくないからです。
有名なstaticおじさん
http://el.jibun.atmarkit.co.jp/minagawa/2010/04/post-ebc4.html
(そういう人は、俺の○十年の経験では・・・と言ったりしますが
一人の人間が経験出来ることなんて、高々100年分しかありません。
人類60億人の中の世界ランカーレベルの人が、代々知識を受け継いで
継ぎ足した知見に比べると、たかが○十年の経験では
ヒヨッコすぎます。井の中の蛙です。
そう言う人には、ハイハイ言って
心の中で無視してください。
あるいは、その現場限りとしてください。
ただ、馬鹿にするのは人として良くないです)
本や、web等の情報にアンテナを張り
先ずは普通の書き方を習得してください。
それが出来てから、もっと尖がった書き方や
エレガントな書き方を追求しても良いでしょう。
以上、初心者に対する個人的な意見でした。