6

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

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

更多关于我的方法:

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

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

我对吗 ?使用这种方法可能会遇到什么样的性能和内存问题?考虑一个 Web 应用程序(ASP.NET MVC,而不是 Webforms)访问数百个(或者可能是数千个)数据库,在每个 HTTP 请求上它需要找到用户数据库并解决对它的访问(获取、使用和处置 ISession)。

连接池:那么连接池呢?在这种方法中管理成百上千个数据库的池应该有什么样的行为?与 NHibernate 一起使用的一些当前实现可能会有所帮助,或者我需要构建自己的?

4

1 回答 1

2

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

所以,我一直认为我需要缓存 SessionFactory 和 Configuration,但是如果我们在 Web 解决方案中有数百个数据库,我们就会遇到一个大问题,因为 SessionFactory 需要内存,它是“内存吞噬者”,我可能会在附近遇到 OutOfMemoryException 400 个实例,我预计会达到数千个数据库。

好吧,当我们使用 SQLServer 时,我们设计了一个缓存,每个 SQLServer 实例只有一个 SessionFactory,而不是每个数据库一个,所以在 ConnectionProvider 中,我们可以注入一个 sql 命令USE 'catalog-name',准备每个连接以使其各自的数据库正常工作要求。

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

祝你好运。

于 2013-03-22T20:18:11.750 回答