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

Источник: habrahabr
alexanderzaytsev

В ADO.NET провайдерах для OraclePostgreSQL и, возможно, других есть одна неприятная особенность, которая может сказаться на производительности вашего приложения, если вы запрашиваете у сервера большие объемы данных: они не кэшируют вызовы метода  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");

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


Страница сайта http://www.interface.ru
Оригинал находится по адресу http://www.interface.ru/home.asp?artId=30140