BasicDataSourceについて
ドキュメントを見ると
closeメソッドがあるのですが
DataSource使用後
DataSource自体をclose
する必要があるのでしょうか?
このDataSourceにより生成された
Connectionをクローズすれば問題無いでしょうか?
感覚だとDataSourceなんて
接続先情報(文字列情報)として認識しているので
それをcloseするのが良くわかりません。
ドキュメント
http://commons.apache.org/dbcp/apidocs/org/apach …
No.2ベストアンサー
- 回答日時:
さて困ったわね。
あなたがどの程度理解しているのか
このAPIを使ってどのような使い方をしているのかもわからないし。
でも、とりあえず言うだけ言ってみるわ。
---------
データベースコネクションをプーリングするようにしていた場合、
BasicDataSourceのgetConnectionで
コネクションプールから1つ借りることができるわ。
そのConnectionをcloseをすることで
借りたコネクションをコネクションプールの中に返すことができるの。
JavaVMがコネクションプールを管理しているはず
そのVMの開始時に恐らくコネクションプールを作るようになっていると思うので
VM終了時にBasicDataSourceのcloseをしてあげると良いわ。
それ以外のときにBasicDataSourceをcloseする必要ないわ。
コネクションプーリングを使っていない場合も
まったく同じ実装で良いわ。
違うのは
BasicDataSourceのgetConnectionで
データベースへのコネクションを作成し
そのConnectionをcloseをすることで
データベースから切断するってことね。
---------
とりあえずこの説明でどうかしら。
この回答への補足
回答ありがとうございます。
ご説明わかりやすいですが。
認識違いしているといけないので
もう一度お願いします。
ConnectionやDataSourceを扱うコードでバグでも
出した日にはと思うと不安で仕方ないのです。
次のような簡単なコードがあるとします。
DataSourceFactoryはDataSource生成管理オブジェクト
関数hogeはそのDataSourceFactoryを利用する関数です。
また、例外発生でclose漏れが起きる話は除きます。
------
public void hoge () throws SQLException {
final DataSourceFactory factory = new DataSourceFactory();
final DataSource dsA = factory.getDataSource("A");
final Connection conA = dsA.getConnection();
/* conAでDB接続 */
conA.close();//【1】
final DataSource dsB = factory.getDataSource("A");
final Connection conB = dsA.getConnection();
/* conBでDB接続 */
conB.close();//【2】
factory.close();//【3】
}
public class DataSourceFactory {
private final Map dataSourcePool = new HashMap();
//SingletonなDataSource FlyweightFactory(hoge#【1】【2】から呼ばれる処理)
public DataSource getDataSource (final String key) {
final Map pool = this.dataSourcePool;
DataSource retval = null;
if (pool.containsKey(key)) {
retval = pool.get(key);
} else {
final BasicDataSource ds = new BasicDataSource();
/* dsに接続先情報などをセットする */
retval = pool.put(key, ds);
}
return retval;
}
//生成された全てのDataSourceをclose(hoge#【3】から呼ばれる処理)
public void close () throws SQLException {
final Map pool = this.dataSourcePool;
final List keyList = new ArrayList(pool.keySet());
for (int i = 0; i < keyList.size(); i++) {
((BasicDataSource)pool.get(keyList.get(i))).close();
}
}
}
------
【1】と【2】のcloseが確実に出来れば
DataSourceFactory#close(【3】の処理)を呼ぶ必要はないですか?
逆に【3】を確実に呼べて、Connectionの返却時間が遅くなっても
構わないような処理であれば【1】【2】のcloseをする必要がない?
例をわかって頂ける様ささっとコード書いてみましたので
もしかしたら誤字等あったら申し訳ありません。
インデントは全角でつけてあります。
長文すみません。
宜しくお願いします。
No.1
- 回答日時:
一般的にはそのアプリを終了するときにcloseするのよ。
closeすると何が起きるかはきちんとAPIドキュメントに書かれているんだから
その目的に合うときにcloseすればいいのよ。
この回答への補足
返信おそくなりましたが
回答ありがとうございます。
英語がわからないながらAPIをみました。
このDataSourceから生成されたConnectionを
直接closeすれば
org.apache.commons.dbcp.BasicDataSource#close
はしなくても良いと考えましたがあっていますでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルVBAで、条件に一致する...
-
ExcelVBA Findメソッドで検索の...
-
ShellExecuteってなんで関数?
-
コマンドプロンプト実行後に画...
-
You Tubeの音楽をMac Book Proへ
-
sprintfは古いのか。
-
VBAのWorkbook_BeforeSaveイベ...
-
DataGridViewでセルクリックイ...
-
誰か助けて下さい。UnityのC#で...
-
vbaエクセルマクロ RemoveDupli...
-
エクセルVBAにおけるON TIMEメ...
-
メソッドの英単語の意味について
-
エクセルのマクロでプリンタを...
-
サーブレット GETからPOST送信
-
Excel VBA でExcelを終了したい...
-
canvasに描画したものを全て削...
-
C#で右からnカラム目に文字を挿...
-
Range クラスのAutoFitプロパテ...
-
PDFファイルから別ウィンドウで...
-
Labelコントロールに数字を代入...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBAで、条件に一致する...
-
DataGridViewでセルクリックイ...
-
final修飾子を使っているのに、...
-
javascriptからjavaを呼び出したい
-
Labelコントロールに数字を代入...
-
VBPをダブルクリックするとたま...
-
vbaエクセルマクロ RemoveDupli...
-
【sendkeysメソッドが動かずに...
-
mainメソッドのthrows節で設定...
-
エクセルVBAにおけるON TIMEメ...
-
Refreshメソッドの使い方
-
onClickで関数呼出し後に、結果...
-
ウィンドウを最前面にできません
-
JSPで<SELECT>の中にDBから持っ...
-
コマンドプロンプト実行後に画...
-
Application.Wait の参照設定
-
Excel VBA でExcelを終了したい...
-
配列のメソッド
-
エクセルのマクロでプリンタを...
-
Excel VBA シェイプの原型のサ...
おすすめ情報