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

也许,这点时间对您来说微不足道,但是如果用例多了,积累下来也是不小的开销。

欢迎拍砖!

posted @ 2012-11-15 14:07  Lyon Gu  阅读(1893)  评论(6编辑  收藏  举报