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

加快NHibernate的启动速度的小技巧

而使用优化过的方法的耗费时间为:2.23秒

加快NHibernate的启动速度的小技巧

当然,我是测试了好几次的,只不过没有传图,仅根据这个用例来说,大概会快0.5S

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

欢迎拍砖!

你可能感兴趣的:(Hibernate)