【问题标题】:How should one maintain a database connection in an ASP.NET MVC application?应该如何在 ASP.NET MVC 应用程序中维护数据库连接?
【发布时间】:2014-11-01 17:03:33
【问题描述】:

我没有在 Web 应用程序中使用 LINQ-to-SQL 或实体框架位,并且目前一直在使用这样的东西(这是针对类项目):

using System.Data;
using System.Data.SqlClient;

namespace StackOverflowClone.Models
{
    public class Database
    {
        public static SqlConnection ActiveConnection { get; private set; }

        static Database()
        {
            ActiveConnection = new SqlConnection(
                "Data Source=********.database.windows.net;" +
                "Initial Catalog=EECS341;Uid=*****;Pwd=*******;" + 
                "MultipleActiveResultSets=True;");
            ActiveConnection.Open();
        }
    }
}

但这似乎会导致线程问题,因为静态初始化程序每个服务器进程运行一次,而不是每个请求一次。

框架是否提供了一种内置的方法来处理这个问题,还是我应该只提供一个函数来每次都创建新的数据库连接?

【问题讨论】:

  • @TomasVoracek:问题是一次可以服务多个用户,并且连接有时会混淆并导致查询失败,因为不同的线程仍在读取前一个查询的结果.

标签: c# asp.net-mvc-3


【解决方案1】:

或者我应该只使用一个函数来每次都生成新的数据库连接?

是的,这样做。让ADO.NET connection pooling为您处理细节。您的目标应该是在尽可能短的时间内保持连接打开。

连接池减少了新连接的次数 必须打开。池子保持物理的所有权 联系。它通过保持一组活动来管理连接 每个给定连接配置的连接。每当用户 在连接上调用 Open,池化程序会寻找可用的 池中的连接。如果一个池连接可用,它 将其返回给调用者,而不是打开新连接。当。。。的时候 应用程序在连接上调用 Close,pooler 将其返回给 池化的活动连接集,而不是关闭它。一旦 连接被返回到池中,它已准备好在 下一次公开通话。

因此,创建一个返回新打开连接的静态GetConnection() 方法。在using 语句中使用它,以便尽快将其关闭并返回到连接池。

using(var cn = Database.GetConnection())
{
    //query your data here, Dapper example below
    cn.Execute("update MyTable set MyField = @newValue", new {newValue});
}

【讨论】:

  • 连接池?那是什么?
  • @BillyONeal:这听起来像是一个连接池......也许谷歌知道更多。
  • @Henk:我知道。我的意思是在 ASP.NET MVC 的特定上下文中。是由 SQL Server 提供的吗?通过 ASP.NET?通过别的什么?
  • @BillyONeal 看到我的回答。这是一种 ADO.NET 机制。
  • @BillyONeal “它由 SQL 服务器本身提供。” - 不,这不对。连接池由 ADO.NET 处理,而不是 SQL Server。见msdn.microsoft.com/en-us/library/8xx3tyca.aspx
【解决方案2】:

始终使用using 创建新连接并销毁它们。它们并不是真正从头开始创建的,它们是从connection pool 获取的。没有性能损失。其实这是最好的和正确的方法。

查看我对using的回答:https://stackoverflow.com/a/9811911/290343

【讨论】:

  • :sigh: 运行简单查询的又一个层次。我们已经为 SqlCommand 提供了一个,一个用于事务,一个用于读取器,一个用于循环读取记录。我想如果这是我们必须做的事情,那就是我们必须做的事情,但每次都这样做似乎很痛苦。
  • @BillyONeal 取决于您用于访问数据库的 API。我建议您查看Dapper。非常简单。
  • @BillyONeal:您可以使用语句堆叠...如果我有多个,我会避免在下一行放置大括号。让它更干净。
  • 这就是要走的路...比自己处理Dispose更好。我们是程序员。多一层大括号就不用吓到我们了。
  • @BryanCrosby:仅当您在语句之间没有必须做的事情时。喜欢设置SqlCommand.CommandText.
【解决方案3】:

框架是否提供了内置的方法来处理这个或 我是否应该只拥有一个停止数据库连接的功能 每次都更新?

实际上两者兼而有之。

Web 服务器是多线程的,因此每个线程都需要自己的数据库连接。只需在需要时创建一个。

与数据库的实际连接是池化的。释放连接对象时,实际连接不会关闭,而是返回到池中。如果您使用相同的连接字符串创建一个新的连接对象,它只会重用池中的一个连接。

【讨论】:

    猜你喜欢
    • 2017-05-15
    • 1970-01-01
    • 2016-09-03
    • 2012-07-28
    • 1970-01-01
    • 2011-01-21
    • 2021-05-17
    • 2018-08-15
    • 1970-01-01
    相关资源
    最近更新 更多