是否有必要使用Subsonic 3简单存储库缓存延迟加载属性的数据?

时间:2009-09-20 03:55:08

标签: subsonic

我在Customer类上添加了一个名为Orders的惰性属性。您认为将数据缓存在私有字段中是明智的吗?

private IList<Order> _orders;

[SubSonicIgnore]
public IList<Order> Orders
{
    get
    {
        if (_orders == null)
        {
            var repository = new SimpleRepository("MyConnectionString", SimpleRepositoryOptions.None);
            _orders = repository.Find<Order>(x => x.CustomerId == this.CustomerId);
        }
        return _orders;
    }
}

或者最好不要像这样缓存它:

[SubSonicIgnore]
public IList<Order> Orders
{
    get
    {
        var repository = new SimpleRepository("MyConnectionString", SimpleRepositoryOptions.None);
        return repository.Find<Order>(x => x.CustomerId == this.CustomerId);
    }
}

我问的原因是因为我认为为了性能而缓存数据是一个好主意,但与此同时我担心缓存数据会导致数据不同步其他进程插入/删除数据库中的记录。

1 个答案:

答案 0 :(得分:0)

在您的情况下,您的缓存订单将在您的Customers对象的生命周期内存在。如果您需要清除缓存的订单,您可以简单地为您的客户重新查询
如果我是你,我会添加一个额外的属性,其名称指定有缓存,添加自定义cacheScope对象(如transactionScope,只有范围存在时缓存才存在),或在文档中指定属性将执行缓存子对象以及持续多长时间
我不会删除缓存。我会将其作为附加属性留在那里。如果你需要,你会得到它
感谢您展示您的缓存逻辑。这是我的。在我的情况下,我的父对象的预期寿命很短,我不希望&gt;总父/子数据的100条记录,我确实会使用所有的子数据。如果我的数据发生了变化,那么我需要重新设置我在这个特定实例中使用的缓存逻辑:

private static List<HostHeader> _cachedHostHeaders;

public List<HostHeader> CachedHostHeaders
{
    get
    {
        if (_cachedHostHeaders == null)
            _cachedHostHeaders = this.HostHeaders.ToList();

        return _cachedHostHeaders.Where(i => i.SiteID == this.ID).ToList();
    }
}