【问题标题】:Open/Close database in ASP.NET Core for every SQL command在 ASP.NET Core 中为每个 SQL 命令打开/关闭数据库
【发布时间】:2016-11-03 23:38:57
【问题描述】:

我编写了简单的 ASP.NET Core 应用程序,其中 Controller 注入 MyService(配置为 Scoped),然后又注入 MyDbContext。

在我的控制器方法中,我有 2 个数据库查询,我的调试输出如下所示:

 Executing action method...
 Opening connection to database 'shell' on server 'tcp://127.0.0.1:5432'.
 ...
 Closing connection to database 'shell' on server 'tcp://127.0.0.1:5432'.
 Opening connection to database 'shell' on server 'tcp://127.0.0.1:5432'.
 ...
 Closing connection to database 'shell' on server 'tcp://127.0.0.1:5432'.
 Request finished in...

问题是:为每个请求打开一个新连接是否正确,甚至更多 - 为每个 sql 命令打开一个新连接?它不能建立一次与数据库的连接并重用它。性能不是更好吗?

PS:我将 PostgreSQL 与 npgsql 提供程序一起使用

【问题讨论】:

  • 您每次想要做某事时都实例化一个新的数据库上下文,并确保它被最小化到该操作的范围内。连接池被抽象出来并由其他地方的 EF 管理

标签: c# postgresql asp.net-core entity-framework-core npgsql


【解决方案1】:

就像其他人提到的那样。连接池是您的朋友。

打开和关闭都很好。

https://stackoverflow.com/a/4439434/3799142

【讨论】:

  • 如何在 ef-core 中开启连接池?
  • @Rem。如果您已经使用 'using' 语句,它将为您处理所有内容,您不必担心任何事情! :)
  • 我认为“使用”涉及处理连接。池化就是重用它们
  • @Rem msdn.microsoft.com/en-us/library/8xx3tyca(v=vs.110).aspx 看看那篇文章,特别是在“添加连接”下。您会发现以下语句:“连接在关闭或处置时释放回池中”。我个人使用“使用”语句,因为它更容易忘记 .Open 和 .Close
  • @Rem 这取决于提供者。默认情况下,npgsql 具有池化功能。 npgsql.org/doc/connection-string-parameters.html。检查参数“pooling” :) 如果您想关闭它。您可以在连接字符串中设置它。
【解决方案2】:

如前所述,始终打开和关闭连接all over SOConnection pooling 处理您的性能问题。

使您的代码更易于阅读,您永远不必担心,我必须打开的连接在哪里,它是否打开?不是在别的地方关门了吗?

正如你所问的,我假设你并不想这样做。这是我通常做的。一个小的包装器方法,可以触发与此类似的 sql 命令。

static bool FireCommand(SqlCommand command)
{
    command.Connection.Open();
    command.ExecuteQuery();
    command.Connection.Close();
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-04
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    • 2016-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多