首页 新闻 会员 周边

类中静态对象 静态构造函数的奇怪问题,mvc3 中使用nhibernate遇到的奇怪现象

0
悬赏园豆:50 [待解决问题]
  public static class NHibernateContextSessionFactory
 {
 private const string CurrentSessionKey = "nhibernate.current_session";
        private static ISessionFactory sessionFactory;//这个在程序运行中.不明白为什么会为空,他是静态的呀..
  
       //静态构造函数 这个构造函数 还会经常运行其中 sessionFactory就为NULL了
        static NHibernateContextSessionFactory()
        {
            if (sessionFactory == null)
            {
                Stopwatch sw = new Stopwatch();
                sw.Start();
                sessionFactory = new ConfigurationBuilder().Build().BuildSessionFactory();
                sw.Stop();
                Debug.WriteLine("获取session工厂耗时:" + sw.ElapsedMilliseconds + " 毫秒");
            }
        }
  
        public static ISession GetSession()
        {
            ISession currentSession = CallContext.GetData(CurrentSessionKey) as ISession;
            if (currentSession == null)
            {
                currentSession = sessionFactory.OpenSession();
                CallContext.SetData(CurrentSessionKey, currentSession);
            }
  
            return currentSession;
        }
}

问题: 我发现 网站有时候访问特别快,但有时候就特别慢。
研究下来 发现时由于  sessionFactory = new ConfigurationBuilder().Build().BuildSessionFactory();
特别耗时间,每次BuildSessionFactory() 都会耗时1秒,而 这不是最重要的,最重要的是 他还会经常执行,奇怪的问题就在这里了 sessionFactory是个静态的对象啊,按道理讲 他只会运行一次,怎么会重复运行呢?

网站的架构是 UI->BLL->DAL层的 某个仓储(**Repository)->仓储中 调用的上述类中的GetSession()。
求大神指教,我自己也做了一个别的小测试,在那个测试中是没有问题的,静态构造函数 只会运行一次,但这个会重复运行。。。

求解决,一点思路都没有,不知道问题出在哪里了。。

易水寒2012的主页 易水寒2012 | 初学一级 | 园豆:161
提问于:2013-03-05 10:03
< >
分享
所有回答(3)
0

静态构造函数 多次执行,何以证明

Qlin | 园豆:2403 (老鸟四级) | 2013-03-05 12:56
0
NHibernateContextSessionFactory在自动的执行么?
加一个断点 看一下调用堆栈,是否有其他地方在调用?
qdzhaokun | 园豆:107 (初学一级) | 2013-03-05 14:36
0

这个确实是重复运行,具体原因不明白,单例模式等各种都使用了。

我在Application_End方法内 记录了一条运行 日志:系统停止。

后来查日志发现,系统经常停止,也就是说经常运行Application_End 方法,原因可能是网站配置的问题,但由于上面着急,没时间去研究问题根源,转用其它方法了,现在还在寻求结果中...

求大侠帮助。。

易水寒2012 | 园豆:161 (初学一级) | 2013-03-21 10:21
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册