- - PR -
結果のキャッシュ?について
1
| 投稿者 | 投稿内容 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-06-07 22:12
いつも勉強させていただいております。
jdbcでDominoからDB2へ検索する仕組みを作っているのですが、 今回select文がおかしい振る舞いをします。 会員を募りその会員にメールを配信する仕組みなのですが ある会員を削除し、その後アプリで検索をかけると削除したはずの会員を拾ってきて しまうのです。 db2のコマンドセンターからSQL文を投げると正常に削除されているようなのですが、 jdbcで接続したときに削除したはず(存在しない)の会員が表示されてしまいます。 同じsql文を投げたときに結果をキャッシュからとってくるなどということ はあるのでしょうか? クレームがあがっており非常に困っております。 よろしくお願いいたします。 | ||||||||
|
投稿日時: 2004-06-08 09:33
私がDB2を使っていて、結果がキャッシュされていたなんて現象は、
見たことも聞いたこともありません。 この会員の削除はJavaのプログラムでやってますか? もしそうなら、オートコミットがfalseなのに、 削除後にコミットをしていないだけなような気が・・・。 | ||||||||
|
投稿日時: 2004-06-08 10:08
ご回答ありがとうございます。
削除もjavaプログラムでやっています。 commitもちゃんと指定してありまして、ログにも正常に完了したようになっています。 commitされてないのであれば、SQLをコマンドで実行した場合も結果は返ってこない ですよね。 うーん | ||||||||
|
投稿日時: 2004-06-08 10:55
DB2を疑うのであれば IBM に問い合わせてみてはいかがでしょうか?
事例なり切り分け方法なり教えてくれると思います。 自分で調べてみたければ p6Spy や Ethereal を使って JDBC やパケットのストリームを確認する方法もあります。 http://www.p6spy.org/ http://www.ethereal.com/ JDBC/DB2 のレイヤだけではなくアプリケーションレベルのキャッシュも疑った方が良さそうですね。 | ||||||||
|
投稿日時: 2004-06-08 12:59
DB2使ったことないので、的外れだったら申し訳ありません。
「DB2」「isolation」「default」あたりで適当に検索して引っ掛かったページなんですが http://webdocs.caspur.it/ibm/web/udb-6.1/db2help/index.htm#ctldbpip
とか書いてあります。これが原因とかではないでしょうか? 試しに、selectの直前にrollbackしてみるとかどうですか? | ||||||||
|
投稿日時: 2004-06-08 17:08
手元の「DB2技術全書」で、索引で見てみましたけど、
キャシュに該当する項目は、 キャッシュのサイズとキャッシュのフラッシュの2つしか記述がないです。 で該当のページを見てみると、 キャッシュのサイズの方は、 「ログファイルのためのキャッシュサイズを指定します。」 とあるだけです。 キャッシのフラッシュの方も、 「キャッシュされたすべての動的SQLを除去します。」 とあるので、こちらも結果のキャッシュに関してではないです。 DB2が結果をキャッシュするなら、本に記述があると思います。 私が今携わっているプロジェクトのDBもDB2なので、 仰っているような現象が、 DB2のせいで発生しているなら、ちょっと気になります。 | ||||||||
|
投稿日時: 2004-06-08 17:44
永井様と同じで、分離レベルに一票です。
RR(デフォルト値)の場合、トランザクションが完了するまでは、一度参照した結果は 何度同じSQLを投げても同じ結果が返るよう保証されています。 DominoからのJDBC接続の場合、どういう単位で1トランザクションなのか分かりませんが・・・。 日本語の分かりやすい資料がありましたので貼っておきます。(はずしてたらすみません) http://www-6.ibm.com/jp/software/data/developer/column/iroha/06.html http://www.db2.jp/db2manual/ja_JP/index.htm?openup=admin/c0004121.htm | ||||||||
|
投稿日時: 2004-06-08 22:47
commitされていない可能性が高いですね。
> commitされてないのであれば、SQLをコマンドで実行した場合も結果は返ってこない > ですよね。 分離レベルRUであれば他のトランザクションでコミットされていない結果を参照することができます。 | ||||||||
1
