如何防止多个实例在不同的机器上同时运行。我想检查其他用户是否实时在同一个实例上工作,而不是等到X时间。
答案 0 :(得分:0)
当您运行应用程序时,首先检查是否有其他计算机正在运行此应用程序,如果没有,请插入一些标识符,这意味着当前计算机XX正在运行您的应用程序。当您关闭应用程序时,请更新您的数据库(或删除您的标识符),以便让其他计算机使用您的应用程序。
如果您想提高可靠性,可以每隔XX个时间单位向数据库发送一些信号,以确认您的机器仍在使用您的应用程序,如果在XX时间单位后没有信号到达,请让其他机器使用该选项你的应用程序这种方法可以让其他用户在某些机器关闭时使用您的应用程序而不报告它(例如,连接问题)。
你可以做得更复杂,并在每次交易或每个XX时间单位检查你的机器仍有资格使用你的应用程序。
希望这有帮助
答案 1 :(得分:0)
有很多方法可以做到这一点:
答案 2 :(得分:0)
在数据库中创建锁定表:
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)
使用一个记录为您的Locks表种子。示例值: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
设置为null,并且在您手动更改{{ 1}}为null)。
同样,如果您没有频繁地重置锁定,那么您的锁定可能会在重置之前到期,而另一个应用程序可以在该时间范围内运行。
因此根据您的偏好和编码能力设置数字而不会出现错误:-)。如果您可以在没有应用程序运行几分钟的情况下生活,N = 4到10和M = 1到2应该可以工作。
答案 3 :(得分:-1)
如果您使用的是“Sql Server”,则可以将数据库设置为“单用户模式”
一旦进入此模式,只允许当前连接查询或修改数据库的数据或模式。如果任何其他用户或进程尝试建立与数据库的连接,则会收到错误。
将数据库设置为单用户模式的最简单方法是使用以下命令:
ALTER DATABASE database-name SET SINGLE_USER
在所有事情之前,您的程序应该检查它是否能够连接数据库,如果建立连接,程序可以在这种情况下正常运行。