В ADO.NET провайдерах для Oracle, PostgreSQL и, возможно, других есть одна неприятная особенность, которая может сказаться на производительности вашего приложения, если вы запрашиваете у сервера большие объемы данных: они не кэшируют вызовы метода IDataReader.GetOrdinal. Как оказалось это очень критично для NHibernate, но, к счастью, разработчики NHibernate (а точнее Hibernate) эту проблему заметили и уже решили.
Но эта фича осталась незамеченной и почти не задокументированной.
Для того, чтобы в NHibernate включить кэширование вызовов IDataReader.GetOrdinal необходимо в hibernate.cfg выставить опцию «adonet.wrap_result_sets» в значение «true»:
C помощью FluentNHibernate это делается так:
Метод _ExposeConfiguration_ добавляет действия, которые будут вызваны над объектом NHibernate.Cfg.Configuration при вызове метода BuildConfiguration. Таким образом код выше будет аналогичен следующему:
Но эта фича осталась незамеченной и почти не задокументированной.
Для того, чтобы в NHibernate включить кэширование вызовов IDataReader.GetOrdinal необходимо в hibernate.cfg выставить опцию «adonet.wrap_result_sets» в значение «true»:
<?xml version="1.0" encoding="utf-8" ?> <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"> <!-- other options --> <session-factory name="MySessionFactory"> <!-- other session factory options --> <property name="adonet.wrap_result_sets">true</property> </session-factory> </hibernate-configuration>
C помощью FluentNHibernate это делается так:
var config = Fluently.Configure() .ExposeConfiguration(c => c.SetProperty(Environment.WrapResultSets, "true")) .Database(db) /* other configuration */ .BuildConfiguration();
Метод _ExposeConfiguration_ добавляет действия, которые будут вызваны над объектом NHibernate.Cfg.Configuration при вызове метода BuildConfiguration. Таким образом код выше будет аналогичен следующему:
var config = Fluently.Configure() .Database(db) /* other configuration */ .BuildConfiguration(); config.SetProperty(NHibernate.Cfg.Environment.WrapResultSets, "true");