дозвуковой с поддержкой кеширования

Имея в виду проект со следующими требованиями.

  • приложение с интенсивным чтением данных.
  • Максимум 100 одновременных пользователей раз. У приложения очень высокий трафик
  • Хотя данные огромны, они изменяются только один раз в день.

Решили использовать дозвуковые, потому что они просты в освоении и могут работать в условиях высокой проходимости.

Хотя кое-что еще не найдено / не решено для работы с SubSonic 3

  • Какой тип слоя использовать Active Records, Repository, Linq To SQL
  • работа с хранимыми процедурами подкачки / сортировки (потому что они обеспечат лучшую производительность по сравнению со встроенным механизмом подкачки при отображении более 10000 строк с подкачкой и сортировкой. верно ??)
  • Кеширование, с требованиями проекта это совершенно ясно, требуется интенсивное использование кеширования. Но не удалось найти подходящего решения, которое будет работать с дозвуковыми. нужно ли мне создавать для него отдельный слой, и если да, будет полезен небольшой пример.

person BigBoss    schedule 10.07.2009    source источник


Ответы (3)


Я написал класс CacheUtil для дозвуковой 2.x ActiveRecord. Он основан на коде, опубликованном на старых форумах по дозвуковой технологии. (Это из форума, который был удален до того, как был удален последний форум. Вот почему программные форумы должны быть постоянными.) Вот пример метода поиска в кэше. Вы можете адаптировать его к ss3. Есть также вставки, выборка, удаление, очистка и т. Д. Роб Коннери сказал в то время, что кеширование было проблематичным, и его специально исключили из ss2. Используя HttpRuntime.Cache, я разделяю кеш между веб-приложением и службой одновременно. Я считаю, что могу это сделать, поскольку это небольшое приложение, всегда на одном сервере.

public static RecordBase<T> Find<T, ListType>(object primaryKeyValue)
    where T: RecordBase<T>, new()
    where ListType: AbstractList<T, ListType>, new()
{
    string key = typeof(T).ToString();
    if(HttpRuntime.Cache[key] == null)
        FetchAll<T, ListType>();
    if(HttpRuntime.Cache[key] != null)
    {
        ListType collection = (ListType)HttpRuntime.Cache[key];
        foreach(T item in collection)
        {
            if(item.GetPrimaryKeyValue().Equals(primaryKeyValue))
                return item;
        }
    }
    return null;
}
person P a u l    schedule 11.07.2009
comment
Я использовал HttpRuntime.Cache с кешированием на основе SQL Server. Таким образом решается мое требование высокой доступности и высокого параллелизма. Этот ответ подходит к завершению того, что я реализовал. - person BigBoss; 23.11.2011

Я написал сообщение о как я использовал кеширование в SubSonic 2.x. Он не на 100% совместим с 3.x, но концепции те же.

person John Sheehan    schedule 12.07.2009

Я ответил на это аналогичным образом здесь, Поточно-ориентированные библиотеки кеширования для .NET . В основном вам нужен CollectionCacheManager - затем я добавляю слой сверху для каждого типа и направляю все запросы через эти отдельные контроллеры кеша, которые, в свою очередь, используют 1 collectioncachecontroller. На внешнем слое я смешиваю чистый дозвуковой, linq, все, что подходит в то время. Преимущество SubSonic в том, что он не должен мешать вам. Что касается производительности хранимых процессов, я бы указал на статьи Джеффа Этвуда на CodingHorror и восстановил ваши сбережения. Оборудование очень дешево, как и память, а базы данных - нет. Лично я делаю базу данных очень простой и легкой и предпочитаю, чтобы мой веб-сервер кэшировал все в памяти. Сервер базы данных выполняет очень мало работы, что мне нравится. Добавление нескольких дополнительных веб-серверов с балансировкой нагрузки - не такая большая проблема, как увеличение пропускной способности базы данных, кластеризация или сегментирование БД. SQL и хранимые процедуры также могут быть смехотворно сложными для написания и поддержки. Возьмите тот бюджет, который вы бы потратили на это время, и вместо этого увеличьте свое оборудование ... Помните, что оборудование очень дешево, а хорошие разработчики - нет. Удачи!

person JTtheGeek    schedule 31.01.2011
comment
может быть глупый вопрос, но разве блок приложения MS Caching не является Thread Safe. В чем будет преимущество использования предлагаемого кеш-менеджера по сравнению с этим. - person BigBoss; 01.02.2011
comment
Блок кэширования MS специально указывает, что сценарий использования предназначен для данных, которые редко меняются: msdn. microsoft.com/en-us/library/ff650180.aspx. Для RIA это обычно не так, и мне также нужно было что-то немного более подходящее для использования Guids - первичных ключей, которые хорошо бы вписывались в SubSonic. Блок кеширования хорош и очень полезен, но не решает проблему кеширования коллекции. - person JTtheGeek; 02.02.2011