- PVSM.RU - https://www.pvsm.ru -

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

В ADO.NET провайдерах для Oracle [1], PostgreSQL [2] и, возможно, других есть одна неприятная особенность, которая может сказаться на производительности вашего приложения, если вы запрашиваете у сервера большие объемы данных: они не кэшируют вызовы метода IDataReader.GetOrdinal [3]. Как оказалось это очень критично для NHibernate [4], но, к счастью, разработчики NHibernate (а точнее Hibernate [5]) эту проблему заметили и уже решили.

Но эта фича осталась незамеченной и почти не задокументированной.

Для того, чтобы в 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 [6] это делается так:

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");
Ссылки по теме

Автор: alexanderzaytsev


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/postgresql/11098

Ссылки в тексте:

[1] Oracle: http://www.oracle.com/database

[2] PostgreSQL: http://www.postgresql.org/

[3] IDataReader.GetOrdinal: http://msdn.microsoft.com/en-us/library/system.data.idatarecord.getordinal.aspx

[4] NHibernate: http://nhforge.org/

[5] Hibernate: http://www.hibernate.org/

[6] FluentNHibernate: http://www.fluentnhibernate.org/

[7] nhibernate.jira.com/browse/NH-3207: https://nhibernate.jira.com/browse/NH-3207

[8] ramblingabout.wordpress.com/2009/01/07/optimizing-oracle-and-hibernate-performance/: http://ramblingabout.wordpress.com/2009/01/07/optimizing-oracle-and-hibernate-performance/

[9] martijndashorst.com/blog/2006/11/28/hibernate-31-something-performance-problems-contd/: http://martijndashorst.com/blog/2006/11/28/hibernate-31-something-performance-problems-contd/