2016-12-12 15 views
0

私はJava EE WebアプリケーションとSQL Serverデータベースを持っています。 後でデータベースをクラスタリングするつもりです。私自身のデータベースの自動インクリメント - 重複するキーを避ける

は今、私は2つのテーブルがあります: - ユーザー - 場所

をしかし、私は、SQL Serverの自動IDを使用する必要はありません。 クラスタのため自分のIDを生成したい。

私は新しいテーブルParameterを作成しました。パラメータテーブルには、2つのカラム、TableNameLastIdがあります。私のパラメータテーブルに最後のIDが格納されます。新しいユーザーを追加すると、私のメソッドaddUserは次のようになります。

  • パラメータテーブルの最後のIDを問い合せ、+1します。
  • 新しいユーザーを追加
  • 最後のIDを+1に更新してください。

これは機能しています。しかし、それはWebアプリケーションなので、同時にどのように約1000人ですか?たぶんそれらのうちのいくつかは同じ最後のIDを取得します。これをどうすれば解決できますか?私は同期して試しましたが、うまくいきません。

あなたはどう思いますか?はい、私は自動増分を避けなければなりません。

私は、ユーザーが待たなければならないことを知っています。

+1

本当に唯一の方法は、自動インクリメントを同期または使用することです。 – 3kings

+0

キーの代わりにGUIDを使用できますか? DBは必ずしもキーのソースである必要はありません。参照整合性に関してGUIDは常に便利であるとは限らないことに注意してください。整数に比べてかなり大きなキーを持ち歩いています。 – stdunbar

答えて

0

自動IDはクラスタでうまく機能するかもしれませんが、データベースポータブルにするか、アロケータを自分で実装したい場合、基本的なアプローチは楽観的なループで作業することです。

私は論理をよりきれいにするので、「次のID」を好むので、この例ではこれを使用します。

  1. アロケータテーブルからNextIDを選択します。 NEXTIDがに/更新を選択するときにrowsAffectedもちろん!= 1

が、あなたはまた、テーブル名条件を使用しますしながら、あなたは

  • ループを読んで値を=
  • UPDATE NEXTID SET NEXTID = NEXTID +インクリメント適切なアロケーター行を選択します。

    また、Increment = 200のようにブロック単位で割り当て、アプリケーションサーバーでキャッシュすることも検討してください。これにより、より良い並行性&は、毎回DBを叩くよりもずっと速くなります。

  • 関連する問題