我有一个swing桌面应用程序,安装在局域网内的许多桌面上。我有一个mysql数据库,所有人都在谈论。每天下午5点,有一个线程会在每个应用程序中唤醒,并尝试将文件备份到远程服务器。我想阻止所有桌面应用程序做同样的事情。
我想这样做的方式是:
在下午5点醒来后,所有应用程序都会尝试在MYSQL表上写一行。他们会写相同的信息。只有1个会成功,其他人会得到重复的行异常。无论谁成功,然后继续运行备份程序。
我的问题是:
这是正确的做事方式吗?有没有更好(更容易)的方式? 我知道我们也可以使用套接字来做到这一点。但我不想沿着这条路走下去...编码太多我还需要确保所有系统能够先互相通信(ping)
是否支持mysql等功能。我的DB是INNO DB。所以我认为它确实如此。通常我会在局域网中拥有大约20-30个用户。这是否会导致DB处理巨大的开销。
答案 0 :(得分:1)
如果您可以在应用程序和数据库之间放置一个中间类,它将排队结果并允许它们以有序的方式进行,那么您就会被敲掉。
听起来应用程序都直接针对数据库。您必须修改应用程序以避免此问题。
我对设计有很多疑问:
我现在正在集思广益。
答案 1 :(得分:0)
您似乎希望备份服务器数据而不是客户端数据。
我建议使用使用Java EE的3层架构。 您可以使用定时服务然后触发备份。
虽然备份程序通常是一个独立的程序,例如由服务器上的cron作业启动。但同样:你需要一台服务器来正确地完成这项工作,而不仅仅是一个共享文件夹。
答案 2 :(得分:0)
这是我的建议。不是让所有客户端同时唤醒并尝试执行备份,而是错开他们醒来的时间。
所以当客户醒来时 - 它将检查数据库(MYSQL)中的某个表,以查看备份作业是否已完成或当前是否正在运行。如果工作完成,客户将继续履行其正常职责。您可以决定在作业运行时如何处理案例。 - 如果客户端发现当天没有运行备份作业,它将启动备份作业。同时将修改行以指示备份作业已启动。备份完成后,客户端将修改表格以指示备份已完成。
这种方法可以防止网络活动的激增,也可以提供基本的故障转移形式。因此,如果一个客户端发生故障,稍后另一个客户端可以尝试备份。 (虽然这有点介入。基本上,它归结为客户在看到备份工作正在进行时应该做什么)。