Я разрабатываю и приложение, которое работает как служба Windows. Существуют и другие компоненты, которые включают в себя несколько служб WCF, клиентский графический интерфейс и т.д., Но именно служба Windows обращается к базе данных.
Таким образом, приложение является долговременным сервером, и я хотел бы улучшить его производительность и масштабируемость, я пытался улучшить доступ к данным между прочим. Я отправил в другой поток о кэшировании второго уровня.
Это сообщение об управлении сеансом для длинного потока, который обращается к базе данных. Должен ли я использовать поток-статический контекст? Если да, то есть ли какой-нибудь пример того, как это будет реализовано.
Каждый, кто находится в сети, который использует NHibernate, кажется, сильно сосредоточен на архитектуре стиля веб-приложений. Кажется, что существует большая нехватка документации/обсуждения для проектов, отличных от веб-приложений.
В настоящий момент мой длинный поток работает так:
- Вызов 3 или 4 метода DAO
- Проверить состояние возвращенных объектов.
- При необходимости обновите состояние.
- Вызов нескольких методов DAO для сохранения обновленных экземпляров. (передать идентификатор объекта и самого экземпляра), DAO снова извлечет объект из БД и задает обновленные значения и session.SaveOrUpdate() перед совершением транзакции.
- Сон для 'n' секунд
- Повторите все заново!
Итак, следующее общее правило, которое мы используем для каждого из методов DAO:
- Открыть сеанс с использованием sessionFactory.OpenSession()
- Начать транзакцию
- Работает ли db. извлечение/обновление и т.д.
- Commit trans
- (Откат в случае исключения)
- Наконец, всегда удаляйте транзакцию и session.Close()
Это происходит для каждого вызова метода для класса DAO. Я подозреваю, что это своего рода анти-шаблон, как мы это делаем.
Тем не менее, я не могу найти достаточно места в любом месте относительно того, как мы могли бы его улучшить.
Обратите внимание, что хотя этот поток работает в фоновом режиме, делая свои вещи, есть запросы, поступающие от клиентов WCF, каждый из которых может выполнять 2-3 вызова DAO - иногда запрос/обновление тех же объектов в течение длительного времени поток имеет дело с.
Будут высоко оценены любые идеи/предложения/указатели для улучшения нашего дизайна. Если мы сможем продолжить обсуждение, мы могли бы сделать это wiki сообщества и, возможно, ссылаться здесь на http://nhibernate.info
Krishna