簡體   English   中英

防止多個用戶執行相同的操作

[英]Preventing multiple users from doing the same action

我有一個擺動桌面應用程序,該應用程序安裝在局域網內的許多桌面上。 我有一個與所有人交談的mysql數據庫。 每天恰好在下午5點,有一個線程將在每個應用程序中喚醒,並嘗試將文件備份到遠程服務器。 我想阻止所有桌面應用程序執行相同的操作。

我想做到這一點的方式是:

在下午5點醒來之后,所有應用程序都將嘗試在MYSQL表上寫一行。 他們將寫入相同的信息。 只有1個成功,其他的將獲得重復的行異常。 無論誰成功,都將繼續運行備份程序。

我的問題是:

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

  2. 將mysql等功能支持。 我的數據庫是INNO DB。 因此,我認為確實如此。 通常,我在局域網中大約有20-30個用戶。 這會給數據庫處理帶來巨大的開銷。

如果您可以在應用程序和數據庫之間放置一個中間類,以將結果排隊,並允許它們以有序的方式進行,那么您將被淘汰。

聽起來所有應用程序都直接針對數據庫。 您必須修改應用程序以避免此問題。

我對設計有很多疑問:

  1. 他們為什么都寫“同一行”? 他們不是為自己的個體編寫信息嗎?
  2. 為什么每個人都有完全相同的主鍵? 如果有自動遞增或時間戳記,則不會有此問題。
  3. 數據庫連接上的隔離設置是什么? 如果將其設置為SERIALIZABLE,您將迫使每一個都等到上一個完成為止,這會降低性能。
  4. 您能否讓它們全部都將文件寫入一個公共目錄,然后以有序的方式將它們拾取?

我現在正在集思廣益。

似乎您要備份服務器數據而不是客戶端數據。

我建議使用使用Java EE的3層體系結構。 您可以使用計時器服務然后觸發備份。

雖然通常備份程序是一個獨立程序,例如由服務器上的cron作業啟動。 但同樣:您需要一台服務器來正確執行此操作,而不僅僅是共享文件夾。

這是我的建議。 與讓所有客戶端同時喚醒並嘗試執行備份不同,請錯開它們喚醒的時間。

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

這種方法將防止網絡活動激增,並且還可以提供基本形式的故障轉移。 因此,如果一個客戶端發生故障,則另一客戶端可以在以后的時間嘗試備份。 (不過,這涉及的更多。基本上,它取決於客戶在看到備份工作正在進行時應該做的事情)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM