【问题标题】:C# MVC5 classic ADO.NET when to open connectionC# MVC5 经典 ADO.NET 何时打开连接
【发布时间】:2016-08-26 07:58:36
【问题描述】:

我将 MVC5 与经典的 ADO.NET 对象(例如 sqldatareader 和 sqldataadapter 以及 sqlconnection 等)一起使用...... 我的控制器在初始化时创建了一个连接,因为我需要将请求对象发送到持有 sqlconnection 的类以获取与问题无关的内容,因此我的控制器有一个覆盖 void

protected override void Initialize(RequestContext requestContext)
    {
        base.Initialize(requestContext);
        db = new db(Request);
        db.Connect();
    }

其中 db 是我的类,方法 (connect) 将创建 sqlconnection 对象并打开一个连接...

为了关闭连接,我使用了控制器的 dispose 方法,如下所示

protected override void Dispose(bool disposing)
    {
        base.Dispose(disposing);
        if (db != null)
        {
            db.Close();
            db = null;
        }
    }

一切正常,然后有一次我收到一个奇怪的服务器错误(无法连接到数据库)请注意我的主机是 smarterasp.net

我可以使用我的家用计算机远程连接到数据库,我也可以连接到网络主机,所以问题出在我的网络主机和我的数据库主机之间,或者我的应用程序和我的数据库主机之间......

或者它可能与连接池有关,即使服务器错误没有给我任何细节或堆栈跟踪(母鸡错误不在我的应用程序线程中)......

我已经通过打开 smarterasp.net 控制面板的(远程 iis)选项卡并单击(修复 ACL)解决了这个问题,我不知道它做了什么,但它解决了我的问题....暂时:(不幸的是,此后问题再次出现多次

所以我的问题是简短的 在我初始化控制器时打开连接并在控制器处理时关闭它是一种好习惯吗???

你认为错误的原因是什么??

最后,如果问题不够清楚,我想道歉,因为英语不是我的第一语言(显然)......

非常感谢

【问题讨论】:

    标签: ado.net database-connection asp.net-mvc-5


    【解决方案1】:

    所以我的问题很简短,打开 在我初始化控制器并关闭它时连接 控制器配置???

    我认为这不是一个好方法。您不应打开/关闭数据库连接和/或从控制器访问数据库。控制器应尽可能“薄”。此外 - 连接应保持打开的时间尽可能短,并让ADO.NET connection pooling 为您处理详细信息。

    我还建议将您的连接包装在 using 块中,因为它会隐式调用 close 方法:

    using (SqlConnection connection = new SqlConnection(
               connectionString))
    {
        SqlCommand command = new SqlCommand(queryString, connection);
        command.Connection.Open();
        command.ExecuteNonQuery();
    }
    

    你没有说确切的错误是什么。乍一看,您甚至没有在尝试关闭连接之前检查连接是否打开。在尝试显式关闭它之前,您应该检查connection state,这应该发生在控制器之外。虽然我建议您将 SqlConnection 包装在 using 块中(如上所述)。

    编辑

    我读了你的评论。您正在尝试在控制器生命周期的上下文中管理连接,我怀疑这是您的问题。

    如果您使用的是实体框架(或者可能是另一个 ORM),一个具有“按请求生活方式”的 IoC - 那么 IoC 容器会在每个请求结束时正确处理您的上下文(连接),并提供一个新的每个新的实例。

    如果您想以这种方式管理数据库连接,也许您可​​以探索一下这个选项。

    【讨论】:

    • 错误文本是 (can't connect to db) 这就是我得到的所有信息... (db.close()) 是 db 类中的一个方法,它在关闭之前检查连接状态它....同样,当我使用关键字(使用)时,它会关闭连接并释放我知道的 sqlconnection 对象,但是作为控制器(释放)方法......控制器生命周期表示它将调用 dispose 方法完成服务器端方法后的请求....据我所知
    • @MohammedSuez 我稍微编辑了我的答案。我坚持我的回答/建议。
    • @WilliamXifarasb 非常感谢您的编辑对我有很大的帮助,尽管问题并没有消失,但我会考虑您的回答回答了这个主题......我知道我的情况是奇怪的独特,但我总是使用传统的方法,除了这次有一些奇怪的要求......
    • 当然希望你能完成它。我会尝试将连接的打开和关闭移出控制器,看看错误是否消失。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多