- - PR -
Oracle の SEQUENCE がうまく利用できない
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-05-16 17:07
Database Expert に書こうか迷ったのですが、現象は「ASP.NET(VB.NET)」を利用して発生しているため、こちらに記載することにしました。
現象を発生させる方法を特定できておりませんので、情報が足りないかもしれません。その場合、ご指摘いただけると助かります。 ASP.NET で、Oracle の SEQUENCE を取得しています。 通常、1 → 2 → 3 と続いていきますが、ある時、何故か 21 とか 41 に飛んだりします。 CACHE SIZE が「20」で設定してありますので、「21」や「41」に飛ぶのだと思います。 ただ、どうしてイキナリ飛んでしまうかが分からず、困っております。 どなたか同じような現象を見たり、聞いたりした方は居ないでしょうか? シーケンスが飛んだ処理を再度実行すると、今度は正しく連番になったりしますので、処理には問題ないのでは、と考えております。 また、テスト環境ですので、自分以外にシーケンスを更新する人はおりません。 ちなみに、シーケンスは以下のように取得しています。
また、シーケンスは以下のように作成しています。
・WindowsXP Pro SP2 ・Oracle10g Standard Edition ・VS.NET2003 ・.NET Framework1.1 よろしくお願い致します。 | ||||||||||||
|
投稿日時: 2006-05-16 17:27
Oracle 10g ということですが RAC 環境ですか? RAC の場合は Sequence は各サーバがキャッシュするので そういう動きになるかもしれません。 | ||||||||||||
|
投稿日時: 2006-05-16 17:36
かるあさん、お返事ありがとうございます。 残念ながら、RAC(Real Application Clusters)環境ではありません。 <RAC の理解、合ってますよね・・・> | ||||||||||||
|
投稿日時: 2006-05-16 17:50
シーケンスについてまとめられているページがありました。
http://biz.rivus.jp/technote507125.html またここも参考になるかも http://blog.goo.ne.jp/btblog.php 今回の場合はシーケンスのキャッシュが破棄されて 新しくキャッシュされたので起こっているようです。 で、キャッシュの破棄のタイミングについては わかりませんということでした。 どこかに文書あるのかも・・・ | ||||||||||||
|
投稿日時: 2006-05-17 06:56
コネクション毎にキャッシュされるんじゃなかったっけ?コネクションプールを使っているなら、前回使ったコネクションと、今回使ったコネクションは必ずしも同じものではないですよね。当然、21や41になる場合もあるでしょう。
飛び番が発生したり、必ずしも順番どおりにならないのがSEQUENCEの仕様です。もしそれでは困ると言うのであれば、別の方法を考えてください。 | ||||||||||||
|
投稿日時: 2006-05-17 07:19
コネクション毎では無いと思いますよ。 キャッシュ20で100セッションがキャッシュしたら それだけでシーケンスが2000消費されてしまいます。 (一度キャッシュされたら戻らないので)
これはその通りですね | ||||||||||||
|
投稿日時: 2006-05-17 09:20
かるあさん、甕星さん、お返事ありがとうございます。 どうも、.NET側の問題ではなく、Oracle側の問題みたいですね。 かるあさんに教えていただいたページを参考に自分でもググってみましたが、欠番の問題は結構有名みたいですね(^_^;) てっきり、セッションが影響しているのかな、と思っていたもので・・・ ブラウザを終了し、ブラウザを再起動して実行してもうまくいく場合もあるので、コネクション毎ではないのかもしれませんね。
仕様ですか・・・ 発番テーブルからの発番は工数がかかるので、お手軽に SEQUENCE を使おうと思ったのですが・・・ 一応、SEQUENCE を NOCACHE で作成して様子を見てみます。それでもダメなら、発番の導入を検討します。 かるあさん、甕星さん、ありがとうございました。 | ||||||||||||
|
投稿日時: 2006-05-17 09:37
確かに NOCACHE でキャッシュ分飛んでしまうのは防げるかも知れませんが ROLLBACK した場合は飛ぶので気をつけてください。 |