我們有一個使用Google App Engine作爲後端的身份驗證系統。底層語言和框架由Java,JDO,Google認證& Google App Engine組成。如何防止Google App Engine中的重複值/身份驗證過程中最終一致的數據存儲
我們有一個用戶實體。用戶實體是用戶從Google App Engine身份驗證響應中保存的元數據(例如:名字,姓氏,電子郵件地址)。
當用戶嘗試註冊或登錄(兩個登錄事件)時,我們掃描數據存儲以查看具有相同電子郵件地址的用戶是否已存在。如果用戶不存在,我們創建一個新用戶。如果用戶確實存在,我們更新並檢索他們的用戶信息,然後檢索他們的應用程序數據。
我們需要運行單獨的多個事務,因爲登錄頁面完全獨立於應用程序頁面。
在某些情況下,當用戶嘗試在短時間內註冊兩次時,會創建一個重複的用戶。雖然我們總是可以獲取註冊的最後一個用戶,但我們確實希望查詢成爲唯一的JDO查詢。由於找到了兩個相同的值(用於用戶的電子郵件地址),所以使用唯一的JDO查詢,JDO查詢(在事務內部運行)有時會失敗。
我們認爲通過以下方式強制約束:
- 存儲新註冊用戶在緩存信息。我們似乎沒有發現任何暗示緩存將是防止重複的合適解決方案的信息。緩存是否可以跨計算機即時使用即使是這樣,高速緩存可能因各種原因而彈出一個實體。
- 在會話中存儲用戶的電子郵件。這似乎使代碼膨脹,似乎是一種強制約束的奇怪方式。
是否存在Google App Engine的最佳實踐方法,以防止在身份驗證工作流程中出現重複值以及單獨的事務?
嗨安德烈,爲了澄清關於1,你建議使用keyfactory.createkey只有電子郵件地址作爲關鍵值? – 2014-10-17 19:36:55
是的。然後你調用'get',你得到一個現有的記錄或者EntityNotFoundException。 – 2014-10-17 19:42:36