2015-02-11 94 views
0

我有一個非常簡單的實體:流利NHibernate的很慢的查詢執行(DB託管在本地主機)

public class Days 
{ 
    public virtual int ID { get; set; } 
    public virtual string Name { get; set; } 
} 

地圖類

public class DaysMap : ClassMap<Days> 
{ 
    public DaysMap() 
    { 
     Table("Days"); 
     Id(x => x.ID).GeneratedBy.Identity().Column("ID"); 
     Map(x => x.Name).Column("Name"); 
    } 
} 

和這裏的測試,我想加載DayID = 1。我可以加載該項目,但需要的時間= 2,5s!這是存儲在本地主機上的MySQL數據庫。

private static ISessionFactory CreateSessionFactory() 
    { 
     return Fluently.Configure() 
         .Database(MySQLConfiguration.Standard 
         .ConnectionString("server=localhost;user id=someID;password=pass;database=someDB")) 
         .Mappings(m => m.FluentMappings.AddFromAssembly(Assembly.GetExecutingAssembly())) 
         .BuildSessionFactory(); 
    } 

    public ActionResult Index() 
    { 
     Stopwatch sw = new Stopwatch(); 
     sw.Start(); 

     using (var sessionFactory = CreateSessionFactory()) 
     { 
      using (var session = sessionFactory.OpenSession()) 
      { 
       using (session.BeginTransaction()) 
       { 
        var asd = session.Query<Days>().Where(x => x.ID == 1).FirstOrDefault(); 
       } 
      }     
     } 

     sw.Stop(); 

     var timeElapsed = sw.Elapsed.TotalMilliseconds; // returns 2504.3316 !! 

     return View(); 
    } 

回答

1

希望你不是在做每一次執行以下操作:

private static ISessionFactory CreateSessionFactory() 
{ 
    return Fluently.Configure() 
        .Database(MySQLConfiguration.Standard 
        .ConnectionString("server=localhost;user id=someID;password=pass;database=someDB")) 
        .Mappings(m => m.FluentMappings.AddFromAssembly(Assembly.GetExecutingAssembly())) 
        .BuildSessionFactory(); 
} 

創建了一個SessionFactory只應每個應用程序1次。確定查詢需要多長時間時,您不能包含此時間。通常我會在應用程序啓動時進行構建,以消除初始查詢需要花費的時間,因爲我還沒有構建它。在使用NHibernate時這是很常見的做法。