回答
當您運行您的應用程序時,首先檢查是否沒有其他機器正在運行此應用程序,如果沒有,插入一個標識符,這意味着當前機器XX正在運行您的應用程序。當您關閉應用程序時更新您的數據庫(或刪除您的標識符),以便讓其他機器使用您的應用程序。
如果您想增加可靠性,可以每隔XX個時間單位向數據庫發送一些信號,以確認您的機器仍在使用您的應用程序,並且如果XX時間單位後沒有信號到達,讓其他機器選項使用你的應用。這種方法可以讓其他用戶使用你的應用程序,因爲某些機器關閉時沒有報告(例如連接問題)。
您可以做到更復雜,並在每次交易或每XX時間單位檢查您的機器是否仍有資格使用您的應用程序。
希望這有助於
有做一些這方面的很多方面都:
- 檢查Windows進程,你的應用程序必須運行過程中,如果具有相同名稱的過程中存在不啓動應用。
- 其次,如果用戶已經使用相同的用戶名和密碼登錄並再次使用該用戶名登錄並通過拒絕登錄,則維護已登錄的用戶詳細信息。
- 此外,您可以在登錄時獲取計算機名稱並保存登錄的用戶計算機名稱,並且如果用戶再次來自同一名稱,則拒絕它。
在數據庫中創建鎖表:
Locks
LockId (primary key; not auto increment)
MachineId (this is a machine identifier; can be ip if in same network, MAC or a guid/string you set in your application's config file)
LockExpires (DateTime)
您與一個記錄種子的鎖表。示例值:LockId = 1(可以是任何值),MachineId = null,LockExpires = null。
在您的程序硬編碼/配置種子的LockId,在您的查詢中使用它。
您將使用三種查詢設定/檢查/刪除鎖:
-- SetLock
update Locks set
MachineId = {MachineId you configured for the machine},
LockExpires = adddate(minutes, {N}, getdate()) -- lock for N minutes; set to null to hold the lock indefinitely)
where
LockId = {hardcoded LockId} and
(
MachineId is null -- nobody holds a lock
or LockExpires <= getdate() -- or lock expired
or MachineId = {MachineId you configured for the machine} -- or you hold the lock
)
-- CheckLock (if count > 0 then you hold the lock)
select count(*) from Locks
where
LockId = {hardcoded LockId} and
MachineId = {MachineId you configured for the machine} and
LockExpires > getdate()
-- DeleteLock
update Locks set
MachineId = null
where
LockId = {hardcoded LockId} and
MachineId = {MachineId you configured for the machine} and
LockExpires > getdate()
當程序啓動時,你是否有在同一臺機器上運行的實例(類似「How to determine if a previous instance of my application is running?」)。
如果您是此機器上的唯一實例,那麼您的SetLock
和CheckLock
。如果CheckLock
說你沒有鎖,那麼就出去別的了。
在您的應用程序中編寫代碼(最好在單獨的線程中)每隔(N - M)分鐘設置/檢查鎖定。其中N是您持有鎖的分鐘數,M是一些小數字(1或2),以確保您的鎖不會意外過期。
當您退出應用程序時,DeleteLock
。請記住,如果您的應用程序崩潰,則不能運行其他實例,直到鎖定過期。在最壞的情況下,沒有應用程序將能夠運行N分鐘(當然,在最壞的情況下,您將LockExpires
設置爲空,並且在您手動將MachineId
手動更改爲空值之前不會運行應用程序)。
同樣,如果您沒有足夠頻繁地重置鎖,則您的鎖可能會在您重置密碼之前過期,而其他應用程序可能會在該時間範圍內運行。
因此根據您的偏好和編碼能力設置數字而不會出現錯誤:-)。如果沒有應用程序運行幾分鐘就可以生活,那麼N = 4到10和M = 1到2應該可以工作。
如果您正在使用的「SQL Server」,你可以設置你的數據庫爲「單用戶模式」
在該模式中,只有當前連接被允許查詢或修改數據庫中的數據或模式。如果任何其他用戶或進程嘗試連接到數據庫,則會收到錯誤。
設置數據庫進入單用戶模式,最簡單的方法是使用下面的命令:
ALTER DATABASE database-name SET SINGLE_USER
一切之前,你的程序應該檢查它是否可以能夠連接數據庫,如果連接建立,程序在這種情況下可以正常運行。
我的問題是如何鎖定實例NOT鎖定數據庫,建議我想使用更多的實例工作相同的數據庫:) – bebosh
- 1. 在同一臺機器上同時運行2個webdriver實例
- 2. 防止同時登錄多臺機器
- 3. 如何防止我的macOS應用程序同時運行多個實例?
- 4. 在同一臺機器上運行兩個logstash實例
- 5. 在同一臺機器上運行Selenium驅動程序的多個實例
- 6. 如何在不同的機器上同時運行多個程序?
- 7. RabbitMQ:防止作業同時在兩個不同的工作人員上運行
- 8. 是否可以在同一臺機器上運行多個SQL Server實例
- 9. Akka是否同時運行同一事件的多個實例?
- 10. 同時運行Windows Phone 7仿真器的多個實例
- 11. 如何防止在同一時間運行兩個Install Shield嚮導實例?
- 12. 在同一臺機器上設置的JBoss的多個實例
- 13. 當多個Java程序在同一臺機器上運行時
- 14. 運行兩個實例的VLC同時
- 15. 如何在同一時間使用黃瓜在不同的瀏覽器實例上運行多個測試
- 16. 在同一臺機器上設置ejabberd的多個實例
- 17. 阻止在nodejs中同時運行兩個函數實例
- 18. 同時運行兩個不同版本的Jboss實例
- 19. 如何用不同的pathdef同時運行兩個MATLAB實例?
- 20. 如何停止運行多個實例的同一線程
- 21. 防止功能運行多次,同時運行
- 22. 相同的python解釋器實例同時運行多個腳本?
- 23. 在同一時間運行cron的多個實例
- 24. 在同一臺機器上爲不同的應用程序運行多個jvms
- 25. 如何在同一臺機器上運行JBoss 4.0的多個實例(在Eclipse下運行)?
- 26. Javaw.exe - 同時運行約60個實例
- 27. 同時運行可執行文件的多個實例
- 28. 如何在不同的AppDomain中運行多個服務實例?
- 29. 防止多個用戶在macOS上同時運行應用程序
- 30. 防止PHP腳本同時運行
運行數據庫的數據庫系統是什麼? –
SQL Server 2008 R2 – bebosh