C# 这样做会导致连接池问题吗
如果我像下面的代码一样将dbContext作为全局变量打开,那么与在每个函数中使用新的datacontext并将其包装到using块中相比,它会导致连接池问题吗C# 这样做会导致连接池问题吗,c#,.net,linq,connection-pooling,C#,.net,Linq,Connection Pooling,如果我像下面的代码一样将dbContext作为全局变量打开,那么与在每个函数中使用新的datacontext并将其包装到using块中相比,它会导致连接池问题吗 using System; using System.Collections.Generic; using System.Linq; using System.Web; using LoopinDeals.Helper; namespace LoopinDeals.Model { public class DealUsersR
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using LoopinDeals.Helper;
namespace LoopinDeals.Model
{
public class DealUsersRepository
{
private DataClassesDataContext DbContext = new DataClassesDataContext();
public void AddUser(string Email, string Password)
{
DealUser deal = new DealUser()
{
Email = Email,
Password = Password,
EmailVerified = true,
LastLogin = DateTime.Now,
AccountCreated = DateTime.Now,
IsActive = true,
RegistrationMethod = RegistrationType.Normal.ToString(),
Subscribe = "true"
};
DbContext.DealUsers.InsertOnSubmit(deal);
DbContext.SubmitChanges();
}
public void AddSignUpUser(string Email, string City)
{
try
{
DealUser UserData = new DealUser()
{
Email = Email,
City = City,
IsActive = false,
LastLogin = DateTime.Now
};
DbContext.DealUsers.InsertOnSubmit(UserData);
}
catch (Exception ex)
{
}
}
public void UpdateSignUpUser(string Email, string FirstName, string LastName, string Password, string Mobile, string City)
{
try
{
DealUser UserData = DbContext.DealUsers.Single(UD => UD.Email == Email);
UserData.FirstName = FirstName;
UserData.LastName = LastName;
UserData.Password = Password;
UserData.Mobile = Mobile;
UserData.City = City;
UserData.IsActive = true;
UserData.LastLogin = DateTime.Now;
DbContext.SubmitChanges();
}
catch (Exception ex)
{
}
}
}
}
说明
请注意,我没有写这段代码,它是外包的。它崩溃了,出现了下面的错误消息,我正试图找出解决方法
“/”应用程序中出现服务器错误。超时已过期。超时时间
从池中获取连接之前已过。这可能有
发生的原因是所有池连接都在使用中,并且池大小最大
联系到了。描述:测试期间发生未处理的异常
当前web请求的执行。请查看堆栈跟踪
有关错误以及错误来源的详细信息,请参阅
代码
异常详细信息:System.InvalidOperationException:超时已过期。
从服务器获取连接之前经过的超时时间
水塘这可能是因为所有池连接都处于
已达到使用和最大池大小
源错误:
[无相关来源行]
源文件:c:\Windows\Microsoft.NET\Framework64\v2.0.50727\Temporary
ASP.NET文件\root\f44daa26\cce00cbd\App\u Web\u b21g2v5x.5.cs行:0
堆栈跟踪:
[InvalidOperationException:超时已过期。超时时间
在从池中获取连接之前已过。这可能已发生
发生的原因是所有池连接都在使用中,并且池大小最大
已联系到。]System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection 拥有连接)+6264689
System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection 外部连接,DbConnectionFactory连接工厂)+6265031
System.Data.SqlClient.SqlConnection.Open()+258
System.Data.Linq.SqlClient.SqlConnectionManager.UseConnection(IConnectionUser user)+65 System.Data.Linq.SqlClient.SqlProvider.get_IsSqlCe()+33 System.Data.Linq.SqlClient.SqlProvider.InitializeProviderMode()+32
System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(表达式 查询)+63
System.Data.Linq.DataQuery`1.System.Collections.Generic.IEnumerable.GetEnumerator() +45 loopindels.Model.SiteDetails..ctor()+253 loopindels.Admin.Default..ctor()+76
中的ASP.admin\U default\U aspx..ctor() c:\Windows\Microsoft.NET\Framework64\v2.0.50727\Temporary ASP.NET Files\root\f44daa26\cce00cbd\App\u Web\u b21g2v5x.5.cs:0
__ASP.FastObjectFactory\u app\u web\u b21g2v5x.Create\u ASP\u admin\u default\u aspx() 在c:\Windows\Microsoft.NET\Framework64\v2.0.50727\Temporary ASP.NET中 Files\root\f44daa26\cce00cbd\App\u Web\u b21g2v5x.22.cs:0
System.Web.Compilation.BuildManager.CreateInstanceFromVirtualPath(VirtualPath virtualPath,类型requiredBaseType,HttpContext上下文,布尔值 allowCrossApp,布尔noAssert)+138
System.Web.UI.PageHandlerFactory.GetHandlerHelper(HttpContext上下文, 字符串请求类型,VirtualPath VirtualPath,字符串物理路径)+50 System.Web.MaterializeHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +425 System.Web.HttpApplication.ExecuteStep(IExecutionStep步骤,布尔值&同步完成)+263 我在这里添加了SiteDetailsConstructor,这是否可能导致连接池问题
public class SiteDetails
{
public DataClassesDataContext DbContext = new DataClassesDataContext();
public SiteDetails()
{
var Details = from dtl in DbContext.SiteSettings
select dtl;
foreach (var item in Details)
{
MetaIndexKeyword = item.MetaIndexKeyword;
MetaIndexDesc = item.MetaIndexDesc;
MetaIndexTitle = item.MetaIndexTitle;
MetaGetPrefrenceKeyword = item.MetaGetPrefrenceKeyword;
MetaGetPrefrenceDesc = item.MetaGetPrefrenceDesc;
Logo = item.Logo;
Favicon = item.Favicon;
NoImage = item.NoImage;
SiteName = item.SiteName;
SiteTitle = item.SiteTitle;
SiteUrl = item.SiteUrl;
FbAndTwitterShareMessage = item.FbAndTwitterShareMessage;
CharacterSet = item.CharacterSet;
SiteMaintanance = item.SiteMaintanance;
PasswordChar = item.PasswordChar;
HtmlMetaKeyword = item.HtmlMetaKeyword;
HtmlMetaDescription = item.HtmlMetaDescription;
MetaDataGoogleSiteMap = item.MetaDataGoogleSiteMap;
WebMasterEmail = item.WebMasterEmail;
SupportEmail = item.SupportEmail;
NoReplyName = item.NoReplyName;
NoReplyEmail = item.NoReplyEmail;
DeleteExpireDeals = item.DeleteExpireDeals;
DealsPerPageBeforeLogin = item.DealsPerPageBeforeLogin;
DealsPerPageAfterLogin = item.DealsPerPageAfterLogin;
RecentViewDeals = item.RecentViewDeals;
BoughtDeals = item.BoughtDeals;
FbFanPage = item.FacebookFanPage;
FbApplicationId = item.FbApplicationId;
FbSecret = item.FbSecret;
FbApiSharingDeals = item.FbApiSharingDeals;
GoogleApiKey = item.GoogleApiKey;
TwitterScreenName = item.TwitterScreenName;
TwitterConsumerKey = item.TwitterConsumerKey;
TwitterConsumerSecret = item.TwitterConsumerSecret;
SharingAppId = item.SharingAppId;
SharingAppSecret = item.SharingAppSecret;
SharingCanvasURL = item.SharingCanvasURL;
InviteMessage = item.InviteMessage;
SharingMsgLink = item.SharingMsgLink;
ShareMsgPicture = item.ShareMsgPicture;
ShareMsgName = item.ShareMsgName;
ShareMsgCaption = item.ShareMsgCaption;
ShareMsgDesc = item.ShareMsgDesc;
}
}
public static string MetaIndexKeyword { get; set; }
public static string MetaIndexDesc { get; set; }
public static string MetaIndexTitle { get; set; }
public static string MetaGetPrefrenceKeyword { get; set; }
public static string MetaGetPrefrenceDesc { get; set; }
public static string Logo { get; set; }
public static string Favicon { get; set; }
public static string NoImage { get; set; }
public static string SiteName { get; set; }
public static string SiteTitle { get; set; }
public static string SiteUrl { get; set; }
public static string FbAndTwitterShareMessage { get; set; }
public static string CharacterSet { get; set; }
public static string SiteMaintanance { get; set; }
public static string PasswordChar { get; set; }
public static string HtmlMetaKeyword { get; set; }
public static string HtmlMetaDescription { get; set; }
public static string MetaDataGoogleSiteMap { get; set; }
public static string WebMasterEmail { get; set; }
public static string SupportEmail { get; set; }
public static string NoReplyName { get; set; }
public static string NoReplyEmail { get; set; }
public static bool? DeleteExpireDeals { get; set; }
public static int? DealsPerPageBeforeLogin { get; set; }
public static int? DealsPerPageAfterLogin { get; set; }
public static int? RecentViewDeals { get; set; }
public static int? BoughtDeals { get; set; }
public static string FbFanPage { get; set; }
public static string FbApplicationId { get; set; }
public static string FbSecret { get; set; }
public static string FbApiSharingDeals { get; set; }
public static string GoogleApiKey { get; set; }
public static string TwitterScreenName { get; set; }
public static string TwitterConsumerKey { get; set; }
public static string TwitterConsumerSecret { get; set; }
public static string SharingAppId { get; set; }
public static string SharingAppSecret { get; set; }
public static string SharingCanvasURL { get; set; }
public static string InviteMessage { get; set; }
public static string SharingMsgLink { get; set; }
public static string ShareMsgPicture { get; set; }
public static string ShareMsgName { get; set; }
public static string ShareMsgCaption { get; set; }
public static string ShareMsgDesc { get; set; }
}
}
这不会导致连接池问题,因为只有在调用
SubmitChanges
时,才会打开、使用和关闭数据库连接
由于DBContext不是线程安全的,所以如果存储库实例被多个线程使用,则会导致问题
另一个问题是在DBContext实例中缓存EF完成的数据-如果不处理DBContext实例,缓存的数据将累积,并且在一段时间后会变得非常大,导致内存压力
出于这两个原因(并且重新创建上下文没有太大开销),总的来说,更好的做法是将DBContext的使用保持在using块中。全局管理上下文不会导致连接池问题。但是,上下文包含访问了所有数据的数据库集,因此上下文将一直增长,直到内存耗尽(假设您的数据库大于可用内存) 但创建上下文的成本很低,为什么要在全球范围内管理它 --对新信息的回应
我认为您显示的代码片段根本不是问题的根源。相反,从代码跟踪来看,问题似乎发生在SiteDetails的构造函数中。这个构造函数是否加载了大量数据?如果是操作系统,您可能会因为太多线程试图加载太多数据而导致数据库崩溃。我添加了以下描述。我添加了SiteDetails构造函数,请您仔细看看。您可能正在该构造函数中加载大量数据。如果直接对数据库运行查询,需要多长时间才能完成?它加载了很多行吗?而且,也许最重要的是,在任何给定时间点创建了多少SiteDetails对象。我想知道是否创建了足够多的SiteDetails对象,这些对象正在使用所有可用的连接,从而导致您的问题。只有一小行,我不确定它是否会导致问题。每次都需要标题文本。您是否检查了数据库以查看打开了多少连接以及它们是否来自您的应用程序?