Pull to refresh

NHibernate: маленькая хитрость при работе с Oracle или PostgreSQL

Reading time 2 min
Views 4.8K
В 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");


Ссылки по теме

Tags:
Hubs:
+11
Comments 3
Comments Comments 3

Articles