2010-03-30 16 views
6

Estoy usando Nhibernate como la herramienta OR/M para una aplicación asp.net y el rendimiento de inicio es realmente frustrante. Parte del problema es definitivamente yo en mi falta de comprensión, pero lo he intentado un poco (la comprensión definitivamente está mejorando) y todavía estoy llegando a ninguna parte.nhibernate configure y buildsessionfactory time

Actualmente, el generador de perfiles de ANTS tiene que Configurar() tarda de 13 a 18 segundos y BuildSessionFActory() tarda unos 5 segundos. Por lo que he leído, estos tiempos en realidad podrían ser bastante buenos, pero en general estaban hablando de cientos y cientos de entidades mapeadas ... este proyecto solo tiene 10.

He combinado todos los archivos de mapeo en un solo archivo de mapeo hbm y esto mejoró las cosas pero solo hasta los tiempos mencionados anteriormente ...

Supongo que hay "trampas para jugadores jóvenes" que se pierden con frecuencia ... obvio "Hice esto/tengo habilitó ese archivo/exclude archivo x/marca y como z "etc ...

Voy a tratar de serializar la configuración para evitar la etapa Configure(), pero creo que esa parte no debería ser tan larga para esa cantidad de entidades y así woul d esencialmente se esconde un problema actual ...

Voy a publicar el código fuente o la configuración si es necesario, pero no estoy seguro de qué poner en serio ...

montones de las gracias!

edición (más información)
También añadiremos que una vez que se termine esto, cada página es extremadamente rápido ...

configuración código- 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> 

Mi clase SessionManager que está unido y no unido en un HttpModule para cada solicitud

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 (resultados log4net)

a publicar bits que tienen una porción de tiempo entre ellos y se desconectará el resto ...

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

Por favor, publique su código de configuración. Esos tiempos de inicio son mucho más largos que cualquier cosa que haya experimentado. –

+0

Sí, definitivamente hay algo mal allí!Sin embargo, como dijo Jamie, probablemente necesitarás publicar el código de configuración para obtener ayuda útil. – UpTheCreek

+0

Una cosa que podría querer hacer es configurar log4net para que pueda revisar el registro nhibernate – UpTheCreek

Respuesta

1

Intente cambiar el nivel de registro para NHibernat e registrador. Parece que lo tienes configurado para DEPURAR, lo que probablemente sea bueno para tu aplicación, pero hará que NHibernate realice una gran cantidad de registros.

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

buen punto, acabo de tenerlo en DEBUG para ver exactamente lo que estaba haciendo con el propósito de rastrear el tiempo ... – davidsleeps

1

¿Intentó eliminar el código relacionado con la memoria caché de la configuración?

Además, ¿has intentado obtener las últimas versiones troncales de NHibernate y Castle?