【问题标题】:ISessionFactory object thru Appdomain bondaries通过 Appdomain 绑定的 ISessionFactory 对象
【发布时间】:2013-04-11 14:05:36
【问题描述】:

(我对这个问题有点绝望,因为我没有找到任何指向我想要的文章)。

无论如何:

有没有办法在多个AppDomains 之间共享一个ISessionFactory (SessionFactoryImpl)?

-- 或者--

是否可以从这个ISessionFactory 生成ISessions 并将新创建的ISession 序列化为不同的Appdomain

-- 或者--

在基于 Winforms 的应用程序中,关于启动时间和内存消耗,您在 ISessionFactory / ISession 管理方面的成功案例是什么?

长篇大论 (适合喜欢细节的人)

  • 我的应用程序是基于 ERP Winforms 的,可以生成多个“子应用程序”(表单);
  • 每个子应用都有自己的程序集,可以独立更新;
  • 生成一个新的 AppDomain 可以很好地隔离每个“子应用程序”的static 成员。当应用程序完成时,子程序 AppDomain 资源也可以被卸载。我们这样做了一段时间,但由于 SessionFactory 成本很高(在时间上并且主要在内存中),这个模型开始变得站不住脚(现在,我们使用线程和ThreadStatic 成员来保存每个人的特定信息子应用);
  • 我们非常支持延迟加载,因此我们也不能放弃此功能。

我已经尝试过的:

  • 共享ISessionFactoryMarshalByRef 类:我无法让它工作(不记得为什么),但是序列化ISessionFactory 无论如何都会导致内存重复(大量)。我说的对吗?
  • MarshalByRef 产生 ISession 并将其序列化到另一个 AppDomain 的类:由于 ISession 在其父 ISessionFactory 上拥有它的属性,现在处于其他边界,它给我带来了一些很好的预期,告诉我一些属性未定义。

【问题讨论】:

    标签: winforms nhibernate appdomain sessionfactory


    【解决方案1】:

    我使用 Winforms 应用程序的成功案例是,我们在第一次运行应用程序时序列化配置,并在后续运行时加载序列化文件。这显着减少了应用程序启动时间。甚至可以使用序列化配置分发应用程序,以消除首次运行时的延迟。

    序列化看起来像这样:

        private const string SERIALIZED_CONFIG = "configuration.bin";
    
        private Configuration GetConfiguration()
    
            Configuration config = null;
            config = LoadConfigurationFromFile();
    
            if (config == null)
            {
                // Create a new configuration, code omitted
                config = fluentConfig.BuildConfiguration();            
                SaveConfigurationToFile(config);
            }
        }
    
        private Configuration LoadConfigurationFromFile()
        {
            try
            {
                if (!IsConfigurationFileValid())
                {
                    return null;
                }
    
                using (var file = File.Open(SERIALIZED_CONFIG, FileMode.Open))
                {
                    var bf = new BinaryFormatter();
                    return bf.Deserialize(file) as Configuration;
                }
            }
            catch (Exception ex)
            {
                return null;
            }
        }
    
        private bool IsConfigurationFileValid()
        {
            if (!File.Exists(SERIALIZED_CONFIG))
            {
                return false;
            }
    
            var configInfo = new FileInfo(SERIALIZED_CONFIG);
    
            // Assumes all assemblies are in same location and written at same time
            var asm = _assemblies.First();
            var asmInfo = new FileInfo(asm.Location);
    
            if (asmInfo.LastWriteTime > configInfo.LastWriteTime)
            {
                return false;
            }
            return true;
        }
    
        private void SaveConfigurationToFile(Configuration config)
        {
    
            using (var file = File.Open(SERIALIZED_CONFIG, FileMode.Create))
            {
                var bf = new BinaryFormatter();
                bf.Serialize(file, config);
            }
        }
    

    【讨论】:

    • 这只会减少创建 SessionFactory 的时间,但不会减少它的内存消耗。似乎内存是 OP 的最大问题。
    • +1 用于您的代码示例。谢谢你。我已经意识到这种可能性(NHiberante Cfg Serialization)——网上有一些例子。但是@cremor 是对的:它解决了部分加速时间,并且对内存消耗没有任何帮助。无论如何,感谢您的及时答复。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-20
    • 2012-06-03
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    相关资源
    最近更新 更多