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

    В 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");
    


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

    • +11
    • 3,8k
    • 3
    Поделиться публикацией

    Комментарии 3

      0
      Сделай те уж тогда в догонку пост о использовании ADO.NET провайдерах для Oracle, PostgreSQL)
        0
        Для Oracle уже есть: habrahabr.ru/post/125135/
          0
          я просто ожидал в вашем посте увидеть погружение в недра NHibernate, а оказалось просто описание настройки…

      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

      Самое читаемое