gpt4 book ai didi

asp.net-mvc - 具有持久 HTTP 连接的 IDbConnection 生命周期管理

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

我在管理使用范围为 HttpContext 的 StructureMap 的打开数据库连接的生命周期时遇到问题当我的 ASP.NET MVC 应用程序(如 SignalR 集线器)中有持久的 HTTP 连接时。

我的 DI 容器 StructureMap 注入(inject)了一个开放的 IDbConnection成几个服务。为确保这些数据库连接已关闭并正确处理,我调用 ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects()EndRequest事件。

这对 MVC Controller 非常有用,直到需要数据库连接的服务被注入(inject)到 SignalR 集线器中,它为每个客户端保持持久的 HTTP 连接打开并最终使连接池饱和。

如果我范围 IDbConnection对于单例,每个应用程序只打开一个连接,并且池不会饱和,但这是 a bad idea以防连接被锁定或超时。

那么也许有一种方法可以为我的 SignalR 集线器自定义数据库连接的范围?我尝试在每个 Hub 方法中解析一个服务实例,但这仍然会在 HttpContext 范围内实例化一个数据库连接,并在调用客户端的集线器连接期间保持打开状态。

当周围有持久的 HTTP 连接时,我应该如何在 HTTP 范围的上下文中使用 StructureMap 管理数据库连接的生命周期?

示例代码

典型服务

public class MyService
{
private IDbConnection _con;
public MyService(IDbConnection con)
{
_con = con;
}

public IEnumerable<string> GetStuff()
{
return _con.Select<string>("SELECT someString FROM SomeTable").ToList();
}
}

典型的 SignalR 集线器
public class MyHub : Hub
{
private MyService _service;
public MyHub(MyService service)
{
_service = service; // Oh Noes! This will open a database connection
// for each Client because of HttpContext scope
}

public Task AddMessage()
{
var result = _service.GetStuff();
// ...
}
}

结构图配置
For<IDbConnection>()
.HybridHttpOrThreadLocalScoped()
.Use(() => BaseController.GetOpenConnection(MyConnectionString));

全局.asax.cs
public class GlobalApplication : System.Web.HttpApplication
{
public GlobalApplication()
{
EndRequest += delegate
{
ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects();
};
}
// ...
}

最佳答案

在 SignalR 1.0.0 Alpha 中,Hub的工具 IDisposable .信号机 HubHttpContext 不同,实例是短暂的。 , 所以如果你关闭你的 IDbConnectionHubDispose方法,您不应该不必要地使您的连接池饱和。

关于asp.net-mvc - 具有持久 HTTP 连接的 IDbConnection 生命周期管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13288855/

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