2011-01-31 8 views
3

私たちは、HiLoを使ってエンティティのIDを生成するASP.NETデータベースアプリケーションを実行しています。このアプリケーションの上に、同じデータベースを使用する複数のWebサイトがあります。私たちが見ているのは、IDがなくなり、ID列が負数になるということです。NHibernateから抜けてHiLo-idsが負数になる

これは発電機と関係があると思われます。複数のWebサイトが同じコードベースとデータベースの上を走るようになると、おそらくHiLoアルゴリズムは、bigint-rangeの外にあるIDの生成をすぐに開始します(もちろん相対的なものです)。

ジェネレータを、Id-シーケンス内のギャップ(かなりの数があります)を使用するように設定することは可能ですか?

それは解決策ですか?それとも、何か別のことをやっているのでしょうか?

答えて

0

これが可能であるか、IDののint64を使用する場合は、Guid.Comb発電に切り替えることができます。どの発電機を使用するかについて最終決定を下すためにhereを見てください。

+0

私たちは現在の設定がHiLoの動作と互換性がなく、Int64でもidsが不足すると予想しているので、Int64ファーストとGUID.combに切り替えることにしました。ばかげたデータがあるわけではありませんが、アプリケーションを再起動する必要があり、複数のアプリケーションプールがあるため、IDが急速に増加します。 – Pieter

0

私は同じ問題を抱えており、適切な答えを見つけることもできませんでした。

また、同じWebサーバー上のそれぞれのアプリケーションプール内の各サイトと別々のWebサイトとして実行されているサイトもあります。

あなたのデータベースがサポートしているのであれば、実際にはアイデンティティマッピングに切り替える方がよいでしょう。あまりにも難しいことではありません。少しのTSQLとIDマッピングを使用してデータベーススキーマを変更することができるはずです。

アプリケーションにUoWに類似した概念がありますか?アイデンティティ生成の欠点は、それがUoW(識別子を取得するために早期の挿入)を破るということです。しかし、それは支払う価値のある価格かもしれません。

私の場合、システムは単一のサイト/アプリケーションプールとして簡単に存在する可能性があります(単一の共有接続文字列を持つ単一のデータベース上にマルチテナントがあり、Webサーバー上で単一のインスタンスとして実行するように設計されています)。データベースアイデンティティにジャンプする前にそれをテストするつもりです。

1

あなたのmax_loはどのように設定されていますか?

(0から始まる)H =高い配列 l_size =低いブロックのサイズ L =低シーケンス(1から始まる)

ID =時間*のl_size + Lを次のようにIDを生成する 式は

max_loが高く設定されている可能性がありますか?

関連する問題