我有一些代码只想允许一个线程访问。我知道如何使用synchronized块或方法来完成此操作,但是在集群环境中可以工作吗?
synchronized
目标环境是WebSphere 6.0,集群中有2个节点。
我感觉这种方法synchronized行不通,因为每个节点上的每个应用程序实例都将拥有自己的JVM,对吗?
我在这里试图做的是在启动系统时对数据库记录进行一些更新。它将查找代码版本之前的所有数据库记录,并执行特定的任务来更新它们。我只希望一个节点执行这些升级,因为我想确保每个工作项仅升级一次,并且这些升级的性能不是大问题,因为它仅在应用程序启动时发生,并且实际上只做任何事情自上次启动以来更改代码的时间。
该数据库是DB2v9,我直接通过JNDI(没有ORM层)访问它。
有人建议全局锁定可能是解决问题的方法,但是我不确定如何做到这一点。
有人在这个领域有什么指针吗?
谢谢!
您是正确的,跨进程的同步将无法使用Java同步结构进行。幸运的是,您的问题确实不是代码同步之一,而是同步与数据库的交互。
解决此问题的正确方法是使用数据库级锁定。大概您有一个包含数据库模式版本的表,因此您应确保在启动/升级过程中锁定该表。
如果您指定数据库类型(DB2?)和访问方法(原始sql,jpa等),则涉及的精确sql / db调用可能会更加清楚。
更新(8/4/2009 2:39 PM) :我建议在一些保存模式版本的表上使用LOCK TABLE语句。这将序列化对该表的访问,从而防止两个实例一次通过升级代码运行。