2012-11-15 86 views
0

我正在開發醫療通道中心的應用程序,其中多個用戶使用JSF和JPA爲醫生預訂預訂。序列號對於醫生,日期和會話是唯一的。我試圖通過計算以前的預訂來獲得唯一的序列號並添加一個,但如果兩個請求同時發生,則兩個預訂會得到相同的數字,從而導致功能性問題。 在這種情況下,我如何獲得唯一號碼?我可以使用應用程序範圍的bean來生成它嗎? (我認爲這是不practicle來從數據庫中獲取序列號的唯一編號,因爲有幾個醫生,會議和日常他們必須有不同的預訂號碼。)Java EE中的唯一編號生成

回答

1

這是我會怎麼做:

有6列在數據庫中的表:

  • ID(自動生成的主鍵)
  • doctorId
  • 日期
  • 會議
  • 計數器
  • 版本(映射到@Version註釋字段,樂觀鎖)

確保在[doctorId,日期,會議]添加唯一contraint。

創建服務,在自己的事務(REQUIRES_NEW傳播),稱爲

getNextValue(doctorId, date, session) 

該服務運行應該拿到專櫃從數據庫表corresponfing它的三個參數,返回它,並增加它。如果還沒有行,它應該創建它。

仍有可能有兩個併發事務試圖同時創建或增加同一行。在創建的情況下,由於獨特的約束,其中一個交易會回滾。在增量的情況下,由於JPA樂觀鎖定,其中一個事務將回滾。

如果服務回滾,然後重試它,直到沒有異常了。

這避免了將所有這些計數器存儲在內存中,是無狀態的,因此如果重新啓動應用程序不會導致任何問題,並且即使您擁有一組服務器也能正常工作。

+0

非常感謝。這是我的問題的完美解決方案。 –

0

這是在數據庫中使用序列的最佳例子。

您應該在您的數據庫表中創建ID並確保該字段是通過序列自動生成的,然後您不必爲兩行使用相同的值而煩惱。

+0

您需要爲醫生,日期和會話的每個組合設置一個序列,這是不可能的。 –