我有一个EJB,如下所示。这是为了测试目的而创建的 - 我睡觉"我希望模拟在同步方法执行完毕之前再次调度查询的情况。
观察到的行为与预期的一样 - 但这是否是轮询数据库的正确方法,例如,已插入的行以便在更新之前执行某些处理?我希望该方法能够同步,因为我不希望在处理前一个方法调用时修改数据库状态的另一个调用
@Singleton
public class MyResource {
@PersistenceContext(unitName="MyMonitor")
private EntityManager em;
@Schedule(second="*", minute="*", hour="*")
public synchronized void checkDb() throws SQLException, InterruptedException {
List<ReferenceNames> l =
em.createQuery("from Clients cs", Clients.class).getResultList();
Thread.sleep(2000);
System.out.println(l.size());
}
}
答案 0 :(得分:2)
您不应该自己实现单点数据库访问,只是为了确保在更新期间不会更改记录。为此,您希望使用数据库锁定。在Java EE / JPA 2.0中,您有几种锁定模式,请查看示例this Oracle blog或this wikibook article。关于在锁定期间尝试写入的其他组件,您必须对锁定异常做出反应并实现某种重试机制。