Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 防止多个用户执行相同的操作_Java_Mysql_Swing - Fatal编程技术网

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

Java 防止多个用户执行相同的操作,java,mysql,swing,Java,Mysql,Swing,我有一个swing桌面应用程序,安装在局域网内的许多桌面上。我有一个mysql数据库,所有人都可以访问。每天下午5点,每个应用程序中都会有一个线程醒来,并尝试将文件备份到远程服务器。我想阻止所有桌面应用程序做同样的事情 我当时的想法是: 下午5点醒来后,所有应用程序都会尝试在MYSQL表中写入一行。他们会写同样的信息。只有1将成功,其他将获得重复的行异常。无论谁成功,都将继续运行备份程序。 我的问题是: 这是正确的做事方式吗?有更好(更容易)的方法吗? 我知道我们也可以使用插座来实现这一点。但我

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

我当时的想法是:

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

我的问题是:

  • 这是正确的做事方式吗?有更好(更容易)的方法吗? 我知道我们也可以使用插座来实现这一点。但我不想走那条路。。。太多的编码也需要确保所有的系统都可以先相互通信(ping)

  • 将mysql支持如一个功能。我的数据库是InnoDB。所以我想是的。通常,我在局域网中会有大约20-30个用户。这将导致数据库处理巨大的开销


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

    听起来,所有的应用程序都直接与数据库对抗。您必须修改应用程序以避免此问题

    我对设计有很多疑问:

  • 为什么他们都写“同一行”?他们不是在为自己的实例编写信息吗
  • 为什么它们中的每一个都有完全相同的主键?如果有自动增量或时间戳,则不会出现此问题
  • 数据库连接上的隔离设置为什么?如果设置为SERIALIZABLE,您将强制每个进程等待上一个进程完成,这将以性能为代价
  • 你能让他们把所有的文件都写到一个公共目录中,然后有序地把它们取出来吗

  • 我现在只是想集思广益。

    您似乎想备份服务器数据,而不是客户端数据

    我建议使用使用JavaEE的三层体系结构。 然后可以使用计时器服务触发备份


    虽然备份程序通常是一个独立的程序,例如由服务器上的cron作业启动。但同样地,您需要一个服务器来正确地执行此操作,而不仅仅是一个共享文件夹。

    以下是我的建议。与其让所有客户端同时唤醒并尝试执行备份,不如错开它们的唤醒时间

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


    这种方法将防止网络活动激增,还可以提供基本形式的故障切换。因此,如果一个客户端出现故障,另一个客户端稍后可以尝试备份。(虽然这有点复杂。基本上,这取决于客户端在看到备份作业正在进行时应该做什么)。

    为什么不使用未安装在桌面上的专用备份系统?只有一个客户端应该做备份?你想备份存储在桌面上的数据还是存储在服务器上的数据?@Gandalf-这实际上很难做到。这是我们最初想到的一个好主意,但在备份过程中用户会参与其中。如果专用用户没有启动应用程序,则无法进行备份。“在每个应用程序中,尝试将文件备份到远程服务器”。“在每个”听起来好像每个客户端都会做备份。“到远程服务器”听起来像是存储在服务器中。这个问题写得很好。@Puce-备份数据应该存储在远程服务器上-实际上是AmazonS3。所有客户端都可以访问相同的数据库和文件(在共享文件夹中)。因此,如果备份同时在所有用户的桌面上运行,那么他们实际上是在一次又一次地备份相同的文件。我想我可能在这个问题上没有说清楚。。很抱歉中间类是不可能的,因为它们是在不同桌面上运行的独立应用程序。不幸的是,我无法将请求排队。因此,我想使用数据库来决定谁真正获胜。谁先将记录写入数据库,谁就赢!他们可以上传数据。其他人没有。是的,你可以创建一个中间类。它将在网络上监听,就像数据库一样。您的应用程序只需写入应用程序,而不是打开JDBC连接并写入数据库。该中介可以将请求排队。将其视为位于客户端和数据库之间的服务。您正以这种方式进行面向服务的体系结构。你目前的设计,正如所写的,是有缺陷的,但是你已经知道了。啊!可以这是个好主意,但不幸的是,这会给我带来安装问题。现在,我需要确保在数据库运行的服务器上也运行java程序。这个java程序需要作为windows服务创建,并且必须与系统一起启动。。我不明白。我想将存储在客户端桌面上的数据备份到服务器上。我在客户机系统上安装的应用程序是一个swing应用程序。swing应用程序需要将数据备份到