
いつもお世話になっております。
MySQLへのコネクションを確保しておく
コネクションプールを作成したのですが、
このコネクションプールを利用して
Select文を実行した時に
古いデータを取得してくる事があります。
コネクションは一度接続されたら
それ以降常時接続し破棄は行なっていません。
その為コネクション内に古い情報が残っているのかなと考え、
これを回避する為には使うたびにコネクションのインスタンスを発行し、使い終わったら破棄しなければならないかという考えに至りました。
しかしそれでは、プールの意味が無くなってしまい本末転倒だと思い煮詰まってしまいました・・・。
お手数ですが、
コネクションプールとはどのように作るのが正しいのか教えていただけないでしょうか?
No.3ベストアンサー
- 回答日時:
#1です。
コネクションプーリングでは
1.プールからのコネクションの取得
2.コネクションの使用
3.プールへのコネクションの返却
を行います。
commons-dbcpなどではこの返却の処理をcloseメソッドで行います。closeという名前になっていますが、実際にはcloseは行われずプールへの返却が行われます。#2さんがおっしゃってるのはこのことです。
コネクションプーリングを行わないで同じ現象が発生するか確認してください。(もしかしたら手間かもしれませんが・・・)
もし、発生しないようなら自作のコネクションプーリングを疑いましょう。
可能なら実績のあるcommons-dbcpなどを使うことをお勧めします。
(気を悪くされるかもしれませんが、実績のあるものを使ったほうが確実ですし、多くの情報を入手できます)
ご丁寧に説明いただきありがとうございます。
今回は既存のプール部品に+αの機能が欲しかった為
自分で作成するにいたりました。
当該プール部品を使用している箇所を
よくみたところ
Resultsetはcloseしていたのですが
Statementはcloseしていなかったようなので
Statementのclose処理を追加致しました
Statementをcloseしなかったために、
今回のような現象が発生したと考えても
よろしいのでしょうか?
No.5
- 回答日時:
>今回は既存のプール部品に+αの機能が欲しかった為
自分で作成するにいたりました
こういった事を容易にする為に継承といったものがあるのではないですか?
コネクションプーラーは非常に難しいです。
(コーディングの内容ではなく、動作確認、パフォーマンスの改善等において)
既存のものをエンハンスすることを考えるのが妥当だと考えます。
ご意見ありがとうございます
>こういった事を容易にする為に継承といったものがあるのではないですか?
はい、全くその通りだと思います。
ですが、今回は諸事情により自作する事になってしまい
見事にハマッてしまった次第です。。。
No.4
- 回答日時:
#2です。
>コネクションのcloseを行わずに
>ずっと接続を維持しておくもの
私もこの考えであっています。DBの接続部分は保持されたままの物をコネクションプーリングと言っています。
#3で#1さんが書いていますが、commonsを使用した場合にはcloseメソッドで返却をしているだけです。
本題ですが、文面からして、
1)select
2)DML文を実行 その後
3)1)の再実行
という処理っぽいのですが、1)の情報がどこかで保持されっぱなしになっていないでしょうか?
ここで、#3さんが書かれているように、プーリングをしない方法では、どういった動きになるでしょうか?
ご丁寧に説明いただきありがとうございます。
下で#1さんにお答えした通り
ひとまずはStatementはclose処理を入れ
様子を見ることにしました。
No.2
- 回答日時:
MySQL4.0 + Tomcat4.0 + commons-dbcp + commons-pool で使用したことがありますが、
問題なく動作いたしてました。
上記の組み合わせでは、一旦終了後(insert,update,delete,select)には、返却を行わないといけませんが、返却(close)していますでしょうか?
又は、トランザクションを自動で実行していて、他セッションで参照しているのではないでしょうか?
この回答への補足
ご回答ありがとうございます。
今回は自作のコネクションプールを使用しています。
返却とはコネクションのcloseの事でしょうか?
それは行っておりません。
コネクションプールとは
コネクションのcloseを行わずに
ずっと接続を維持しておくもの
という認識があったのですが、
そもそも私のその認識が間違っているのでしょうか?
No.1
- 回答日時:
「古いデータを取得してくる」というのは、更新したはずのデータが更新されていないということでしょうか?
それと何でコネクションプーリングを行ってますか?(commons?)
MySQLは使ったことがないのですが、トランザクションの管理やコミット/ロールバックをきちんと行っているか確認してください。
この回答への補足
ご回答ありがとうございます。
> 「古いデータを取得してくる」というのは、更新したはずのデータが更新されていないということでしょうか?
はい、その通りです。
しかしDBを直接確認すると、データは更新されています。
> それと何でコネクションプーリングを行ってますか?
1時間に数百回のDBアクセスが発生する為です。
> コミット/ロールバックをきちんと行っているか
確認を行いましたが、キチンと行っています。
以上、よろしくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- マスコミ・芸能 一企業が電通など大手広告代理店にたくさんお金を落としてコネクションができればスポンサーにはならずに「 2 2023/07/25 00:12
- 水泳 水泳について質問です。今年大学生になった男子です。僕は1mも泳げないのですが、最近だんだん暑くなって 2 2022/05/05 23:07
- 公認会計士・税理士 プール利息ってなんですか? プール未払い利息期首振り戻し仕訳 などもわかりません。 口座の残高にかか 1 2022/07/20 21:44
- 水泳 プールへ通っています。全体で3コースのプールです。 6 2023/07/15 12:58
- Android(アンドロイド) スマートウォッチの質問です! 1 2022/10/22 11:55
- 水泳 スイミングに通っています。週1です。 2 2022/06/02 10:27
- その他(妊娠・出産・子育て) 子供2人。下の子がプール入らないので水着着なくて平気? おはようございます! 娘2人(6歳、2歳)の 3 2022/07/22 08:08
- 俳優・女優 川栄李奈さんが女優としてブレイクした理由 2 2022/10/09 17:17
- 遊園地・テーマパーク 遊園地のホームページにタトゥーがある方の入園はお断りします。との記載がなければタトゥーがあっても入園 2 2022/05/23 12:20
- クレジットカード クレジットカードやローン申し込みのことでご相談です 1 2023/03/08 11:37
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
[Java] while(true)の意味
-
C#の処理をリアルタイムに表示...
-
COBOLの考え方からJavaへ
-
PHPでDB処理中にプログレスバー...
-
同期化時のことで
-
スレッド1とスレッド2を交互に...
-
数値の定数を付ける時
-
flush()メソッドについて・・・
-
C# PostMessage BeginInvok
-
Delphi -> Java へのSendMessag...
-
Eclipseの終了処理について
-
Javaプログラムからポップアッ...
-
Java ログ出力方法
-
ftp 同時複数接続の負荷テスト...
-
GASで、起動時間の最大値を超え...
-
他クラスのすごくかっこいい同...
-
「タイプ初期化子が例外をスロ...
-
main()を持つクラスが2つ以上...
-
エクセルVBAで、条件に一致する...
-
private static という変数の修飾
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
[Java] while(true)の意味
-
tryの終了
-
Javaでのデバッグコード削除
-
Javaアプリケーション実行の返...
-
Javaプログラムからポップアッ...
-
onBlurとonFocusの処理順序につ...
-
Tomcat高負荷時の設定について
-
数値の定数を付ける時
-
アコーディオンメニューをアン...
-
ラジオボタンの選択判定
-
ラベルの表示までが異常に遅い...
-
C#で別スレッドの終了を知りたい
-
ExcelVBA で文字列の特定の文字...
-
素数判定を再帰処理で
-
JavaScriptからJAVAクラスを呼...
-
switch文の中に、throws new Ex...
-
PHPでDB処理中にプログレスバー...
-
C#の処理をリアルタイムに表示...
-
Windowsサービスの処理
-
ftp 同時複数接続の負荷テスト...
おすすめ情報