すべてのテーブルの主キーが単純な int 列として宣言されている中程度のサイズの SQL Server 2008 データベース (約 120 個のテーブル、バックアップは約 4GB 圧縮) を使用しています。
現在、主キー値は NHibernate によってインクリメントID ジェネレーターによって生成されます。これはこれまでのところうまく機能していますが、マルチプロセッシング環境への移行は妨げられています。
システムの負荷が増大しているため、共通のデータベース バックエンドにアクセスする複数のサーバーを使用できるようにするために必要な作業を評価しています。
hi-loジェネレーターへの移行が最善の方法のようですが、そのような移行がどのように機能するかについての詳細はわかりません。
NHibernate は自動的に hi-lo テーブルに行を作成しますか、それとも手動でスクリプトを作成する必要がありますか?
NHibernate が行を自動的に挿入する場合、既存のキー値を適切に考慮しますか?
NHibernate が自動的に処理してくれるなら、それはすばらしいことです。そうでない場合、役立つツールはありますか?
アップデート
NHibernate のインクリメント識別子ジェネレーターは、完全にメモリ内で動作します。テーブルから使用される識別子の最大値を選択することによってシードされますが、その時点から、基になるデータベース テーブルを参照せずに、単純なインクリメントによって新しい値を割り当てます。他のプロセスがテーブルに行を追加すると、主キーの競合が発生します。1 つのプロセス内で複数のスレッドを実行することはできますが、複数のプロセスを実行することはできません。
比較のために、NHibernate IDジェネレーターは、ID 列を使用してデータベース テーブルを構成し、主キーの生成をデータベースに制御させることによって機能します。これはうまく機能しますが、作業単位パターンが損なわれます。
hi-loアルゴリズムはこれらの間に位置します。主キーの生成はデータベースを通じて調整され、マルチプロセッシングが可能になりますが、実際の割り当ては完全にメモリ内で行われ、作業単位パターンの問題を回避できます。