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
Proszę zaksięgować swój kod konfiguracji. Te czasy uruchamiania są znacznie dłuższe niż wszystko, czego doświadczyłem. –
Tak, jest coś zdecydowanie nie tak!Jak powiedział Jamie, prawdopodobnie będziesz musiał opublikować kod konfiguracji, aby uzyskać pomoc. – UpTheCreek
Jedna rzecz, którą możesz chcieć zrobić, to skonfigurować log4net, aby móc przejrzeć dziennik nhibernate – UpTheCreek