我在一个新的桌面项目上使用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>
任何想法类,以提高启动时间?
1)难道是服用一段时间才能连接到数据库? 2)模式更新是否需要一段时间才能完成,如果数据库锁定,数据库运行缓慢或连接时间过长,是否需要更新? –
@ChrisChilvers问题在这里:SessionFactory = Configuration.BuildSessionFactory();.即使是序列化,在我的机器上花费了很多时间,但有时(我如何描述这个问题)。然后连接速度很快,一切正常。 –