こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

コネクションプールについて。

いつもお世話になっております。

MySQLへのコネクションを確保しておく
コネクションプールを作成したのですが、

このコネクションプールを利用して
Select文を実行した時に
古いデータを取得してくる事があります。

コネクションは一度接続されたら
それ以降常時接続し破棄は行なっていません。

その為コネクション内に古い情報が残っているのかなと考え、
これを回避する為には使うたびにコネクションのインスタンスを発行し、使い終わったら破棄しなければならないかという考えに至りました。
しかしそれでは、プールの意味が無くなってしまい本末転倒だと思い煮詰まってしまいました・・・。

お手数ですが、
コネクションプールとはどのように作るのが正しいのか教えていただけないでしょうか?

投稿日時 - 2006-05-24 11:42:55

QNo.2171727

すぐに回答ほしいです

質問者が選んだベストアンサー

#1です。

コネクションプーリングでは
1.プールからのコネクションの取得
2.コネクションの使用
3.プールへのコネクションの返却
を行います。
commons-dbcpなどではこの返却の処理をcloseメソッドで行います。closeという名前になっていますが、実際にはcloseは行われずプールへの返却が行われます。#2さんがおっしゃってるのはこのことです。

コネクションプーリングを行わないで同じ現象が発生するか確認してください。(もしかしたら手間かもしれませんが・・・)
もし、発生しないようなら自作のコネクションプーリングを疑いましょう。
可能なら実績のあるcommons-dbcpなどを使うことをお勧めします。
(気を悪くされるかもしれませんが、実績のあるものを使ったほうが確実ですし、多くの情報を入手できます)

投稿日時 - 2006-05-24 16:13:51

お礼

ご丁寧に説明いただきありがとうございます。

今回は既存のプール部品に+αの機能が欲しかった為
自分で作成するにいたりました。

当該プール部品を使用している箇所を
よくみたところ

Resultsetはcloseしていたのですが
Statementはcloseしていなかったようなので
Statementのclose処理を追加致しました

Statementをcloseしなかったために、
今回のような現象が発生したと考えても
よろしいのでしょうか?

投稿日時 - 2006-05-24 19:21:39

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

>今回は既存のプール部品に+αの機能が欲しかった為
自分で作成するにいたりました

こういった事を容易にする為に継承といったものがあるのではないですか?
コネクションプーラーは非常に難しいです。
(コーディングの内容ではなく、動作確認、パフォーマンスの改善等において)
既存のものをエンハンスすることを考えるのが妥当だと考えます。

投稿日時 - 2006-05-26 11:06:57

お礼

ご意見ありがとうございます

>こういった事を容易にする為に継承といったものがあるのではないですか?

はい、全くその通りだと思います。

ですが、今回は諸事情により自作する事になってしまい
見事にハマッてしまった次第です。。。

投稿日時 - 2006-05-29 11:38:51

ANo.4

#2です。

>コネクションのcloseを行わずに
>ずっと接続を維持しておくもの
私もこの考えであっています。DBの接続部分は保持されたままの物をコネクションプーリングと言っています。

#3で#1さんが書いていますが、commonsを使用した場合にはcloseメソッドで返却をしているだけです。

本題ですが、文面からして、
1)select
2)DML文を実行 その後
3)1)の再実行

という処理っぽいのですが、1)の情報がどこかで保持されっぱなしになっていないでしょうか?
ここで、#3さんが書かれているように、プーリングをしない方法では、どういった動きになるでしょうか?

投稿日時 - 2006-05-24 16:34:23

お礼

ご丁寧に説明いただきありがとうございます。
下で#1さんにお答えした通り

ひとまずはStatementはclose処理を入れ
様子を見ることにしました。

投稿日時 - 2006-05-24 19:35:48

ANo.2

MySQL4.0 + Tomcat4.0 + commons-dbcp + commons-pool で使用したことがありますが、
問題なく動作いたしてました。

上記の組み合わせでは、一旦終了後(insert,update,delete,select)には、返却を行わないといけませんが、返却(close)していますでしょうか?
又は、トランザクションを自動で実行していて、他セッションで参照しているのではないでしょうか?

投稿日時 - 2006-05-24 15:16:50

補足

ご回答ありがとうございます。

今回は自作のコネクションプールを使用しています。

返却とはコネクションのcloseの事でしょうか?
それは行っておりません。

コネクションプールとは
コネクションのcloseを行わずに
ずっと接続を維持しておくもの
という認識があったのですが、
そもそも私のその認識が間違っているのでしょうか?

投稿日時 - 2006-05-24 15:25:30

ANo.1

「古いデータを取得してくる」というのは、更新したはずのデータが更新されていないということでしょうか?
それと何でコネクションプーリングを行ってますか?(commons?)

MySQLは使ったことがないのですが、トランザクションの管理やコミット/ロールバックをきちんと行っているか確認してください。

投稿日時 - 2006-05-24 12:00:58

補足

ご回答ありがとうございます。

> 「古いデータを取得してくる」というのは、更新したはずのデータが更新されていないということでしょうか?

はい、その通りです。
しかしDBを直接確認すると、データは更新されています。

> それと何でコネクションプーリングを行ってますか?

1時間に数百回のDBアクセスが発生する為です。

> コミット/ロールバックをきちんと行っているか

確認を行いましたが、キチンと行っています。


以上、よろしくお願い致します。

投稿日時 - 2006-05-24 12:51:43

あなたにオススメの質問