2009-12-08 138 views
1

我目前的設置是一個單獨的專用服務器,運行在tomcat,apache http服務器,MYSQL上的Java,hibernate應用程序。兩臺服務器之間的數據庫共享

我需要獲得第二個服務器來共享負載,但使用第一臺服務器的同一個數據庫。

後端處理(不包括db事務)非常耗時,因此是第二臺用於後端處理的服務器)。

此設置是否會有不必要的後果?這是最佳設置?

我的應用程序做更新/刪除並具有事務控制如下:

 
beginTransaction(); 
      getSession().save(obj); 
      //sessionFactory.openSession().save(obj); 
      commitTransaction() 
+1

這可能屬於ServerFault。 – Maha 2009-12-08 07:39:09

回答

2

只要其中一個應用程序在共享表上執行數據庫更新,您應該沒問題。你絕對不希望發生的是:

app1: delete/update table1.record24 
app2: delete/update table1.record24 

因爲當Hibernate寫入記錄的過程會注意到一個數據發生了變化,並拋出一個錯誤。作爲一個經典的海森堡,它真的很難再現。

另一方面,當責任明確分開(應用程序共享數據以供閱讀,但不刪除/更新相同的表格)時,應該可以。將該行爲記錄爲未來升級時可能沒有考慮到這一點。

編輯1:回答評論

您可以通過設計解決併發問題。對於任何給定的表:

  • 這兩個應用程序可以插入
  • 這兩個應用程序可以選擇
  • 其中的應用程序也可以更新/刪除該表

你的前端可能會插入到表,並且後端可以讀取這些表, 根據需要更新行,創建新的結果行並刪除行作爲清理。

或者,當應用程序進行通信時,前端可以將給定任務的記錄所有權轉移給業務後端,從而在完成時返回所有權。確保休眠緩存被刷新(執行事務),並且在傳輸所有權之前,沒有任何該任務的休眠對象正在使用。

遊戲的訣竅是確保Hibernate不會嘗試寫入其他應用程序更改的記錄,因爲這會導致StaleStateException。

和舉例的我是如何解決類似的問題:

  • 應用1接收數據,並在表1中寫入它
  • 應用2讀取表1,對其進行處理,並寫入/更新表2
  • 應用2刪除表1中的處理記錄

請注意,應用1只寫入共享表。它還從其他表中讀取,寫入和更新,但這些表不會被應用程序2訪問,所以這沒有問題。

+0

我的應用程序都會更新/刪除,但我確實有交易控制(請參閱上面的編輯),它是否仍然存在像您提到的問題? – user217631 2009-12-08 09:20:30

+0

那麼我該如何克服這個問題呢? – user217631 2009-12-08 09:25:58

+0

事務控制不起作用,因爲應用程序2不知道應用程序1啓動事務。數據庫確實知道,但數據庫不會推送信息。儘管如此,您可能會使用悲觀鎖定,這有點像數據庫同步:)這會限制性能,但會使系統更加健壯。然而我更喜歡通過設計來解決我的問題。 – extraneon 2009-12-08 09:42:38