ASP.NET SQL Server ConsumePreLoginHandshake内存不足异常
我有一个网站最近开始抛出以下错误:ASP.NET SQL Server ConsumePreLoginHandshake内存不足异常,asp.net,sql-server-2005,Asp.net,Sql Server 2005,我有一个网站最近开始抛出以下错误: A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: SSL Provider, error: 0 - Not enough memory is available to complete this request) Source: .Net SqlClie
A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: SSL Provider, error: 0 - Not enough memory is available to complete this request)
Source: .Net SqlClient Data Provider
Method: Void OnError(System.Data.SqlClient.SqlException, Boolean)
Stack Trace: at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParser.ConsumePreLoginHandshake(Boolean encrypt, Boolean trustServerCert, Boolean& marsCapable)
at System.Data.SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternalConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity, SqlConnection owningObject)
at System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, Boolean ignoreSniOpenTimeout, Int64 timerExpire, SqlConnection owningObject)
at System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(String host, String newPassword, Boolean redirectedUserInstance, SqlConnection owningObject, SqlConnectionString connectionOptions, Int64 timerStart)
at System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(SqlConnection owningObject, SqlConnectionString connectionOptions, String newPassword, Boolean redirectedUserInstance)
at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, Object providerInfo, String newPassword, SqlConnection owningObject, Boolean redirectedUserInstance)
at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection)
at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options)
at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
at System.Data.SqlClient.SqlConnection.Open()
at rbm.Portal.DAL.SiteManagerDB.GetTopLinks()
GetTopLinks()定义为:
public static List<Link> GetTopLinks()
{
List<Link> lLinks = new List<Link>();
try
{
using(DbCommand dbCommand = GenericDataAccess.CreateCommand())
{
dbCommand.CommandText = "RBM_V1_GetTopLinks";
dbCommand.Connection.Open();
using(DbDataReader dbReader = dbCommand.ExecuteReader())
{
if(dbReader.HasRows)
{
int intId = dbReader.GetOrdinal("id");
int intText = dbReader.GetOrdinal("text");
int intLink = dbReader.GetOrdinal("link");
while(dbReader.Read())
{
lLinks.Add(FillTopLinkDataRecord(dbReader, intId, intText, intLink));
}
}
dbReader.Close();
}
dbCommand.Connection.Close();
}
}
catch(Exception ex)
{
lLinks = null;
SiteManager.Instance.LogError(ex);
}
return lLinks;
}
private static Link FillTopLinkDataRecord(IDataRecord drLink, int intId, int intText, int intLink)
{
Link lLink = new Link();
if(!drLink.IsDBNull(intId))
{
lLink.Id = drLink.GetInt32(intId);
}
if(!drLink.IsDBNull(intText))
{
lLink.Text = drLink.GetString(intText);
}
if(!drLink.IsDBNull(intLink))
{
lLink.Url = drLink.GetString(intLink);
}
return lLink;
}
public static DbCommand CreateCommand()
{
DbConnection dbConnection = CreateConnection();
DbCommand dbCommand = dbConnection.CreateCommand();
dbCommand.CommandType = CommandType.StoredProcedure;
return dbCommand;
}
public static DbConnection CreateConnection()
{
DbProviderFactory dbFactory = DbProviderFactories.GetFactory(RbmConfiguration.DbProvideName);
DbConnection dbConnection = dbFactory.CreateConnection();
dbConnection.ConnectionString = RbmConfiguration.DbConnectionString;
return dbConnection;
}
CreateCommand()定义为:
public static List<Link> GetTopLinks()
{
List<Link> lLinks = new List<Link>();
try
{
using(DbCommand dbCommand = GenericDataAccess.CreateCommand())
{
dbCommand.CommandText = "RBM_V1_GetTopLinks";
dbCommand.Connection.Open();
using(DbDataReader dbReader = dbCommand.ExecuteReader())
{
if(dbReader.HasRows)
{
int intId = dbReader.GetOrdinal("id");
int intText = dbReader.GetOrdinal("text");
int intLink = dbReader.GetOrdinal("link");
while(dbReader.Read())
{
lLinks.Add(FillTopLinkDataRecord(dbReader, intId, intText, intLink));
}
}
dbReader.Close();
}
dbCommand.Connection.Close();
}
}
catch(Exception ex)
{
lLinks = null;
SiteManager.Instance.LogError(ex);
}
return lLinks;
}
private static Link FillTopLinkDataRecord(IDataRecord drLink, int intId, int intText, int intLink)
{
Link lLink = new Link();
if(!drLink.IsDBNull(intId))
{
lLink.Id = drLink.GetInt32(intId);
}
if(!drLink.IsDBNull(intText))
{
lLink.Text = drLink.GetString(intText);
}
if(!drLink.IsDBNull(intLink))
{
lLink.Url = drLink.GetString(intLink);
}
return lLink;
}
public static DbCommand CreateCommand()
{
DbConnection dbConnection = CreateConnection();
DbCommand dbCommand = dbConnection.CreateCommand();
dbCommand.CommandType = CommandType.StoredProcedure;
return dbCommand;
}
public static DbConnection CreateConnection()
{
DbProviderFactory dbFactory = DbProviderFactories.GetFactory(RbmConfiguration.DbProvideName);
DbConnection dbConnection = dbFactory.CreateConnection();
dbConnection.ConnectionString = RbmConfiguration.DbConnectionString;
return dbConnection;
}
从以下代码调用GetToLink:
try
{
if(HttpContext.Current.Cache["TopLinks"] == null)
{
HttpContext.Current.Cache.Insert("TopLinks", SiteDB.GetTopLinks() ?? new List<Link>(), null, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration);
}
return ((List<Link>)HttpContext.Current.Cache["TopLinks"]);
}
catch(Exception ex)
{
SiteManager.Instance.LogError(ex);
return null;
}
试试看
{
if(HttpContext.Current.Cache[“TopLinks”]==null)
{
HttpContext.Current.Cache.Insert(“TopLinks”,SiteDB.GetTopLinks()??new List(),null,Cache.noabsoluteexpntiation,Cache.NoSlidingExpiration);
}
返回((列表)HttpContext.Current.Cache[“TopLinks”]);
}
捕获(例外情况除外)
{
SiteManager.Instance.LogError(ex);
返回null;
}
这段代码没有什么变化,它从SQL server读取数据并为站点构建菜单
我对问题所在感到困惑,从这个错误中,我假设SQL框就是问题所在,但是IIS框上的IISRESET似乎可以在大约24小时内解决问题。SQL盒是W2K8R2(64位),有8个内核(2.99GHz)、8GB RAM和大量可用空间(250+GB)。IIS盒是W2K8R2(64位),有8个内核(2.66GHz)、4GB RAM和大量可用空间(16GB)
以前有人见过这个问题吗?SQL或IIS有问题吗?任何帮助都将不胜感激。我看到了一些问题 首先,我看不出你在哪里处理你的关系。这可能是这里的主要问题,以及为什么IISRESET会暂时解决这个问题 连接最终会被回收,但如果您的负载足够高(并且不必太高,这样就不会中断),那么池的内存就会用完 第二,我知道很多开发人员喜欢抽象CreateCommand和CreateConnection,但我从未见过它以一种长期有效的方式实现。我要做的第一件事就是删除这些方法,因为它们只是一行代码
仅供参考上周我修复了一个使用几乎完全相同代码布局的站点。有30人在使用该网站时,出现了各种各样的错误。一旦我摆脱了所有的通用命令和连接实例化,并用using语句正确地包围了数据调用,错误就消失了,现在可以轻松地支持100倍于这个数字 克里斯,谢谢你的及时回复。您说过您看不到连接被关闭,但是该命令被包装在using中,并使用dbCommand.Connection.Close()显式关闭。这还不够吗?鉴于此应用程序中没有太多DB代码,我将按照建议重新编写CreateCommand和CreateConnection方法。很高兴知道一般的东西也会引起问题。@markpirvine:我打错了。连接也必须被处理。@markpirvine:正如您所知,任何实现IDisposable的东西都应该被包装在Using子句中,或者尝试一下。最后,它正确地处理了对象。常规垃圾收集无法处理这些资源,因为类是非托管代码的包装器。Chris,谢谢。我假设using子句会自动调用Dispose?此后,我添加了一个显式的Dispose调用,并删除了GenericDataAccess类。到目前为止,重新分解还没有破坏测试站点中的任何内容。@markpirvine:using子句调用dispose。但是你在连接本身上没有一个。dbCommand.Connection.Close();行只是告诉连接关闭,然后您就处理了该命令。这使连接对象悬而未决。这就是为什么我主张去掉genericdataaccess类。它有效地隐藏了连接创建事件,以至于您没有一个干净的方法来处理它。