Нужно ли кэшировать данные для лениво загруженного свойства с помощью простого хранилища Subsonic 3? - PullRequest
0 голосов
/ 20 сентября 2009

Я добавил свойство lazyloaded под названием Orders в мой класс Customer. Как вы думаете, разумно ли кэшировать данные в приватном поле?

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 голосов
/ 26 октября 2009

В вашем случае ваши кэшированные Заказы будут существовать в течение всего срока службы вашего объекта Customer. Если вам нужно очистить кэшированные заказы, вы можете просто запросить их у клиента.

Если бы я был вами, я бы добавил дополнительное свойство, имя которого указывает на наличие кэширования, добавил пользовательский объект cacheScope (например, TransactionScope, кэш существует только до тех пор, пока существует область действия) или указал в документации, какие свойства будут выполнять Кэширование дочерних объектов и как долго.

Я бы не убрал кеширование. Я бы оставил его там как дополнительное свойство. Вы получите его, если вам это нужно.

Спасибо за показ вашей логики кеширования. Вот мой. В моем случае ожидаемая продолжительность жизни моего родительского объекта невелика, я не ожидаю> 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();
    }
}
...