2011-05-04 66 views
0

所以我正在用Spring和Hibernate構建一個Java webapp。在應用程序中,用戶可以添加點到一個對象,我想計算給定的對象的點數。這些對象也存儲在數據庫中。希望有成百上千的人同時給予對象點數。我應該在哪裏處理相同數據的併發操作?在應用程序或數據庫中?

但是,如何計算點並將它們同時保存在數據庫中?通常我只是在我的物體上有一個屬性,只是增加點數。但這意味着我必須用悲觀事務來鎖定數據庫中的數據,以防止出現併發問題(讀取點數時,另一個線程已經完成了一半的更改)。這可能會讓我的應用程序變得更慢(至少我以爲會這樣)。

另一種解決方案是將相關對象中給定點的數量存儲起來,並將它們分別存儲在數據庫中,同時計算「小」同步塊內存中的點數等。

哪個解決方案在處理同一對象上的許多併發操作時性能影響最小。或者還有其他配件解決方案嗎?

回答

0

如果你想要值持久化,那麼你應該堅持他們在你的數據庫。

鑑於這種情況,請嘗試以下操作:

  1. 創建一個非常窄行,像剛纔OBJ_ID和點。
  2. 僅在OBJ_ID上創建索引,因此在插入,更新或刪除值時,不會花費更多時間更新索引。
  3. 使用InnoDB,它有行級鎖,這樣鎖就會變小
  4. 的MySQL會給你最後提交的(一致)值

這一切都非常簡單。旋轉!設置一個模擬您的預期負載並查看它的執行情況的測試用例。如果卡住了,請回復。

祝你好運。

+0

好吧,這聽起來很合理,但你說,MySQL會給我最後承諾的價值。如果兩個請求同時讀取該值並嘗試向db寫入新值,會發生什麼情況?最後一個寫入錯誤還是會阻止第二個請求繼續執行直到第一個請求完成? – suicide 2011-05-05 16:49:46

+0

啓動事務,讀取值,寫入遞增值,提交事務。一切安全。 – 2011-05-12 01:29:55

相關問題