我的应用程序在 4 个节点的集群上运行。在启动时 (ServletContextListener),它必须执行一个 SQL 脚本。如何确保 SQL 只执行一次而不是 4 次,因为每个节点都会尝试执行相同的代码?
问问题
1666 次
1 回答
1
如果你想只执行一次(比如更新数据库结构的脚本),你应该在数据库中使用某种版本字段(在最简单的情况下只是一个单列/单行表)。如果您不想自己做, http: //flywaydb.org/可能是您的解决方案。如果您只是想确保没有实例同时运行相同的脚本,您可以使用基本相同的想法,但不要使用总是增加的版本字段,而是使用您在脚本完成后重置的相同类型的布尔锁。如果你想自己实现ist,一定要正确处理并发访问。例如,代替select entry from lock /if entry = 0 update lock set entry = 1
which is non atomic 做类似的事情update lock set entry = 1 where entry = 0/check if number affected rows = 1
于 2012-12-12T06:42:35.367 回答