2010-03-30 10 views
6

Używam Nhibernate jako narzędzia OR/M dla aplikacji asp.net, a wydajność uruchamiania jest naprawdę frustrująca. Część problemu to zdecydowanie mój brak zrozumienia, ale próbowałem już trochę (zrozumienie zdecydowanie się poprawia) i wciąż nie docieram.nhibernate configure and buildsessionfactory time

Obecnie profiler ANTS ma to, że funkcja Configure() zajmuje 13-18 sekund, a BuildSessionFActory() - około 5 sekund. Z tego co przeczytałem, te czasy mogą być całkiem dobre, ale ogólnie mówili o setkach zmapowanych bytów ... ten projekt ma tylko 10.

Połączyłem wszystkie pliki mapowania w plik mapowania pojedynczego hbm i to poprawiło sytuację, ale tylko do czasów wymienionych powyżej ...

Chyba są jakieś "pułapki dla młodych graczy", które są regularnie pomijane ... oczywiste "Zrobiłem to włączyłeś/wyłączyłeś plik x/znacznik y jako z "etc ...

Spróbuję serializować konfigurację, aby uniknąć fazy Configure(), ale uważam, że ta część nie powinna być tak długa dla tej ilości jednostek i tak na duszy D będzie zasadniczo ukrywa bieżący problem ...

będę pisać kod źródłowy lub konfiguracji, jeśli jest to konieczne, ale nie jestem pewien, co umieścić w naprawdę ...

dzięki mnóstwo!

edit (więcej informacji)
będę również dodać, że po zakończeniu tej fazy, każda strona jest niezwykle szybkie ...

konfiguracja Code 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> 

Moja klasa SessionManager który jest związany i niezwiązany w sposób HttpModule dla każdego żądania

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 

edit 2 (wyniki log4net)

będzie zakładać bity, które mają część czasu między nimi i będzie wyciąć resztę ...

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 
+0

Proszę zaksięgować swój kod konfiguracji. Te czasy uruchamiania są znacznie dłuższe niż wszystko, czego doświadczyłem. –

+0

Tak, jest coś zdecydowanie nie tak!Jak powiedział Jamie, prawdopodobnie będziesz musiał opublikować kod konfiguracji, aby uzyskać pomoc. – UpTheCreek

+0

Jedna rzecz, którą możesz chcieć zrobić, to skonfigurować log4net, aby móc przejrzeć dziennik nhibernate – UpTheCreek

Odpowiedz

1

Spróbuj zmienić poziom rejestrowania dla NHibernat e logger. Wygląda na to, że ustawiłeś na DEBUG, co prawdopodobnie jest dobre dla twojej aplikacji, ale spowoduje, że NHibernate wykona olbrzymią ilość rejestrowania.

<log4net> 
    .... 
    <logger name="NHibernate"> 
     <level value="ERROR"/> 
    </logger> 
</log4net> 
+0

Dobrze, po prostu miałem to w DEBUG, żeby zobaczyć dokładnie, co robi w celu śledzenia czasu ... – davidsleeps

1

Czy próbowałeś usunąć kod związany z pamięcią podręczną z konfiguracji?

Czy próbowałeś też zdobyć najnowsze wersje bagażnika NHibernate i Castle?