2013-03-18 77 views
5

这里有些问题在StackOverflow的有关NHibernate和多个数据库(动态连接),解决我认为,最好的解决办法是保持的SessionFactory的缓存(每个数据库)和缓存配置,以更快地构建SessionFactory。缓存的SessionFactory和配置与NHibernate多个数据库

我想知道,如果这种做法是正确的,和主要表现在:什么是每实例和时间内存消耗方面的SessionFactory的“权重”要建?

更多关于我的方法:

众所周知,1号和2级高速缓存住在SessionFactory的“境界”,我们可以假设内存消耗可能(涉及的ISession的开启量,其中包括第一级缓存级别)。

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

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

连接池: 又是怎么回事连接池?它应该有什么样的行为来管理数百或数千个数据库池,就像这种方法一样?一些与NHibernate一起使用的实现可能会有所帮助,或者我需要构建自己的?

+1

我们使用的NHibernate的multinenant设置与约20-30会话工厂,我不记得确切的数字,但内存消耗是越来越对每个租户增加明显较高。您可以使用自定义的'IConnectionProvider'实现穷人的多租户支持,但在这种情况下您将无法使用二级缓存。多租户功能由原始Hibernate(每个多个数据库连接一个会话工厂)支持,并且存在NHibernate的pull请求,在github上实现此功能的一部分 - https://github.com/nhibernate/nhibernate-core/pull/91。 – Vasea 2013-03-25 15:45:55

回答

2

一些测试证实了一些人说,要构建配置和SessionFactory的展台价格昂贵的时间和资源(CPU和内存),但SessionFactory则是更多的,贵了不少。但不幸的是,我们只有单独的测试和经验结果,比如我的测试依赖于我的课堂模型。因此,我一直认为我需要缓存SessionFactory和Configuration,但是如果我们在Web解决方案中有数百个数据库,那么我们有一个很大的问题,因为SessionFactory渴望内存,它是一个“内存占用者”,我可以得到接近400个实例的OutOfMemoryException,我希望能够访问数千个数据库。

嗯,因为我们使用的SQLServer,我们设计了一个高速缓存只有一个SessionFactory的每个SQLServer的实例,而不是一个对每个数据库,所以在ConnectionProvider等我们可以注入SQL命令USE 'catalog-name'这准备每一个连接才能正常工作每个请求分别提供数据库。

我希望其他人同样的问题还可以探讨这样的,从SQLServer的资源,尽管有些数据库只允许你这样做,通过架构名称,而不是数据库(目录名)。

好运。

+0

这样简单的提供一个到ISession.OpenSession的IDbConnection是这样的:'var conn = myApp.GetOpenConnection(); var session = sessions.OpenSession(conn);'? – 2018-01-19 10:18:26

+0

没有。上下文(例如缓存)不在连接的范围内,您可以沿“上下文”(会话)更改连接。另一个数据库(连接),但是缓存的数据/会话呢? – Luciano 2018-01-19 10:30:55