gpt4 book ai didi

NHibernate:创建一个ConnectionProvider来动态选择要连接的几个数据库中的哪个?

转载 作者:行者123 更新时间:2023-12-03 12:24:03 25 4
gpt4 key购买 nike

我有一个连接到许多SQL Server数据库的项目。它们都具有相同的架构,但是数据不同。数据本质上是由客户分隔的。当请求进入asp.net应用程序时,它可以告诉需要哪个数据库并建立 session 。

我们现在正在为每个客户数据库创建一个新的SessionFactory。这已经解决了一段时间了,但是随着更多的客户,我们正在创建更多的数据库。我们开始遇到内存问题,因为每个工厂都有自己的QueryPlanCache。 I wrote a post about my debugging of the memory

我要这样做,以便我们有一个SessionFactory,它使用ConnectionProvider打开到正确数据库的连接。到目前为止,我所拥有的看起来像这样:

public class DatabaseSpecificConnectionProvider : DriverConnectionProvider
{
public override IDbConnection GetConnection()
{
if (!ThreadConnectionString.HasValue)
return base.GetConnection();

var connection = Driver.CreateConnection();
try
{
connection.ConnectionString = ThreadConnectionString.Value;
connection.Open();
}
catch(DbException)
{
connection.Dispose();
throw;
}
return connection;
}
}

如果仅需要一个数据库来处理该请求,则此方法非常有用,因为我可以在初始化期间在线程局部变量中设置连接字符串。当我遇到需要访问多个数据库的管理员级别的操作时,就会遇到麻烦。

由于ConnectionProvider不知道哪个 session 正在打开连接,因此无法决定使用哪个 session 。我可以在打开 session 之前设置线程局部变量,但是由于延迟打开了 session 连接,因此出现了问题。

我还需要创建一个CacheProvider以避免缓存中的细菌。那将会遇到类似的问题。

有什么想法吗?还是对NHibernate的要求太高?

编辑:我找到了 this answer that suggests I'd have to rely on some global state,这是我想要避免的。如果我有多个事件 session ,我希望ConnectionProvider用与适当数据库的连接进行响应。

编辑2:我正在寻找一种解决方案,该解决方案将为始终用于每个站点的默认Session创建一个ConnectionProvider。然后,对于与其他数据库的连接,我将打开连接并将其传递。我看到的缺点是,我无法在辅助 session 上使用二级缓存,而不得不跟踪和关闭连接我。

最佳答案

我已经确定了解决方法,并在此处列出了它,以防有人再次遇到此问题。

事实证明,我仍然找不到根据 session 更改ConnectionProvider的数据库。它只能现实地取决于当前请求的上下文。

就我而言,95%的时间仅需要一个客户的数据库。我创建了一个SessionFactory和一个ConnectionProvider来处理这个问题。对于其余的极端情况,我创建了第二个SessionFactory,当打开Session时,我传入了一个新的Connection。

缺点是与第二个数据库对话的 session 不能使用第二级缓存,因此我必须确保在请求结束时关闭连接。

到目前为止,这似乎已经足够好了,但是我很好奇它从长远来看将如何站得住脚。

关于NHibernate:创建一个ConnectionProvider来动态选择要连接的几个数据库中的哪个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9101420/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com