防止多个用户执行相同的操作

时间:2011-11-24 11:57:11

标签: java mysql swing

我有一个swing桌面应用程序,安装在局域网内的许多桌面上。我有一个mysql数据库,所有人都在谈论。每天下午5点,有一个线程会在每个应用程序中唤醒,并尝试将文件备份到远程服务器。我想阻止所有桌面应用程序做同样的事情。

我想这样做的方式是:

在下午5点醒来后,所有应用程序都会尝试在MYSQL表上写一行。他们会写相同的信息。只有1个会成功,其他人会得到重复的行异常。无论谁成功,然后继续运行备份程序。

我的问题是:

  1. 这是正确的做事方式吗?有没有更好(更容易)的方式? 我知道我们也可以使用套接字来做到这一点。但我不想沿着这条路走下去...编码太多我还需要确保所有系统能够先互相通信(ping)

  2. 是否支持mysql等功能。我的DB是INNO DB。所以我认为它确实如此。通常我会在局域网中拥有大约20-30个用户。这是否会导致DB处理巨大的开销。

3 个答案:

答案 0 :(得分:1)

如果您可以在应用程序和数据库之间放置一个中间类,它将排队结果并允许它们以有序的方式进行,那么您就会被敲掉。

听起来应用程序都直接针对数据库。您必须修改应用程序以避免此问题。

我对设计有很多疑问:

  1. 为什么他们都写“同一行”?他们不是为自己的个人实例撰写信息吗?
  2. 为什么每个人都拥有完全相同的主键?如果有自动增量或时间戳,则不会出现此问题。
  3. 数据库连接的隔离设置是什么?如果它设置为SERIALIZABLE,你将强制每个人等到前一个完成,但代价是性能。
  4. 你能让他们把所有文件写入公共目录并稍后以有序的方式提取它们吗?
  5. 我现在正在集思广益。

答案 1 :(得分:0)

您似乎希望备份服务器数据而不是客户端数据。

我建议使用使用Java EE的3层架构。 您可以使用定时服务然后触发备份。

虽然备份程序通常是一个独立的程序,例如由服务器上的cron作业启动。但同样:你需要一台服务器来正确地完成这项工作,而不仅仅是一个共享文件夹。

答案 2 :(得分:0)

这是我的建议。不是让所有客户端同时唤醒并尝试执行备份,而是错开他们醒来的时间。

所以当客户醒来时 - 它将检查数据库(MYSQL)中的某个表,以查看备份作业是否已完成或当前是否正在运行。如果工作完成,客户将继续履行其正常职责。您可以决定在作业运行时如何处理案例。 - 如果客户端发现当天没有运行备份作业,它将启动备份作业。同时将修改行以指示备份作业已启动。备份完成后,客户端将修改表格以指示备份已完成。

这种方法可以防止网络活动的激增,也可以提供基本的故障转移形式。因此,如果一个客户端发生故障,稍后另一个客户端可以尝试备份。 (虽然这有点介入。基本上,它归结为客户在看到备份工作正在进行时应该做什么)。

相关问题