2010-12-07 18 views
6

¡Estoy usando Fluither NHibernate y me gusta! Tengo un pequeño problema: el tiempo de inicio es de aproximadamente 10 segundos y no sé cómo optimizar Fluent nHibernate Para que este tiempo de inicio sea menos problemático, lo puse en un subproceso.Fluido nHibernate Slow Startup Time

¿Alguien podría encontrar una solución a esto? ¿Y responder con el código modificado a continuación para mejorar el rendimiento?

vi algo como esto en: http://nhforge.org/blogs/nhibernate/archive/2009/03/13/an-improvement-on-sessionfactory-initialization.aspx pero yo no sé cómo hacer este trabajo junto con Fluido NHibernate.

Mi código es así:

public static ISession ObterSessao()   
{ 
     System.Threading.Thread.CurrentThread.Priority = System.Threading.ThreadPriority.Highest; 

     string ConnectionString = ConfigurationHelper.LeConfiguracaoWeb("EstoqueDBNet"); // My Connection string goes here 

     var config = Fluently.Configure() 
      .Database(FluentNHibernate.Cfg.Db.MySQLConfiguration.Standard.ConnectionString(ConnectionString)); 

     config.Mappings(m => m.FluentMappings.AddFromAssembly(Assembly.GetExecutingAssembly())); 

     var session = config 
      .BuildSessionFactory() 
      .OpenSession(); 

     System.Threading.Thread.CurrentThread.Priority = System.Threading.ThreadPriority.Normal; 

     return session; 
    } 

Respuesta

2

Phill tiene la respuesta correcta, pero para tomar un poco más echar un vistazo a http://nhibernate.info/blog/2009/03/13/an-improvement-on-sessionfactory-initialization.html para serializar la configuración de NHibernate en un archivo, para que no tenga que volver a generarla cada vez que inicie la aplicación. Esto puede o no ser un poco más rápido dependiendo de varios factores (principalmente, el número de mapeos que tenga). De acuerdo con esto, Is there any data on NHibernate vs Fluent NHibernate startup performance?

Solo para enfatizar (en función de algunos de sus qns de seguimiento en los comentarios de respuesta), debe serializar el objeto de configuración (NHibernate.Cfg), no el SessionFactory.

Luego, usa la sobrecarga Fluently.Configure(Configuration cfg) para inyectar la configuración al crear su FluentConfiguration (en lugar de hacer que cree automáticamente una para usted).

+0

¡Sí! Ese es un punto que me faltaba: Fluently.Configure (Configuración cfg); Para finalizar esta pregunta, creo que necesito solo otro punto: Cómo hacer lo contrario: ¿Acceder a NHibernate.Cfg.Configuration desde Fluent nHibernate? Con esto podré serializar y deserializar. – Tony

+0

Estoy tratando de hacer esto. En este paso de obtener la configuración para guardar mediante Serialización, tengo este error: no puedo convertir implícitamente el tipo 'FluentNHibernate.Cfg.FluentConfiguration' a 'NHibernate.Cfg.Configuration' – Tony

+1

¡Hola! Funcionó. Lo usé para hacer lo contrario: NHibernate.Cfg.Configuration cfg = config.BuildConfiguration(); // config es FluentConfiguration – Tony

5

Sólo es necesario para construir la configuración de una vez. En este momento está construyendo una nueva configuración cada vez que obtiene una sesión.

+1

Hola, ¿cómo podría almacenar el objeto de configuración en un archivo, así que cuando ejecuto mi programa de nuevo, puedo leerlo (Deserializar) y comenzar el programa rápidamente? Intenté serializar el objeto config en el código anterior, pero solo devolvió esto: Tony

+0

Puede poner su código en un constructor estático y asignar SessionFactory a una propiedad estática que devuelva ISessionFactory. A continuación, llame a obtersesao.OpenSession() – Phill

+0

¿Hay alguna forma de almacenar (serializar) Factory en un archivo y restaurarlo más tarde? Debido a que mi aplicación es ejecutable y cada vez que el usuario la ejecuta, existe un retraso de 10 segundos. – Tony

2

Antes que nada, no te metas con la prioridad de la secuencia, si algo haces, la ralentizarás.

En segundo lugar, como Phill dijo, necesita almacenar en caché su SessionFactory o reconstruirá la configuración cada vez que necesite un objeto de sesión.

Se podría hacer algo como esto, o mover el código en el if en la clase constructor estático:

private static SessionFactory _factory = null; 
public static ISession ObterSessao()   
{ 
    if(_factory == null) { 
     string ConnectionString = ConfigurationHelper.LeConfiguracaoWeb("EstoqueDBNet"); // My Connection string goes here 

     var config = Fluently.Configure() 
      .Database(FluentNHibernate.Cfg.Db.MySQLConfiguration.Standard.ConnectionString(ConnectionString)); 

     config.Mappings(m => m.FluentMappings.AddFromAssembly(Assembly.GetExecutingAssembly())); 

     _factory = config.BuildSessionFactory(); 
    } 

    return _factory.OpenSession(); 
} 
+0

¿Cómo puedo guardar esta _factory en un archivo (Serialize), y cuando vuelvo a utilizar la aplicación, leo el archivo y restauro (Deserialize) la _factory? Porque el problema es la creación de la fábrica y que mi aplicación se ejecute en la máquina del cliente, por lo que cada vez que el usuario hace clic, hay una demora de aproximadamente 10 segundos. – Tony

+0

@Tony, si hay realmente un retraso de 10 segundos cada vez que su usuario hace clic en algo, entonces el problema no está en la configuración Fluent, sino en otro lugar. Al almacenar en caché el SessionFactory, solo debe incurrir en la sobrecarga de la asignación una vez, durante el inicio de la aplicación. ¿La demora de 10 segundos de la que hablas solo en el inicio? – joshperry

Cuestiones relacionadas