在EntityFramework中避免每次请求的MySQL连接

niwlg2el  于 2023-04-10  发布在  Mysql
关注(0)|答案(1)|浏览(144)

我们使用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.与此相关的任何其他评论都将是有帮助的。

pw136qt2

pw136qt21#

1.* 例如,文档没有明确说明是否仅创建DbContext(不建立连接)*
实际的数据库连接是池化的,请参阅docs中的引用:
请注意,上下文池与数据库连接池正交,后者在数据库驱动程序中的较低级别进行管理
这个github issue
除非你禁用了池(通过在连接字符串中设置Pooling=false),打开和关闭连接的开销可以忽略不计,并且没有任何理由避免它。当连接关闭时,它会返回到池中,当连接打开时,它会从池中取出。这是默认/推荐的工作方式,Npgsql(和其他ADO .NET驱动程序)有一个高性能的池(即将到来的4.0版本在这方面提高了更多的性能)。
因此,您不应该太关心连接对象的创建
1.* 我目前正在探索在DbContext上使用DbContextFactory *
正如DBcontext pooling文档所述(也与前一点相关):
DbContext通常是灯光对象:创建和处理一个数据库不涉及数据库操作,并且大多数应用程序可以这样做,而不会对性能产生任何明显的影响。
请注意,您可以 Package 工厂用法,以便最终用户代码不会更改(类似于文档中的示例):

serviceCollection.AddPooledDbContextFactory<YourContext>(...);
serviceCollection.AddScoped(sp => 
    sp.GetRequiredService<IDbContextFactory<WhatsNewContext>>().CreateDbContext());

相关问题