5

Prevayler 保证所有写入(通过其事务)都是同步的。但是阅读呢?

如果不使用显式同步(在用户代码中),脏读是可能的吗?

如果业务对象被解读为:

// get the 3rd account
Accont account = (Bank)prevayler.prevalentSystem().getAccounts().get(2);

?

如果是这样,哪些同步策略对用户代码有好处?

(考虑一个业务对象 A 包含业务对象 Bs 的集合),

  • 使用同步集合(A 内的 B),例如来自 java.util.concurrent 包?
  • 同步集合读取外部事务与集合写入事务内部,例如在读写周围使用“同步(集合)”代码?
4

2 回答 2

4

推荐的方法是使用 JMatch Query 和 Prevayler.execute(Query)。直接或通过使用子类化。

返回的结果必须是原始值或不可变对象。如果您打算返回可变对象,则应将 JMatch Query 子类化以执行这些深层复制。这样,您将获得一个系统,该系统将每个明智的读取与其他(明智的)读取和写入锁定。这可以加快和简化开发,尤其是对于没有多线程编程经验的开发人员。

如果您在高并发负载下需要更高的性能,这应该是一种罕见的情况,您确实可以使用上述细粒度锁定 - 使用“同步”和 java.util.concurrent。

有关更多详细信息,请参阅此讨论

于 2009-01-26T08:00:53.707 回答
1

自从我看到 Prevayler 已经有很长时间了(大约 6 或 7 年前,我在 POC 项目中使用过它)。我很确定,如果通过 Prevayler 进行所有读取和写入,则不需要进一步的同步 - 当然我不需要这样做,并且有多个线程使用数据存储。

于 2009-01-24T06:32:22.570 回答