Настроить nhibernate и собрать время - PullRequest
6 голосов
/ 30 марта 2010

Я использую Nhibernate в качестве инструмента OR / M для приложения asp.net, и производительность при запуске действительно расстраивает. Отчасти проблема заключается во мне из-за недостатка понимания, но я постарался изрядно (понимание определенно улучшается) и до сих пор ни к чему не привел.

В настоящее время профилировщик ANTS считает, что Configure () занимает 13-18 секунд, а BuildSessionFActory () - около 5 секунд. Из того, что я прочитал, на самом деле эти времена могут быть довольно хорошими, но в целом они говорили о сотнях и сотнях отображенных объектов ... у этого проекта всего 10.

Я объединил все файлы сопоставления в один файл сопоставления hbm, и это улучшило ситуацию, но только до времени, упомянутого выше ...

Полагаю, есть ли какие-нибудь "ловушки для молодых игроков", которые регулярно пропускаются ... очевидно "Я сделал это / ты включил / исключил файл x / пометил файл y как z" и т.д. ...

Я попытаюсь сериализовать конфигурацию, чтобы избежать этапа Configure (), но я чувствую, что эта часть не должна быть такой длинной для такого количества объектов и поэтому по существу скрывала бы текущую проблему ...

Я опубликую исходный код или конфигурацию, если необходимо, но я не уверен, что вставить в действительности ...

спасибо, куча!

редактировать (подробнее)
Я также добавлю, что, как только это будет завершено, каждая страница будет чрезвычайно быстрой ...

код конфигурации - hibernate.cfg.xml

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="hibernate-configuration"
    type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate" />
  </configSections>
  <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
    <session-factory>
      <property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>
      <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
      <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
      <property name="connection.connection_string_name">MyAppDEV</property>
      <property name="cache.provider_class">NHibernate.Caches.SysCache.SysCacheProvider, NHibernate.Caches.SysCache</property>
      <property name="cache.use_second_level_cache">true</property>
      <property name="show_sql">false</property>
      <property name="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>
      <property name="current_session_context_class">managed_web</property>

      <mapping assembly="MyApp.Domain"/>
    </session-factory>
  </hibernate-configuration>
</configuration>

Мой класс SessionManager, который связан и не связан в HttpModule для каждого запроса

Imports NHibernate
Imports NHibernate.Cfg

Public Class SessionManager

    Private ReadOnly _sessionFactory As ISessionFactory

    Public Shared ReadOnly Property SessionFactory() As ISessionFactory
        Get
            Return Instance._sessionFactory
        End Get
    End Property

    Private Function GetSessionFactory() As ISessionFactory
        Return _sessionFactory
    End Function

    Public Shared ReadOnly Property Instance() As SessionManager
        Get
            Return NestedSessionManager.theSessionManager
        End Get
    End Property

    Public Shared Function OpenSession() As ISession
        Return Instance.GetSessionFactory().OpenSession()
    End Function

    Public Shared ReadOnly Property CurrentSession() As ISession
        Get
            Return Instance.GetSessionFactory().GetCurrentSession()
        End Get
    End Property

    Private Sub New()
        Dim configuration As Configuration = New Configuration().Configure()
        _sessionFactory = configuration.BuildSessionFactory()
    End Sub

    Private Class NestedSessionManager
        Friend Shared ReadOnly theSessionManager As New SessionManager()
    End Class

End Class

редактировать 2 (результаты log4net)

опубликует биты, у которых есть доля времени между ними, и вырежет остальные ...

2010-03-30 23:29:40,898 [4] INFO  NHibernate.Cfg.Environment [(null)] - Using reflection optimizer
2010-03-30 23:29:42,481 [4] DEBUG NHibernate.Cfg.Configuration [(null)] - dialect=NHibernate.Dialect.MsSql2005Dialect

...

2010-03-30 23:29:42,501 [4] INFO  NHibernate.Cfg.Configuration [(null)] - Mapping resource: MyApp.Domain.Mappings.hbm.xml
2010-03-30 23:29:43,342 [4] INFO  NHibernate.Dialect.Dialect [(null)] - Using dialect: NHibernate.Dialect.MsSql2005Dialect
2010-03-30 23:29:50,462 [4] INFO  NHibernate.Cfg.XmlHbmBinding.Binder [(null)] - Mapping class: 

...

2010-03-30 23:29:51,353 [4] DEBUG NHibernate.Connection.DriverConnectionProvider [(null)] - Obtaining IDbConnection from Driver
2010-03-30 23:29:53,136 [4] DEBUG NHibernate.Connection.ConnectionProvider [(null)] - Closing connection

Ответы [ 2 ]

1 голос
/ 01 апреля 2010

Вы пытались удалить связанный с кешем код из конфигурации?

Кроме того, вы пытались получить последние версии стволов NHibernate и Castle?

1 голос
/ 30 марта 2010

Попробуйте изменить уровень ведения журнала для регистратора NHibernate. Похоже, что вы установили DEBUG, что, вероятно, подходит для вашего приложения, но заставит NHibernate сделать огромное количество журналирования.

<log4net>
  ....
  <logger name="NHibernate">
      <level value="ERROR"/>
  </logger>
</log4net>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...