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

我没有在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(); } } } 

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

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

或者我应该只是有一个function,每次咳嗽数据库连接new’d up?

是的,这样做。 让ADO.NET连接池为您处理细节。 您的目标应该是尽可能缩短连接时间。

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

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

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

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

请参阅我的using答案: https : //stackoverflow.com/a/9811911/290343

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

两个,实际上。

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

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