使用NHibernate缓存多个数据库的SessionFactory和Configuration

时间:2013-03-18 22:29:52

标签: .net sql-server nhibernate multiple-databases

StackOverflow中有关NHibernate和多个数据库(动态连接)的一些问题,让我相信最好的解决方案是保持SessionFactory(每个数据库)的缓存和缓存到Configuration,以更快地构建SessionFactory。 / p>

我想知道这种方法是否正确,主要是:就每个实例的内存消耗和构建时间而言,SessionFactory的“权重”是什么?

关于我的方法的更多信息:

已知第一级和第二级缓存存在于SessionFactory“领域”中,我们可以假设内存消耗可能与打开的ISession数量有关(包括第一级缓存级别)。

对于第二级缓存级别,在我的情况下,数据库共享相同的模式并具有一些commom只读表,我可以使用全局缓存实现仅共享所有SessionFactories中的只读表,这对我的项目来说听起来不错。

我是对的吗?这种方法可以带来什么样的性能和内存问题?考虑一个Web应用程序(ASP.NET MVC,而不是Webforms)访问数百个(或几千个)数据库,在每个HTTP REQUEST上找到用户数据库并解决对它的访问(获取,使用和部署ISession)。

连接池: 连接池怎么样?管理数百或数千个数据库池应该采取什么样的行为?与NHibernate一起使用的一些当前实现可能有所帮助,或者我需要构建自己的实现?

1 个答案:

答案 0 :(得分:2)

一些测试证实了一些人所说的构建Configuration和SessionFactory的时间和资源(cpu和内存),展位价格昂贵,但SessionFactory更多,更昂贵。但不幸的是,我们只有个别测试,经验结果,就像我的测试一样,取决于我的班级模型。

所以,我一直认为我需要缓存SessionFactory和Configuration,但是如果我们在Web解决方案中有数百个数据库,那么我们就有一个很大的问题,因为SessionFactory渴望内存,它是一个“内存吃”,我可以得到一个OutOfMemoryException接近400个实例,我希望能够访问数千个数据库。

好吧,因为我们正在使用SQLServer,我们设计了一个缓存,每个SQLServer实例只有一个SessionFactory而不是每个数据库一个,所以在ConnectionProvider中我们可以注入一个sql命令USE 'catalog-name'来准备每个连接根据请求分别使用其数据库。

我希望有同样问题的其他人也可以从SQLServer中探索类似的资源,尽管有些数据库只允许你通过模式名称而不是数据库(目录名称)来实现。

祝你好运。