NHibernate Медленный запуск иногда - PullRequest
0 голосов
/ 02 декабря 2011

Я использую NHibernate 3 в новом настольном проекте.Я читал о сериализации объекта конфигурации.Я сделал это, но иногда это не работало.Я начал думать, что это работает только тогда, когда я запускаю приложение (сериализую объект конфигурации), затем закрываю его и запускаю снова (несколько секунд спустя).Но если я подожду несколько минут, это не сработает.Я говорю о 45+ секундах.Другое странное дело, если это случится на нескольких машинах, а не на всех.Некоторые из них работают, как ожидалось, в первый раз медленно, но быстрее при запуске nexts.

Вот моя конфигурация:

класс, который создает конфигурацию и фабрику сеансов

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 configuration

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

Есть идеи по улучшению времени запуска?

1 Ответ

1 голос
/ 02 декабря 2011

Сериализация только ускоряет построение Конфигурации (config = new Configuration().Add... против config = bf.Deserialize(file)), а не сборку фабрики сеансов, которая выполняет множество других задач, таких как генерация прокси, подключение к базе данных и так далее. Скорее всего, это медленное соединение с сервером или медленный сервер, который отвечает за задержку.

Также было бы лучше использовать using, чтобы предотвратить утечку FileHandles при возникновении исключений

using (var file = File.Open(ConfigFile, FileMode.Open))
{
    var bf = new BinaryFormatter();
    return bf.Deserialize(file) as Configuration;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...