今天在《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。
也許,這點時間對您來說微不足道,但是如果用例多了,積累下來也是不小的開銷。
歡迎拍磚!