2016-12-12 62 views
0

我有一個Java EE Web應用程序和一個SQL Server數據庫。 我打算稍後羣集我的數據庫。我自己的數據庫自動增量 - 避免重複密鑰

現在,我有兩個表: - 用戶 - 地點

但我不希望使用SQL Server的自動識別。 因爲羣集,我想生成我自己的ID。所以我創建了一個新表Parameter。參數表有兩列:TableNameLastId。我的參數表存儲最後一個ID。當我添加一個新用戶,我的方法addUser這樣做:

  • 查詢參數表的最後一個id並增加+1;
  • 插入新用戶
  • 更新最後一個ID +1。

它的工作。但它是一個網絡應用程序,所以1000人同時參與?也許他們中的一些人得到相同的最後一個ID。我該如何解決這個問題?我嘗試了同步,但它不工作。

你有什麼建議?是的,我必須避免自動增量。我知道用戶不得不等待。

+1

好吧,真的唯一的辦法是同步或使用自動增量。 – 3kings

+0

您可以使用GUID代替密鑰嗎?數據庫並不總是必須成爲密鑰的來源。要注意的是,在引用完整性方面,GUID並不總是那麼方便 - 與整數相比,您攜帶的是一個相當大的密鑰。 – stdunbar

回答

0

自動ID在集羣中可能會更好,但如果您想要自己實現數據庫可移植性或實現分配器,基本方法是以樂觀循環方式工作。

我更喜歡'Next ID',因爲它使得邏輯更清晰,所以我將在本例中使用它。

  1. 從分配器表中選擇NextID。
  2. UPDATE NextID SET NextID = NextID +增量WHERE NextID =值你讀
  3. 循環,同時的RowsAffected!= 1

當然,你也選擇當使用TableName條件/更新到選擇適當的分配器行。

您還應該查看塊的分配 - Increment = 200,並將其緩存到應用服務器中。這會使得更好的併發性比每次點擊數據庫要快得多。