2011-12-02 58 views
-1

我在一个新的桌面项目上使用NHibernate 3。我已阅读关于序列化配置对象。我做到了,但有时并没有奏效。我开始认为它只在我启动应用程序(序列化配置对象)时才起作用,然后关闭它并再次启动(几秒钟后)。但是,如果我等待几分钟,那就没有用了。我说的是45+秒。其他奇怪的事情,如果这只发生在几台机器并非全部。一些预期的工作第一次放慢了速度,但是下一个初创公司的速度会更快。NHibernate慢启动有时

这里是我的配置:

创造的配置和会话工厂

class NHibernateUnitOfWorkFactory : IUnitOfWorkFactory 
    { 
     public NHibernateUnitOfWorkFactory(string nhibernateConfigPath) 
     { 
      String serializablefilePath = "configuration.serialized"; 
      try 
      { 
       if (IsConfigurationFileValid(serializablefilePath)) 
       { 
        Configuration = LoadConfigurationFromFile(serializablefilePath); 
       } 
       else 
       { 
        // configuration is immutable, store last returned value 
        Configuration = new Configuration(); 
        Configuration.Configure(nhibernateConfigPath); 
        Configuration.AddAssembly(typeof(ObjectEntity).Assembly); 
        SaveConfigurationToFile(serializablefilePath, Configuration); 
        new SchemaUpdate(Configuration).Execute(true, true); 
       } 
       //NHibernateSchemaExport(); 
      } 
      catch (Exception ex) 
      { 
       throw new GenericRepositoryException(
        string.Format("Error while configuring NHibernate: {0}.", ex.Message) 
        , ex 
        ); 
      } 

      try 
      { 
       SessionFactory = Configuration.BuildSessionFactory(); 
      } 
      catch (Exception ex) 
      { 
       throw new GenericRepositoryException(
        string.Format("Error while building NH session factory: {0}.", ex.Message) 
        , ex 
        ); 
      } 
     } 
     private Boolean IsConfigurationFileValid(String ConfigFile) 
     { 
      //return File.Exists(ConfigFile); 

      var ass = typeof(ObjectEntity).Assembly; //Assembly.GetCallingAssembly(); 
      if (ass.Location == null) 
       return false; 
      var configInfo = new FileInfo(ConfigFile); 
      var assInfo = new FileInfo(ass.Location); 
      if (configInfo.LastWriteTime < assInfo.LastWriteTime) 
       return false; 
      return true; 
     } 

     private static void SaveConfigurationToFile(String ConfigFile, Configuration configuration) 
     { 
      var file = File.Open(ConfigFile, FileMode.Create); 
      var bf = new BinaryFormatter(); 
      bf.Serialize(file, configuration); 
      file.Close(); 
     } 

     private static Configuration LoadConfigurationFromFile(String ConfigFile) 
     { 
      try 
      { 
       var file = File.Open(ConfigFile, FileMode.Open); 
       var bf = new BinaryFormatter(); 
       var config = bf.Deserialize(file) as Configuration; 
       file.Close(); 
       return config; 
      } 
      catch (Exception) 
      { 
       return null; 
      } 

     } 

     protected ISessionFactory SessionFactory { get; private set; } 

     protected Configuration Configuration { get; private set; } 

     /// <summary> 
     /// Generates table structure inside specified database. 
     /// </summary> 
     public void NHibernateSchemaExport() 
     { 
      new SchemaExport(this.Configuration).Execute(false, true, false); 
     } 

     #region IUnitOfWorkFactory Members 

     public IUnitOfWork BeginUnitOfWork() 
     { 
      return new NHibernateUnitOfWork(this.SessionFactory.OpenSession()); 
     } 

     public void EndUnitOfWork(IUnitOfWork unitOfWork) 
     { 
      var nhUnitOfWork = unitOfWork as NHibernateUnitOfWork; 
      if (unitOfWork != null) 
      { 
       unitOfWork.Dispose(); 
       unitOfWork = null; 
      } 
     } 

     #endregion 

     #region IDisposable Members 

     public void Dispose() 
     { 
      if (this.SessionFactory != null) 
      { 
       (this.SessionFactory as IDisposable).Dispose(); 
       this.SessionFactory = null; 
       this.Configuration = null; 
      } 
     } 

     #endregion 
    } 

xml配置

<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" > 
    <reflection-optimizer use="true"/> 
    <session-factory name="NHibernate.Test"> 
    <property name="connection.driver_class">NHibernate.Driver.OracleClientDriver</property> 
    <property name="connection.connection_string"> 
     User Id=xx; 
     Password=xx; 
     Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS= 
     (PROTOCOL=TCP)(HOST=192.168.100.xx)(PORT=1521))) 
     (CONNECT_DATA=(SERVICE_NAME=XE))); 
    </property> 
    <property name="show_sql">false</property> 
    <property name="dialect">NHibernate.Dialect.Oracle10gDialect</property> 
    <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property> 
    <property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property> 
    <property name="cache.use_query_cache">false</property> 
    <property name="cache.use_second_level_cache">false</property> 
    <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> 
    </session-factory> 
</hibernate-configuration> 

任何想法类,以提高启动时间?

+0

1)难道是服用一段时间才能连接到数据库? 2)模式更新是否需要一段时间才能完成,如果数据库锁定,数据库运行缓慢或连接时间过长,是否需要更新? –

+0

@ChrisChilvers问题在这里:SessionFactory = Configuration.BuildSessionFactory();.即使是序列化,在我的机器上花费了很多时间,但有时(我如何描述这个问题)。然后连接速度很快,一切正常。 –

回答

1

序列化只会加速构建配置(config = new Configuration().Add... vs config = bf.Deserialize(file))而不是构建sessionfactory,它会执行很多其他工作,如生成代理,连接到数据库等等。这很可能是连接到服务器的缓慢连接,或者是导致延迟的慢速服务器。

而且这将是更好地使用using,以防止泄漏的文件句柄时异常occure

using (var file = File.Open(ConfigFile, FileMode.Open)) 
{ 
    var bf = new BinaryFormatter(); 
    return bf.Deserialize(file) as Configuration; 
} 
+0

非常感谢你 –