当前位置: 首页 > 面试题库 >

在集群中共享Java同步块,还是使用全局锁?

万知
2023-03-14
问题内容

我有一些代码只想允许一个线程访问。我知道如何使用synchronized块或方法来完成此操作,但是在集群环境中可以工作吗?

目标环境是WebSphere 6.0,集群中有2个节点。

我感觉这种方法synchronized行不通,因为每个节点上的每个应用程序实例都将拥有自己的JVM,对吗?

我在这里试图做的是在启动系统时对数据库记录进行一些更新。它将查找代码版本之前的所有数据库记录,并执行特定的任务来更新它们。我只希望一个节点执行这些升级,因为我想确保每个工作项仅升级一次,并且这些升级的性能不是大问题,因为它仅在应用程序启动时发生,并且实际上只做任何事情自上次启动以来更改代码的时间。

该数据库是DB2v9,我直接通过JNDI(没有ORM层)访问它。

有人建议全局锁定可能是解决问题的方法,但是我不确定如何做到这一点。

有人在这个领域有什么指针吗?

谢谢!


问题答案:

您是正确的,跨进程的同步将无法使用Java同步结构进行。幸运的是,您的问题确实不是代码同步之一,而是同步与数据库的交互。

解决此问题的正确方法是使用数据库级锁定。大概您有一个包含数据库模式版本的表,因此您应确保在启动/升级过程中锁定该表。

如果您指定数据库类型(DB2?)和访问方法(原始sql,jpa等),则涉及的精确sql / db调用可能会更加清楚。

更新(8/4/2009 2:39 PM)
:我建议在一些保存模式版本的表上使用LOCK
TABLE
语句。这将序列化对该表的访问,从而防止两个实例一次通过升级代码运行。



 类似资料:
  • 问题内容: 考虑以下简单代码: 当child增加myvar时,该值是否与父亲共享(如pthread)? 问题答案: 不,是的。 不,它们不会以程序员可见的任何方式共享;进程可以独立地修改自己的变量副本,并且它们将在不影响其他进程(例如fork()父,兄弟姐妹或后代)的情况下进行更改。 但是,是的,OS实际上最初确实共享页面,因为fork实现了写时复制功能,这意味着只要没有任何进程修改页面,就可以共

  • 问题内容: 我对诺言有很多困惑。是同步还是异步? 问题答案: 传递函数 为 无极构造同步运行,但任何依赖于它的分辨率将异步调用。即使promise立即解决,任何处理程序都将异步执行(类似于when )-主线程首先运行到末尾。 不管您的Javascript环境如何,都是如此-无论您是在Node还是浏览器中。

  • 问题内容: 我知道可以在Python中的各个模块之间共享全局变量。但是,我想知道这种可能性的程度以及原因。例如, global_mod.py mid_access_mod.py bot_modif_mod.py 即使所有模块都共享全局变量x,也将打印“无”。为什么会这样呢?似乎x是在mew()分配给bot_modif_mod.py之前在mid_access_mod.py求值的。 问题答案: 发生这

  • 我看到“Dart是一种单线程编程语言”,所以我认为使用全局变量在函数之间传递数据安全吗 我还看到“Dart提供隔离”,并且可以在多核上运行。这意味着如果不同的分离株访问相同的全局变量,这可能是危险的,对吧? 安全吗?如果没有,有什么方法可以在函数之间共享对象,而不将它们作为参数传递呢? 更新: 根据“Florian Loitsch”的回答,我刚刚写了一个关于隔离的全局变量的测试: 您可以看到一个隔

  • 问题内容: 在我的应用程序(node / express / redis)中,我使用一些代码同时更新数据库中的多个项目: 我可以确定在方法返回之前将执行所有这些操作吗?我关心的是异步处理。由于我不在db操作中使用回调函数,因此可以吗? 问题答案: 使用MULTI / EXEC命令创建命令队列并连续执行它们。然后使用回调发送回连贯的响应(成功/失败)。请注意,您必须使用Redis的AOF来避免这种情

  • 我目前正在阅读Trevor Burnham的Async Javascript。到目前为止这是一本很棒的书。 他谈到这个片段和console.log在Safari和Chrome控制台中是“异步”的。不幸的是我无法复制这个。代码如下: 如果这是异步的,我会预期结果是books的结果。将console.log()放在事件队列中,直到所有代码执行完毕,然后运行它,它将具有bar属性。 虽然它是同步运行的,