Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ASP.NET SQL Server ConsumePreLoginHandshake内存不足异常_Asp.net_Sql Server 2005 - Fatal编程技术网

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类。它有效地隐藏了连接创建事件,以至于您没有一个干净的方法来处理它。