【问题标题】:What is the best way to close a MySQL connection in an ASP.NET application?在 ASP.NET 应用程序中关闭 MySQL 连接的最佳方法是什么?
【发布时间】:2020-04-13 02:12:49
【问题描述】:

我开发了一个简单的应用程序,允许用户在本地数据库中输入数据,但最终它会在生产环境中同时进行许多连接,其中包括存储在数据中心中的数据。

现在我的应用程序可以读取(从两个不同的表)和写入其中一个,但它至少有一个问题:我在用户结束提交数据后立即关闭连接一名员工,我实际上希望应用程序允许在一个会话中为他们中的许多人输入,所以流程是:

(1) 。用户进入应用程序 > (2) 。用户保存员工 > (3) 。这 应用程序通知用户输入的结果(可能是 多个字段的重复值会显示错误,a 成功保存员工消息等)[这里我关闭连接]>(4)。返回到 (2),如果用户选择这样做,我尝试再次打开它。


编辑: 关闭连接后立即尝试输入新用户时出现的错误是"connection must be valid and open"

我希望 Singleton 对象可以处理这个问题,但实际上并没有这样做。

    private MySQLDataAccess()
    {
        this.openConnection();
    }

    private MySqlConnection Connection;

    private static MySQLDataAccess instance;

    public static MySQLDataAccess GetInstance()
    {
        if(instance == null)
        {
            instance = new MySQLDataAccess();
        }
        return instance;
    }

所以,我的问题是……

应用程序是否应该在应用程序结束后立即关闭与数据库的连接?这可能包括一位用户一次性节省了 50 多名员工。

或者我应该在每次保存用户时关闭连接,然后再次打开它以保存新用户? (这是我现在正在尝试做的,但我做得不好)

【问题讨论】:

  • 如果您在 IIS 中部署它,它将使用连接池,因此您的应用程序不会直接打开和关闭连接。所以我只会使用using 语句来创建和处理你需要的 MySqlConnection 对象。实际的打开和关闭将由连接池处理。 (注意,“应用程序是否应在应用程序结束后立即关闭与数据库的连接”在 Web 环境中没有多大意义。每次触发 HTTP 请求时都会单独建立连接。)
  • “这种方法”是指我建议的方法吗?是的。 ADO.NET 有连接池并且 MySQL 连接器支持它。我建议您阅读以下内容:dev.mysql.com/doc/connector-net/en/…
  • @newbie “最佳”方式是所有教程和课程中显示的方式 - 只需在 using 块内创建连接,当执行离开块时,连接将被关闭并释放。 不要使用单例连接,这只会由于锁积累和与其他连接的阻塞而导致性能下降
  • @newbie 否。只要您想访问数据库,就创建 MySqlConnection 的新实例。通常这是在数据访问层 (DAL) 或类似 ORM 的实体框架中完成的。
  • @newbie “不应该只有单个对象的一个​​实例处理数据库连接”......不,不应该。这是不必要的。再次阅读连接池的工作原理。您的代码并不真正负责打开和关闭连接。当您在代码中“打开”一个连接时,它实际上只是从池中获取一个连接,该连接很可能已经打开。

标签: c# mysql asp.net-mvc


【解决方案1】:

最佳做法是不要为多个“工作单元”保持连接打开(甚至重复使用)。最有效的方法是使用using 块:

using(MySqlConnection conn = ...)
{
    using(MySqlCommand cmd = ...)
    {
        // open connection
        // execute command
        // close connection (optional - the connection will be closed when 
        //                   it gets disposed, but it's more explicit this way)
    }
}

即使出现异常,连接也会自动关闭。

此外,不要进行任何需要用户在块内输入的重试(例如“您输入了重复的值 - 重试”)。如果出现错误,请丢弃连接,获取新输入,然后创建新连接并重试。

【讨论】:

  • 我个人更喜欢尽可能通过连接工厂,以便我可以快速更换提供程序,但这是一个不错的开始。
  • “快速更换供应商”您认为这种情况多久会发生一次?
  • 经常。要了解作为分析器工作(或至少您做过),您需要做的一件事是将股票提供者换成具有仪器的股票提供者。我还用一个自定义的 Sql 提供程序替换了库存 Sql 提供程序,该提供程序在某些项目中透明地处理瞬态连接问题(非常适合迁移到 azure/cloud)。因此,它通常不是切换数据库,而是切换到比 Microsoft 默认提供的功能更多的提供程序。
【解决方案2】:

或者使用连接工厂,假设您的连接信息在您的 web.config 中:

var settings = ConfigurationManager.ConnectionStrings[connectionStringName];
var factory = DbProviderFactories.GetFactory(settings.ProviderName);
using (var conn = factory.CreateConnection())
using (var cmd = conn.CreateCommand())
{
  conn.ConnectionString = settings.ConnectionString;
  conn.Open();
  ...
  conn.Close();
}

不过,我通常只是在 DbConnection 上使用 Dapper,它为我消除了映射和打开/关闭的大部分痛苦。

【讨论】:

    猜你喜欢
    • 2010-09-14
    • 1970-01-01
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多