我没有在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();
}
}
}
然而,这似乎会导致线程问题,因为静态初始化程序每个服务器进程运行一次,而不是每个请求运行一次。
框架是否提供了一种处理此方法的内置方法,或者我是否应该只使用一个函数来扼杀每次新建的数据库连接?
答案 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获取。没有性能损失。实际上这是最好和最正确的方式。
答案 2 :(得分:1)
框架是否提供了处理此问题的内置方法 我应该只有一个咳嗽数据库连接的功能 每次都新玩?
两者,实际上。
Web服务器是多线程的,因此每个线程都需要自己的数据库连接。只需在需要时创建一个。
汇集与数据库的实际连接。处置连接对象时,实际连接未关闭,而是返回到池中。如果使用相同的连接字符串创建新的连接对象,它将只重用池中的连接。