2011-01-19 5 views
3

私はこれまでに失敗するとは思っていない非常に奇妙な問題があります。 AspDotNetStoreFrontに基づいて、それほど巨大ではないトラフィックがあるウェブサイトです。リーダーからデータベースフィールドを読み取ろうとすると、サイトが断続的にクラッシュします。これはウェブサイトのさまざまな場所で発生します。このようなコードの例は、の行にあります。オブジェクトpValue = rs ["PropertyValueString"];IDataReaderからフィールドを読み取っている間に断続的なSystem.IndexOutOfRangeExceptionが発生する

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でSystem.Data.SqlClient.SqlDataReader.GetOrdinalでSystem.Data.ProviderBase.FieldNameLookup.GetOrdinal(文字列フィールド名) (文字列名) で

System.IndexOutOfRangeException:エラーのスタックトレースはこれです。システムでSystem.Configuration.SettingsBase.GetPropertiesFromProviderでAspDotNetStorefront.ASPDNSFProfileProvider.GetPropertyValues(SettingsContext文脈、SettingsPropertyCollection settingsProperties)でAspDotNetStorefront.ASPDNSFProfileProvider.GetPropertValuePairs(文字列のuserName) でSqlClient.SqlDataReader.get_Item(文字列名) (SettingsProviderプロバイダ) .Configuration.SettingsBase.GetPropertyValueByName(String propertyName) System.Web.ProfileでSystem.Web.Profile.ProfileBase.GetInternalでSystem.Configuration.SettingsBase.get_Item(文字列プロパティ名) System.Web.Profile.ProfileBase.get_Itemで(文字列プロパティ名) (文字列プロパティ名) ました。 ProfileBase.GetPropertyValue System.Web.UI.Page.ProcessRequestMain(ブールincludeStagesBeforeAsyncPoint、ブールのincludeStagesAfterAsyncPoint)でSystem.Web.UI.Page.PerformPreInitでAspDotNetStorefront.SkinBase.OnPreInitで(文字列propertyNameの) (EventArgsの電子) ()

サイトがクラッシュした場合、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ビットマシンとの互換性問題があります。解決策が見つかると更新されます。 –

+0

同じ問題が発生していますが、解決策を見つけましたか? @ジョニーgは、ビットの不一致問題でしたか? David、これはマルチスレッドアプリですか? –

+0

マーク私は、以下の答えがあると思います。これは私たちにとって過去の問題でした。私のソリューションが役立つかどうか、あなたの考えを教えてください。 – CaptainBli

答えて

1

私はあなたがスレッド間のデータエリアのインスタンスを共有していると思います。すべてのケースでDB.GetRSがdatareaderの新しいインスタンスを返すことを確認し、共有インスタンスを返さないようにします。

+0

これはDB.GetRSのコードです。using(SqlCommand cmd = new SqlCommand(Sql、dbconn)) { return cmd.ExecuteReader();それには何も問題はありません。お返事ありがとうございます } – David

+1

私は同じ@Davidと思われます、あなたのアプリはマルチスレッドですか? –

+0

マルチスレッドアプリケーションに関するコメントは私にいくつかの考えをさせました。データは、プールされた再利用スレッドを横切っています。そこで私はもう少し調べに行きました。 – CaptainBli

2

多くの検索の後で、私は正確な問題をあなたの投稿に出くわします。私は職場でここに友達に投稿していることを示しています。彼らは私たちの事例であることを認めています。それから、私の問題を解決するのに十分な情報がここにないことに気付きます。だから私はここで言われたことのいくつかを取って、もう少し調べた。

私はこの投稿に遭遇しました:Index Out Of Range Exception。 NHibernateだけでなく、良い投稿です。

Pooling=false;を接続文字列のweb.configに追加してから、サーバーをロードする一連のテストを開始しました。現在の最大訪問ユーザー負荷の200%をテストし、このエラーでサーバーを強制終了しようとしました。以前は、100%未満でクラッシュしました。 1つのエラーはありませんでした。 Enlist = falseだった他のオプションをテストします。私は以前これについて聞いていない。

もう1つの注意点として、AspDotNetStoreFrontは数年間実行されています。だから私はなぜ私たちの最新のウェブサイトのリリースは、これらのエラーのすべてを持っていたし、古いサイトがエラーを持っていなかったかを調べるに戻りました。我々は以前に大きな成功にpooling=false;を追加したことが分かります。

+0

あなたはまだ同じ問題を抱えているのですか、それとも解決しましたか?私はそのような問題の解決策が何であるか知るために死ぬだろう。今私はPooling = falseを追加する。あなたがこのコメントを書いた最後の時間の後にあなたがエラーを取得しましたか? – amal50

+1

私たちはもはや問題を抱えていませんでした。私たちはかなりの間この方法で走っています。 – CaptainBli

+0

Thx、私はすでにpooling = falseを追加しました。私の接続文字列には、それは私がもうこの問題に直面していなかった、その後の偉大な解決策でしたstackoverflowせずにどのような人生! – amal50

関連する問題