java同步锁 集群,在群集中共享一个Java同步块,或者使用全局锁?

I have some code that I want to only allow access to by one thread. I know how to accomplish this using either synchronized blocks or methods, but will this work in a clustered environment?

The target environment is WebSphere 6.0, with 2 nodes in the cluster.

I have a feeling that synchronized won't work, since each instance of the application on each node will have its own JVM, right?

What I am trying to do here is perform some updates to database records when the system is booted. It will look for any database records that are older that the version of the code, and perform specific tasks to update them. I only want one node to perform these upgrades, since I want to be sure that each work item is only upgraded once, and performance of these upgrades is not a big concern, since it only happens at application startup, and it only really does anything when the code has been changed since the last time it started up.

The database is DB2v9, and I am accessing it directly via JNDI (no ORM layer).

It has been suggested that a global lock might be the way to go here, but I'm not sure how to do that.

Does anyone have any pointers in this arena?

Thanks!

解决方案

You are correct that synchronization across processes will not work using the Java synchronization constructs. Fortunately, your problem really isn't one of code synchronization, but rather of synchronizing interactions with the database.

The right way to deal with this problem is with database level locks. Presumably you have some table that contains a db schema version, so you should make sure to lock that table for the duration of the startup/upgrade process.

The precise sql/db calls involved would probably be more clear if you specified your database type (DB2?) and access method (raw sql, jpa, etc).

Update (8/4/2009 2:39PM): I suggest the LOCK TABLE statement on some table holding the version # of the schema. This will serialize access to that table preventing two instances from running through the upgrade code at once.