NHibernate + ActiveRecord + PostgreSQL = исключение памяти - PullRequest
2 голосов
/ 13 сентября 2011

У меня есть система в winforms C # .Net 2.0 с ActiveRecord + NHibernate для связи с базой данных PostgreSQL 9.Когда пользователь открывает систему, начинает связь с БД с помощью нового SessionScope ().Для некоторых пользователей это работает отлично ... но для других система генерирует исключение памяти, идентичное проблеме Марсио на форуме msdn: ссылка Как я могу решить эту проблему?Проблема в NHibernate!Ошибка возникает при попытке закрыть объект ISession или при попытке зафиксировать транзакцию.

1 Ответ

1 голос
/ 13 сентября 2011

Основная причина исключения OutOfMemoryException может быть за пределами кода, который вы опубликовали.У вас просто есть утечка памяти, и она может быть где угодно в вашем приложении.Исключение будет выдано из кода, который пытается выделить больше памяти, необязательно из кода, который вызывает утечку памяти.Используйте память profiler , чтобы выяснить причину утечки памяти.

Вполне вероятно, однако, что эта проблема связана с раздутым кэшем 1-го уровня в NHibernate.Из SessionScope документа:

В то же время NHibernate отслеживает изменения объектов в области действия.Если слишком много объектов и слишком много изменений для отслеживания, производительность будет медленно снижаться.Так что время от времени потребуется очистка.

  • Избавьтесь от вызовов GC, они вам не нужны.
  • Ограничьте область сеанса
  • Периодически очищать / очищать сеанс
  • Убедитесь, что вы используете отложенную загрузку надлежащим образом (не загружайте ненужную информацию из базы данных)
...