我是J2EE的新手,所以如果这很明显就道歉。我必须解决一个糟糕的数据库设计,它有一个无法并行安全的更新。解决此问题的最简单方法(暂时)是在方法调用周围放置互斥锁,以序列化它的访问权。
我知道你不能安全地在J2EE中的方法上使用synchronized关键字,因为容器可能会干扰。 J2EE中是否有“支持”的方式在EJB中创建互斥/信号量/锁,以确保为整个J2EE应用程序序列化对方法的访问?
答案 0 :(得分:1)
尝试使用静态对象作为互斥锁,例如:
private static final Object mutex = new Object ();
public void someMethod() {
synchronized(mutex) {
// do work that must be globally synchronous
}
}
在方法本身上使用synchronized
对您起作用的原因是Java EE容器可能会创建多个EJB实例,但标记为synchronized
的方法仅受保护每个实例的基础(每个实例一次只能有一个线程执行synchronized
方法,但可以同时访问多个实例)。
答案 1 :(得分:0)
为了繁荣,java.util.concurrent都被批准在容器中使用。使用信号量阻止将在单个容器中工作,但您需要更高级别的同步才能在群集中保持同步。