Prevayler 的同步策略是啥?
Posted
技术标签:
【中文标题】Prevayler 的同步策略是啥?【英文标题】:What are synchronizing strategies for Prevayler?Prevayler 的同步策略是什么? 【发布时间】:2009-01-17 23:27:37 【问题描述】:Prevayler 保证所有写入(通过其事务)都是同步的。但是阅读呢?
如果不使用显式同步(在用户代码中),脏读是可能的吗?
如果业务对象被读取为:
// get the 3rd account
Accont account = (Bank)prevayler.prevalentSystem().getAccounts().get(2);
?
如果是这样,哪些同步策略对用户代码有利?
(假设一个业务对象 A 包含一个业务对象 Bs 的集合),
使用同步集合(A 中的 B),例如 来自 java.util.concurrent 包? 将外部事务的集合读取与 集合写入事务内部,例如使用 围绕读写的“同步(集合)”代码?【问题讨论】:
不能真正回答-它应该是事务安全的,但我实际上使用它有点不同(数据完整性不是那么重要,只是访问速度非常快),所以我没有t 非常注意这些细节。对不起。 @Steve,谢谢。我要再次阅读它的代码:) 【参考方案1】:推荐的方法是使用 JMatch Query 和 Prevayler.execute(Query)。直接或通过使用子类化。
返回的结果必须是原始值或不可变对象。如果您打算返回可变对象,则应将 JMatch Query 子类化以执行这些深层复制。这样,您将获得一个系统,该系统将每个明智的读取与其他(明智的)读取和写入锁定。这可以加快和简化开发,尤其是对于没有多线程编程经验的开发人员。
如果您在高并发负载下需要更高的性能,这应该是一种罕见的情况,您确实可以使用上述细粒度锁定 - 使用“同步”和 java.util.concurrent。
更多详情请见this discussion。
【讨论】:
引用的讨论很有用。【参考方案2】:我已经很久没有使用 Prevayler(大约 6 或 7 年前我在一个 POC 项目中使用它)。我很确定,如果通过 Prevayler 进行所有读取和写入操作,则不需要进一步的同步 - 当然我不需要这样做,并且有多个线程使用数据存储。
【讨论】:
以上是关于Prevayler 的同步策略是啥?的主要内容,如果未能解决你的问题,请参考以下文章