2017-03-04 25 views
1

我搜索了多種方式和解決方案,使春天hibrenate到一個安全的線程。我是春天和h little的小初學者,我無法做出這個決定。使Spring Hibernate線程安全。 Best solation

我發現這些選項:

  1. 使用hibrenate locking爲「破壞」,使衝突與其它事務的任何事務,並從錯誤的數據保存到數據庫中。這有缺點,因爲會成爲只是沒有執行的交易,它會更復雜的工作來完成Thouses請求

  2. 只需在一個線程中運行所有事務(至少所有更新),此線程將是「ExecuterThred」,他使共享所有這些交易將按順序執行。這樣就沒有機會了transactoin衝突,但這種方法要依據一個線程你DATABSE春天的服務器,它可以通過useig regular java thread,也許大在實現一個 like this,或使用thread local

  3. 讓道同步(或免得所有的更新方法),也沒有機會進行交易衝突,但可以拖動服務器。

更多一點,在我的服務器,任何客戶端都有用戶,並且任何用戶都有唯一的ID。我認爲關於更多一個選項:使任何客戶端能夠在同一時間只發送一個請求(使數據庫不同)的共享。 (我現在可以,因爲我可以使用唯一的ID),如果客戶端這樣做anywey我會迴應與併發錯誤,他可以嘗試再次信。 這將是選項4

如果你有更多的選項plaese讓我知道。

非常感謝,任何幫助或解釋將是最歡迎

+0

不知道爲什麼你需要擔心這一點。您應該在服務器上使用某種連接池來開始。這已經有多個線程池。 – OldProgrammer

+0

感謝您的回覆。我需要一些工作。我使用mysql和一些時間,我想做一些大的長查詢和更多的查詢和'衝突'發生,通常與一些sql exeption。一些動作我acuatlly也許會出現兩個不同勢交易 –

+0

請出示一些相關的代碼和錯誤。 – OldProgrammer

回答

1

什麼增益會淨爲使用Hibernate和Spring大多數應用程序?

我猜測,設計實際上是一個淨虧損對於大多數應用程序,因爲你描述的場景真的是越來越一角情況下其現有的鎖定策略和集成與其他技術堆棧可以很容易地減輕這些問題。

您應該首先嚐試使用樂觀鎖定

在過去,我使用了一個解決方案,在該解決方案中,我維護了一個實體的緩存副本,用作數據庫在用戶開始操作時具有的快照的快照。當用戶發佈更改回服務器時,我修改了該實體的第二個實例,然後我嘗試保存該實體。每當Hibernate出現樂觀鎖定異常時,我都可以將返回的數據庫快照與原始緩存副本進行比較,並決定是否可以重試操作,斷言是否無法重試或重試嘗試次數爲X次。

絕對是那個額外的代碼。但它是用例和業務案例特定的額外代碼。有些情況下,我想快速失敗。在其他人中,我可能想重試,而在其他人中,我可能只允許誰改變了最後的勝利。

如果更新必須被序列化,你可以考慮使用像您發佈的更新操作,並在一個單一的處理程序中執行JMS隊列或類似經紀人的解決方案。這允許您根據需要擴展您的應用程序,並避免在應用程序中嵌入後臺線程。但是,這並不意味着你的應用程序將不得不面對最終一致性因爲如果隊列中有積壓,它可能在你的應用程序需要幾秒鐘或幾分鐘用於該更新反映。如果你也使用二級緩存(2LC),也要理解其含義。

老實說,我認爲你要過工程師的東西那裏已經嘗試和驗證的解決方案來處理正是你有顧慮。絕對是否有努力去做正確的事情。但是沒有複雜的解決方案只是幾行代碼:P。