5

我在代码中有一个非常奇怪的问题,我不希望它会失败。这是一个基于 AspDotNetStoreFront 的网站,有一些流量,但不是很大。尝试从阅读器读取数据库字段时,站点间歇性崩溃。这发生在网站上的各个地方。此类代码的示例如下所示,对象 pValue = rs["PropertyValueString"];

private Dictionary<string, object> GetPropertValuePairs(string userName)
    {
        string query = string.Format("select PropertyName, PropertyValueString from dbo.profile with(nolock) where CustomerGUID = {0} and StoreID = {1}", DB.SQuote(userName),AppLogic.StoreID());

        Dictionary<string, object> propertyValues = new Dictionary<string, object>();

        using (SqlConnection conn = new SqlConnection(DB.GetDBConn()))
        {
            conn.Open();

            using (IDataReader rs = DB.GetRS(query, conn))
            {
                while (rs.Read())
                {
                    string pName = DB.RSField(rs, "PropertyName");
                    object pValue = rs["PropertyValueString"];

                    if (propertyValues.ContainsKey(pName) == false)
                    {
                        propertyValues.Add(pName, pValue);
                    }
                }

                rs.Close();
                rs.Dispose();
            }
            conn.Close();
            conn.Dispose();
        }

        return propertyValues;
    }

这是 SqlClient 的标准用法,我看不出有什么问题。错误的堆栈跟踪是这样的:

System.Data.ProviderBase.FieldNameLookup.GetOrdinal(String fieldName) 在 System.Data.SqlClient.SqlDataReader.GetOrdinal(String name) 在 System.Data.SqlClient.SqlDataReader.get_Item(String name) 在 AspDotNetStorefront.ASPDNSFProfileProvider 的 System.IndexOutOfRangeException。 GetPropertValuePairs(String userName) 在 AspDotNetStorefront.ASPDNSFProfileProvider.GetPropertyValues(SettingsContext context, SettingsPropertyCollection settingsProperties) 在 System.Configuration.SettingsBase.GetPropertiesFromProvider(SettingsProvider provider) 在 System.Configuration.SettingsBase.GetPropertyValueByName(String propertyName) 在 System.Configuration.SettingsBase.get_Item (String propertyName) 在 System.Web.Profile.ProfileBase.GetInternal(String propertyName) 在 System.Web.Profile.ProfileBase.get_Item(String propertyName) 在 System。Web.Profile.ProfileBase.GetPropertyValue(String propertyName) at AspDotNetStorefront.SkinBase.OnPreInit(EventArgs e) at System.Web.UI.Page.PerformPreInit() at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

当站点崩溃时,它需要重新启动 IIS 才能重新启动。它在带有 .NET 3.5 和 SQL 2008 的 Windows Server 2008 上,都是最新的。该机器是 64 位的,SQL Server 启用了 32 位模式以及使用“经典管道模式”的应用程序池。连接字符串是

 <add name="PrimaryConnectionString" connectionString="data source=XXXX;database=XXXX;Integrated Security=True;Application Name=XXXX;MultipleActiveResultSets=true" />

非常感谢任何帮助!

4

2 回答 2

3

因此,经过大量搜索,我遇到了您的帖子,并遇到了我遇到的确切问题。我把这个帖子展示给我工作的朋友,他们承认这是我们的情况。然后我意识到这里没有足够的信息来解决我的问题。所以我拿了这里所说的一些内容并进行了更多搜索。

我遇到了这个帖子:Index Out Of Range Exception。这是一篇好文章,不仅适用于 NHibernate。

我添加Pooling=false;了我的连接字符串,web.config然后开始了一系列测试来加载服务器。我们测试了当前最大访问者负载的 200%,以尝试使用此错误终止服务器。以前,我们会在 100% 以下崩溃。没有一个错误。我将测试另一个选项 Enlist=false。我以前没听说过这个。

另请注意,我们已经运行 AspDotNetStoreFront 好几年了。所以我回去找出为什么我们最新的网站版本有所有这些错误,而旧网站没有这些错误。事实证明,我们之前已经添加pooling=false;了巨大的成功。

于 2012-09-05T21:38:56.207 回答
3

我猜您正在线程之间共享数据读取器的实例。确保 DB.GetRS 在所有情况下都返回数据读取器的新实例,而不是返回共享实例。

于 2011-01-19T16:43:09.223 回答