gpt4 book ai didi

c# - NHibernate ReadWriteCache、版本控制和父/子映射

转载 作者:太空宇宙 更新时间:2023-11-03 11:27:52 25 4
gpt4 key购买 nike

简要说明:父项及其子项之一更新后,事务提交, session 关闭,下一个 session 从 L2 缓存获取父项,但更新的子项从数据库加载。 parent 是版本化的, child 不是。

详细说明:正如我提到的,我有 parent 和 child 的集合。父项是版本化的,但子项不是我的应用程序,映射保证所有更新都是通过保存父项来完成的。我看到当我加载带有子项的父项时,父项和大多数子项是从 L2 缓存加载的,但最近更新的子项是从数据库加载的。我对 ReadWriteCache 细节做了一些研究,发现在我保存父级并更新子级后,以下代码决定不更新缓存:

public bool Put(CacheKey key, object value, long txTimestamp, object version, IComparer versionComparator, bool minimalPut)
{
bool CS$1$0000;
if (txTimestamp == -9223372036854775808L)
{
return false;
}
lock (this._lockObject)
{
if (log.IsDebugEnabled)
{
log.Debug("Caching: " + key);
}
try
{
this.cache.Lock(key);
ILockable lockable = (ILockable) this.cache.Get(key);
if ((lockable == null) || lockable.IsPuttable(txTimestamp, version, versionComparator))
{
this.cache.Put(key, new CachedItem(value, this.cache.NextTimestamp(), version));
if (log.IsDebugEnabled)
{
log.Debug("Cached: " + key);
}
return true;
}
if (log.IsDebugEnabled)
{
if (lockable.IsLock)
{
log.Debug("Item was locked: " + key);
}
else
{
log.Debug("Item was already cached: " + key);
}
}
CS$1$0000 = false;
}
finally
{
this.cache.Unlock(key);
}
}
return CS$1$0000;
}

在我的例子中,lockable 不为空,但它不可放置:

public bool IsPuttable(long txTimestamp, object newVersion, IComparer comparator)
{
// we really could refresh the item if it
// is not a lock, but it might be slower
//return freshTimestamp < txTimestamp
return version != null && comparator.Compare(version, newVersion) < 0;
}

正如您从 NHibernate 源代码中看到的那样,早期的 IsPuttable 决定是通过比较时间戳做出的,但现在版本开始发挥作用。

现在的问题是:我是否应该对领域模型中的每个实体进行版本控制?在问题出现之前,我确信我应该只对聚合根进行版本控制。

我真的希望找到另一种方法来解决这个问题,因为我的父子层次结构要深得多(不要问为什么 :)),假设它有 3 层深(实际上它更深):根-> child ->孙

在只有 GrandChild 被更新的情况下,我期望有 2 个 UPDATE 语句:一个用于 GrandChild,另一个用于 Root 更新其版本。但是,如果我也使用 Child 版本,这将花费我额外的数据库更新和往返 :( ... 顺便说一句,应该 ping Ayende 或来自 NH 的人 - NH 的 ADO.NET 批处理仅适用于相同的实体,它不会放入相同的GrandChild、Child 和 Root 的批量更新语句。

最佳答案

您还需要为您的子实体设置版本属性,而不仅仅是聚合根。我在当前项目中有一个类似的用例,这就是工作方式。我们通过在我们实体的基类和我们的 fluent nhibernate 映射类的基类中实现版本来管理这一点。

关于c# - NHibernate ReadWriteCache、版本控制和父/子映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8815651/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com