В ADO.NET провайдерах для Oracle, PostgreSQL и, возможно, других есть одна неприятная особенность, которая может сказаться на производительности вашего приложения, если вы запрашиваете у сервера большие объемы данных: они не кэшируют вызовы метода IDataReader.GetOrdinal. Как оказалось это очень критично для NHibernate, но, к счастью, разработчики NHibernate (а точнее Hibernate) эту проблему заметили и уже решили.
Но эта фича осталась незамеченной и почти не задокументированной.
Для того, чтобы в 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");
Ссылки по теме
- nhibernate.jira.com/browse/NH-3207
- ramblingabout.wordpress.com/2009/01/07/optimizing-oracle-and-hibernate-performance/
- martijndashorst.com/blog/2006/11/28/hibernate-31-something-performance-problems-contd/
Автор: alexanderzaytsev