如何在ASP.NET MVC应用程序中维护数据库连接?

时间:2012-03-21 19:56:14

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

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

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();
        }
    }
}

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

框架是否提供了一种处理此方法的内置方法,或者我是否应该只使用一个函数来扼杀每次新建的数据库连接?

3 个答案:

答案 0 :(得分:12)

  

或者我应该只使用一个能够每次都咳出数据库连接的函数吗?

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

  

连接池减少了新连接的次数   必须打开。平民保持对物质的所有权   连接。它通过保持一组活动来管理连接   每个给定连接配置的连接。每当一个用户   调用在连接上打开,pooler查找可用的   池中的连接。如果池连接可用,则为   将其返回给调用者而不是打开新连接。当。。。的时候   应用程序调用关闭连接,pooler将其返回   合并的一组活动连接而不是关闭它。一旦   连接返回到池中,它已准备好在池上重用   下一次公开电话。

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

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

答案 1 :(得分:4)

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

查看我对usinghttps://stackoverflow.com/a/9811911/290343

的回答

答案 2 :(得分:1)

  

框架是否提供了处理此问题的内置方法   我应该只有一个咳嗽数据库连接的功能   每次都新玩?

两者,实际上。

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

汇集与数据库的实际连接。处置连接对象时,实际连接未关闭,而是返回到池中。如果使用相同的连接字符串创建新的连接对象,它将只重用池中的连接。