我们使用Pomelo.EntityFrameworkCore.MySql(它在后台使用MySqlConnector),使用EntityFramework中典型的DbContext方法建立MySQL连接。
services.AddDbContext<MyDbContext>(opt =>
opt.UseMySql(_mysqlConnectionString, _mysqlVersion, b =>
{
b.UseNewtonsoftJson();
})
);
然后,我们在需要数据库连接的 * 某些 * 控制器上使用依赖注入。例如:
public class ClientController : Controller
{
private readonly MyDbContext _context;
public ClientController(MyDbContext context)
{
_context = context;
}
}
这工作正常。然而,我们有一些控制器不需要任何MySQL连接,因为它们不与数据库交互。一个例子是获取服务器时间。我们将其 Package 在自己的控制器中,没有依赖注入:
[Produces("application/json")]
[Route("client")]
public class SimpleClientController : Controller
{
[HttpPost("GetTime")]
public IActionResult GetTime([FromBody] GetTimeRequest request)
{
var response = new GetTimeResponse()
{
Time = DateTime.UtcNow
};
return Json(response);
}
}
然而,似乎也为这些类型的请求创建了一个MySQL连接,这让我很惊讶。我以为通过使用依赖注入,我们只会在控制器需要时创建一个DbContext。在线阅读表明,事实上,可以为 * 每个 * 请求创建一个DbContext,而不管使用的是什么控制器。然而,我很难找到明确的答案,所以我希望堆栈溢出可以在这里提供帮助。例如,文档没有明确说明是否只创建了一个DbContext(没有建立连接),等等。我很好奇,Pomelo的MySQL框架是否会改变这里的默认行为,也许他们会在DbContext创建时创建一个连接?
我的问题:
1.是否由于每个请求创建DbContext而创建MySQL连接(无论请求是否使用注入DbContext的控制器)?
1.有没有一个简单的方法来解决这个问题?我想只为需要一个的请求创建一个MySQL连接。我目前正在探索在DbContext上使用DbContextFactory-这似乎可以做到这一点,但需要大量的代码更改。
1.与此相关的任何其他评论都将是有帮助的。
1条答案
按热度按时间pw136qt21#
1.* 例如,文档没有明确说明是否仅创建DbContext(不建立连接)*
实际的数据库连接是池化的,请参阅docs中的引用:
请注意,上下文池与数据库连接池正交,后者在数据库驱动程序中的较低级别进行管理。
这个github issue:
除非你禁用了池(通过在连接字符串中设置Pooling=false),打开和关闭连接的开销可以忽略不计,并且没有任何理由避免它。当连接关闭时,它会返回到池中,当连接打开时,它会从池中取出。这是默认/推荐的工作方式,Npgsql(和其他ADO .NET驱动程序)有一个高性能的池(即将到来的4.0版本在这方面提高了更多的性能)。
因此,您不应该太关心连接对象的创建
1.* 我目前正在探索在DbContext上使用DbContextFactory *
正如DBcontext pooling文档所述(也与前一点相关):
DbContext通常是灯光对象:创建和处理一个数据库不涉及数据库操作,并且大多数应用程序可以这样做,而不会对性能产生任何明显的影响。
请注意,您可以 Package 工厂用法,以便最终用户代码不会更改(类似于文档中的示例):