2011-01-19 48 views
3

我在代碼中有一個非常奇怪的問題,我不會指望它會失敗。它基於AspDotNetStoreFront是一個擁有一定流量但不是那麼龐大的網站。嘗試從閱讀器讀取數據庫字段時,網站會間歇性地崩潰。這發生在網站上的各個地方。這種代碼的一個例子如下:object pValue = rs [「PropertyValueString」];Intermittent System.IndexOutOfRangeException當從IDataReader中讀取一個字段時

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(字符串字段名)

System.IndexOutOfRangeException在System.Data.SqlClient.SqlDataReader.GetOrdinal(字符串名稱) 在System.Data。 SqlClient.SqlDataReader.get_Item(字符串名稱) 在AspDotNetStorefront.ASPDNSFProfileProvider.GetPropertValuePairs(用戶名字符串) 在AspDotNetStorefront.ASPDNSFProfileProvider.GetPropertyValues(SettingsContext背景下,SettingsPropertyCollection settingsProperties) 在System.Configuration.SettingsBase.GetPropertiesFromProvider(SettingsProvider提供商) 在系統.Configuration.SettingsBase.GetPropertyValueByName(String propertyName) 在System.Web.Profile的System.Web.Profile.ProfileBase.get_Item(String propertyName) 上的System.Web.Profile.ProfileBase.GetInternal(String propertyName) 處的System.Configuration.SettingsBase.get_Item(String propertyName) 。 ProfileBase.GetPropertyValue(字符串propertyName的) 在AspDotNetStorefront.SkinBase.OnPreInit(EventArgs的) 在System.Web.UI.Page.PerformPreInit() 在System.Web.UI.Page.ProcessRequestMain(布爾includeStagesBeforeAsyncPoint,布爾includeStagesAfterAsyncPoint)

當站點崩潰時,需要重新啓動IIS才能重新啓動它。它在Windows Server 2008上,.NET 3.5和SQL 2008都是最新的。該機器爲64位,SQL Server啓用了32位模式,以及使用「經典流水線模式」的應用程序池。連接字符串是

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

任何幫助非常非常感謝!

+0

在這裏看到相同的東西。我們相信*運行32位模式ASP.NET2.0 SP2的64位機器存在某種兼容性問題。如果我們找到解決方案將會更新 – 2011-03-14 20:31:11

+0

我看到同樣的問題,你有沒有找到解決方案? @johnny g,這個問題有點不一致嗎?大衛,這是一個多線程的應用程序? – 2012-06-25 01:35:22

+0

馬克我想,我在下面有你的答案。過去這對我們來說是一個問題。讓我知道你的想法以及我的解決方案是否有用。 – CaptainBli 2012-09-05 21:42:09

回答

1

我想你是在線程之間共享數據讀取器的實例。確保DB.GetRS在所有情況下都返回一個數據讀取器的新實例,並且不返回共享實例。

2

因此,經過多次搜索,我碰到你的帖子,我有確切的問題。我在工作中向我的朋友們展示了這個帖子,他們承認這是我們的情況。然後我意識到這裏沒有足夠的信息來解決我的問題。所以我採取了一些這裏所說的和搜索一些。

我碰到此貼子:Index Out Of Range Exception。這不僅僅是NHibernate的一個好帖子。

我在我的web.config中將Pooling=false;添加到我的連接字符串中,然後開始一系列測試以加載服務器。我們測試了我們當前最大訪問者負載的200%,試圖用此錯誤殺死服務器。以前,我們會在100%以下崩潰。沒有一個錯誤。我將測試Enlist = false的另一個選項。我以前沒有聽說過這個。

還有一點需要注意的是,我們幾年來一直在運行AspDotNetStoreFront。所以我回去找出爲什麼我們的最新網站發佈了所有這些錯誤,而舊網站沒有錯誤。事實證明,我們之前添加了pooling=false;以取得巨大成功。

相關問題