Java 如何在Jboss域模式下修复从部署应用程序到DB的重复插入?
我使用默认设置在域模式下运行Jboss,并将war部署到Java 如何在Jboss域模式下修复从部署应用程序到DB的重复插入?,java,mysql,sql,database,jboss,Java,Mysql,Sql,Database,Jboss,我使用默认设置在域模式下运行Jboss,并将war部署到主服务器组,默认情况下部署到两台服务器服务器一、服务器二。 我想将服务器端运行的应用程序中的数据插入到数据库中,但由于它在两台服务器中运行,我得到了对数据库的重复插入,我使用的是MySQL 由于两台服务器上的部署是同时进行的,因此我无法检查它是否已插入数据库中 是否有一个查询允许我在插入MySQL之前进行检查 或者我可以进入正在运行的服务器(服务器一或服务器二),仅当数据库正在运行服务器一时才插入数据库,但是我如何进入应用程序正在运行的服务
主服务器组
,默认情况下部署到两台服务器服务器一、服务器二
。
我想将服务器端运行的应用程序中的数据插入到数据库中,但由于它在两台服务器中运行,我得到了对数据库的重复插入,我使用的是MySQL
由于两台服务器上的部署是同时进行的,因此我无法检查它是否已插入数据库中
是否有一个查询允许我在插入MySQL之前进行检查
或者我可以进入正在运行的服务器
(服务器一或服务器二)
,仅当数据库正在运行服务器一时才插入数据库,但是我如何进入应用程序正在运行的服务器呢?您可以通过执行单例服务触发HA单例插入。
下面是一个示例:您可以通过实现单例服务触发HA单例的插入。
下面是一个示例:要插入一行,只有当它不存在时,才可以使用类似于以下内容的内容(可能需要对mySQL进行调整,我没有实例):
(工作-请注意,这是针对PostgreSQL运行的,因为mySQL窗口不允许插入代码)
如果要生成值
语句,需要插入的行太多,请将它们粘贴到temp(断开连接时清除)表中,然后使用该引用而不是值
引用
无论如何,我还是有点怀疑你想做什么…要插入一行,只有当它不存在时,你才可以使用类似于以下的东西(可能需要对mySQL进行调整,我没有实例):
(工作-请注意,这是针对PostgreSQL运行的,因为mySQL窗口不允许插入代码)
如果要生成值
语句,需要插入的行太多,请将它们粘贴到temp(断开连接时清除)表中,然后使用该引用而不是值
引用
不管怎样,我还是有点怀疑你想做什么…从外部源加载?它是在初始化时加载还是什么?如果需要重新启动服务器,会发生什么情况?除此之外,INSERT
s在我知道的每个RDBMS中允许SELECT
s作为语句的一部分,这意味着它将“忽略”现有行…它正在验证它是否已经在数据库中,因此当服务器重新启动时,它不会再次插入它。是的,它在初始化时加载。为什么它在初始化时加载数据?那可能不是最好的时候。这些数据代表什么?为什么不能将它加载到数据库中一次(作为一个单独的命令),这样就不必担心“重复”;听起来应用程序和数据之间的耦合太紧密了。否则。。。什么能阻止您首先执行标准的SELECT
语句?一个INSERT-SELECT
查询可能是什么?因此,它仅在不存在时插入。它是这样一个简单的表:CREATE table table(id int(10)NOT NULL AUTO_INCREMENT,name varchar(255)NOT NULL,PRIMARY KEY(id))
当它部署到外部源的加载时,它必须自动注册?它是在初始化时加载还是什么?如果需要重新启动服务器,会发生什么情况?除此之外,INSERT
s在我知道的每个RDBMS中允许SELECT
s作为语句的一部分,这意味着它将“忽略”现有行…它正在验证它是否已经在数据库中,因此当服务器重新启动时,它不会再次插入它。是的,它在初始化时加载。为什么它在初始化时加载数据?那可能不是最好的时候。这些数据代表什么?为什么不能将它加载到数据库中一次(作为一个单独的命令),这样就不必担心“重复”;听起来应用程序和数据之间的耦合太紧密了。否则。。。什么能阻止您首先执行标准的SELECT
语句?一个INSERT-SELECT
查询可能是什么?因此,它仅在不存在时插入。它是这样一个简单的表:CREATE table table(id int(10)NOT NULL AUTO_INCREMENT,name varchar(255)NOT NULL,PRIMARY KEY(id))
当它部署到SQL Fiddle上时,它必须自动注册。在schema(左)面板中运行insert/updates/deletes,可能到新表或临时表中。然后,在右侧,您只需从中进行选择即可看到结果。这是MySQL的一个不幸的限制,但做这种事情可以解决大多数问题。@Jake-在这种情况下,我想在插入之前显示表的“原始”状态,我不认为SQL Fiddle允许(独立)选择左面板中的语句……可以保持原始表不变,但是插入到一个新表中。然后,您可以在右侧面板中选择一个然后再选择另一个来查看结果。然后,在右侧,您只需从中进行选择即可看到结果。这是MySQL的一个不幸的限制,但做这种事情可以解决大多数问题。@Jake-在这种情况下,我想在插入之前显示表的“原始”状态,我不认为SQL Fiddle允许(独立)选择左面板中的语句……可以保持原始表不变,但是插入到一个新表中。然后,您可以在右侧面板中选择一个,然后选择另一个来查看结果。
INSERT INTO Registrar (name) (SELECT name
FROM (VALUES ('NEW'), ('EXISTING')) as tmp(name)
WHERE NOT EXISTS (SELECT '1'
FROM Registrar
WHERE Registrar.name = tmp.name))