加快NHibernate的启动速度的小技巧
今天在《NHibernate 3.0 Cookbook》中学习到一个稍微加快NHibernate速度的小技巧,特地与园友们分享。
废话不多说直接上代码。请看:
public class ConfigurationBuilder { private const string SERIALIZED_CFG = "configuration.bin"; public Configuration Build() { return Build(null); } public Configuration Build(string cfgpath) { Configuration cfg = LoadConfigurationFromFile(); if (cfg == null) { if (!string.IsNullOrEmpty(cfgpath)) cfg = new Configuration().Configure(cfgpath); else cfg = new Configuration().Configure(); SaveConfigurationToFile(cfg); } return cfg; } private Configuration LoadConfigurationFromFile() { if (!IsConfigurationFileValid()) return null; try { using (var file = File.Open(SERIALIZED_CFG, FileMode.Open)) { var bf = new BinaryFormatter(); return bf.Deserialize(file) as Configuration; } } catch (Exception) { return null; } } private bool IsConfigurationFileValid() { if (!File.Exists(SERIALIZED_CFG)) return false; var configInfo = new FileInfo(SERIALIZED_CFG); var asm = Assembly.GetExecutingAssembly(); if (asm.Location == null) return false; var asmInfo = new FileInfo(asm.Location); if (asmInfo.LastWriteTime > configInfo.LastWriteTime) return false; return true; } private void SaveConfigurationToFile(Configuration cfg) { using (var file = File.Open(SERIALIZED_CFG, FileMode.Create)) { var bf = new BinaryFormatter(); bf.Serialize(file, cfg); } } }
代码很简洁,相信大家已经看出来——将Configuration序列化。
最后在程序的启动代码中加上:
private ISessionFactory GetSessionFactory() { //note:測試時須給出絕對地址,不然不能找到配置文件 var nhConfiguration = new ConfigurationBuilder().Build(@"E:\Projects\Practice\NHibernateTest\DAL\nhibernate.cfg.xml"); return nhConfiguration.BuildSessionFactory(); // return new Configuration().Configure(@"E:\Projects\Practice\NHibernateTest\DAL\nhibernate.cfg.xml").BuildSessionFactory(); }
让我们简单测试一下。当然在程序第一次启动时,可定是没有序列化后的二进制文件的,程序执行反而会慢,但之后就会快一点了。(所以我们忽略了第一次的测试结果)
[Test] public void LoadExsitingEntityTest() { Console.WriteLine("加載持久化實例"); ISession session = helper.GetSession(); Customer customer = session.Load<Customer>(12); Assert.IsNotNull(customer); Console.WriteLine("訪問實例的CustomerId屬性"); Console.WriteLine("這個實例的CustomerId屬性: {0}", customer.CustomerId); Assert.AreEqual(customer.CustomerId, 12); Console.WriteLine("訪問FirstName屬性"); Console.WriteLine("該實例FirstName屬性: {0}", customer.FirstName); }
测试也很简单,Load一下^_^
当使用上面注释的方法时,耗费时间为:2.7秒
而使用优化过的方法的耗费时间为:2.23秒
当然,我是测试了好几次的,只不过没有传图,仅根据这个用例来说,大概会快0.5S。
也许,这点时间对您来说微不足道,但是如果用例多了,积累下来也是不小的开销。
欢迎拍砖!
物有所不足,智有所不明。