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

也許,這點時間對您來說微不足道,但是如果用例多了,積累下來也是不小的開銷。

歡迎拍磚!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM