2011-11-24 53 views
2

我有一個擺動桌面應用程序,安裝在局域網內的許多桌面上。我有一個mysql數據庫,他們都談到。在每天下午5點,每個應用程序都會有一個線程喚醒,並嘗試將文件備份到遠程服務器。我想阻止所有的桌面應用程序做同樣的事情。防止多個用戶執行相同的操作

的方式我想這樣做是:

下午5點醒來後,所有的應用程序將嘗試寫一行到一個MySQL表。他們會寫相同的信息。只有1個會成功,其他人會得到重複的行異常。誰成功,然後繼續運行備份程序。

我的問題是:

  1. 是做事的這個正確的方式?有沒有更好的(更簡單)的方法? 我知道我們也可以使用套接字來做到這一點。但我不想走這條路線...太多的編碼也需要確保所有的系統都可以先互相交談(ping)

  2. mysql會支持諸如功能。我的數據庫是INNO DB。所以我認爲它確實如此。通常,我將在局域網中有大約20-30個用戶。這會導致數據庫處理的巨大開銷。

+0

爲什麼不使用未安裝在桌面上的專用備份系統? – Gandalf

+0

只有一個客戶端應該做備份?你想備份存儲在桌面上的數據或存儲在服務器上的數據嗎? – Puce

+0

@甘道夫 - 這實際上很難做到。它是我們最初想到的一個好主意,但在備份過程中有一些用戶參與。如果專用用戶不啓動應用程序,則不能進行備份。 – sethu

回答

1

如果你可以把一箇中間類的應用程序,並會排隊的結果,並讓他們在你把它敲有秩序地進行數據庫之間。

這聽起來像應用程序都直接對數據庫。您將不得不修改應用程序以避免此問題。

我有很多的關於設計的問題:

  1. 爲什麼他們都寫作「同一行」?他們不是爲自己的個人實例寫信息嗎?
  2. 爲什麼他們每個人都有完全相同的主鍵?如果有一個自動增量或時間戳,你不會有這個問題。
  3. 什麼是在數據庫連接上設置的隔離?如果它被設置爲SERIALIZABLE,那麼就會強制每一個都等到前一個完成,這是以性能爲代價的。
  4. 你可以讓他們全部寫入文件到一個公共目錄,然後以有序的方式把它們拿起來嗎?

我只是現在頭腦風暴。

+0

我想我可能沒有在這個問題上讓自己清楚..對不起。中間類是不可能的,因爲它們是在單獨的桌面上運行的獨立應用程序。很不幸,我不能排隊請求。因此我想用數據庫來決定誰實際贏了。誰先將記錄寫入數據庫,誰就贏了!他們可以上傳數據。其他人不。 – sethu

+0

是的,你可以創建一箇中級課程。它將在網絡上監聽,就像數據庫一樣。您的應用程序只會寫入應用程序,而不是打開JDBC連接並寫入數據庫。該中介可以排隊請求。把它看作是位於客戶端和數據庫之間的服務。你正在以這種方式進行面向服務的架構。正如你所寫的,你目前的設計是有缺陷的 - 但你已經知道了。 – duffymo

+0

啊!好的..多數民衆贊成在一個不錯的主意,但不幸的是,這將創建一個安裝問題,但我。我現在需要確保在運行數據庫的服務器上運行一個java程序。而這個Java程序需要被創建爲Windows服務,並且必須與系統一起啓動。 – sethu

0

看來你想備份服務器數據而不是客戶端數據。

我推薦使用使用Java EE的3層體系結構。 您可以使用定時服務觸發備份。

儘管通常備份程序是一個獨立的程序,例如,由服務器上的cron作業啓動。但是,你需要一臺服務器來正確地做這件事,而不僅僅是一個共享文件夾。

+0

對不起皮切..我沒有得到那個。我想將存儲在客戶端桌面上的數據備份到服務器上。我在客戶端系統上安裝的應用程序是一個swing應用程序。擺動應用程序需要將數據備份到服務器上 - 亞馬遜S3準確無誤。 – sethu

+0

再次說明:是否要備份服務器數據(所有應用程序訪問的共享文件夾上的數據,因此應只備份一次)或存儲在客戶端上的數據,在這種情況下,您可能需要備份所有客戶端的數據,不只是爲了一個客戶? – Puce

+0

啊好吧..我們正在談論同樣的事情。是的,我想將存儲在共享文件夾中的數據備份到Amazon S3上。客戶端桌面上沒有單獨存儲我想要備份的數據。但正如在duffymo的回答中提到的,我會發現在服務器上安裝cron作業並從那裏開始備份很困難,因爲用戶參與了此操作。 – sethu

0

這是我的建議。與其讓所有客戶同時醒來並試圖執行備份,不如讓他們醒來。

因此,當客戶端醒來時 - 它會檢查您的數據庫(MYSQL)中的某個表以查看備份作業是否已完成或當前正在運行。如果工作完成,客戶將繼續履行其正常職責。您可以決定如何處理作業正在運行時的情況。 - 如果客戶發現備份作業當天沒有運行,它將開始備份作業。同時將修改該行以指示備份作業已開始。一旦備份完成,客戶端將修改表格以指示備份已完成。

這種方法可以防止網絡活動爆發,也可以提供基本的故障轉移形式。所以如果一個客戶端失敗了,另一個客戶端稍後可以嘗試備份。 (儘管這有點牽涉其中,但基本上,這歸結於客戶在看到備份工作正在進行時應該做什麼)。

+0

這是一個不錯的主意。但是我們遇到了一個問題。對不起,在有人回答之後,我一直在提出限制。要求是用戶可以選擇他舒適地運行備份的時間。有一個主用戶會選擇他的辦公室的備份應該何時被佔用。這將適用於辦公室中的所有其他用戶。但最終,其中一個應該成功。所以雖然這個想法很棒,但它會否定用戶的需求。你能告訴我,上面提到的方法是否有問題? – sethu

+0

那麼爲什麼沒有用戶也指定一個客戶端來處理備份?這樣用戶就知道正在處理備份的機器,所以將確保它不會關機等。 您提到的方法沒有問題。我想你在某個表上有一個唯一的約束設置,所以只有一個客戶端可以成功插入一行。這肯定會起作用,在某個時間點會突然爆發,但MySQL應該很容易處理。 – Raam