0

マルチスレッド アプリケーションを使用してデータベースからデータを抽出していますが、数分間実行すると、この例外または SQL タイムアウト例外が発生し始めます。私のコードは以下の通りです:

    public static List<FlightInfo> FlightInfoAllPricesPerDayForRoute(string From, string To)
    { // Create the object array from the datareader
        List<FlightInfo> arr = new List<FlightInfo>();
        using (var conn = new SqlConnection(sConnectionString))
        {
            using (var command = new SqlCommand("FlightInfoAllPricesPerDayForRoute", conn)
            {
                CommandType = CommandType.StoredProcedure
            })
            {
                conn.Open(); command.CommandTimeout = 150;
                command.Parameters.AddWithValue("AirportFrom", From);
                command.Parameters.AddWithValue("AirportTo", To);
                // command.Parameters.AddWithValue("Date",  dt);


                //execute the stored procedure
                using (IDataReader dr = command.ExecuteReader())
                {


                    FlightInfo obj;

                    while (dr.Read())
                    {
                        obj = new FlightInfo();
                        obj.flightInfoID = (int)dr["FlightInfoID"];
                        obj.airportFrom = (string)dr["AirportFrom"];
                        obj.airportTo = (string)dr["AirportTo"];
                        obj.timeDeparture = DateTime.Parse(dr["TimeDeparture"].ToString());
                        obj.timeArrival = (DateTime)dr["TimeArrival"];
                        obj.price = (short)Int16.Parse(dr["Price"].ToString());
                        obj.dateAdded = (DateTime)dr["DateAdded"];
                        obj.carrier = (string)dr["Carrier"];

                        arr.Add(obj);
                    }

                    dr.Close(); dr.Dispose(); conn.Close(); conn.Dispose(); command.Dispose();


                }
            }
        } return arr;
    }

タイムアウトの問題を改善するために接続文字列に以下を追加しましたが、まだエラーが発生しています:

   Min Pool Size=200;Max Pool Size=32767;Asynchronous Processing=true;   Connect Timeout=150;

ストアド プロシージャは非常に単純なので、問題はないと思います。

select *,  DATEADD(dd, 0, DATEDIFF(dd, 0, TimeDeparture)) as FlightDate
from FlightInfo  
where AirportFrom = @AirportFrom and AirportTo = @AirportTo
AND TimeDeparture > GETDATE() -- Only get future flights
Order by FlightDate ASC, Price asc

SQL接続を確認するためにこれを実行しようとしましたが、「ユーザーにはこのアクションを実行する権限がありません.」というメッセージが表示されます. エラー

  SELECT * FROM sys.dm_exec_connections

任意の提案をいただければ幸いです!

4

2 に答える 2

1

あなたのコードは問題ないようです - データベース サーバーで問題を確認することをお勧めします。ストアド プロシージャの実行に時間がかかるか、テーブルで多くのロックが発生する場合、これらの問題が発生する可能性があります (特に頻繁に呼び出される場合)。いくつかのクエリの最適化が適切である可能性があります。

fyi - SqlCommand オブジェクトの周りに「using」ブロックは必要ありません。また、リーダーと接続オブジェクトで「close」と「dispose」を呼び出す必要はありません。「using」がそれを処理します。

于 2013-04-08T23:48:29.017 に答える
0

特定のパラメータを使用して SP を実行すると問題が発生しました。これは、データベースに挿入されるコードに問題があり、特定の状況で多くの重複エントリが追加されたことを意味します。多くの重複したデータベースエントリを持つパラメーターを使用してデータベースからデータを抽出しようとしたとき、SP の実行が非常に遅くなりました。これらの重複を削除すると、問題が改善されました。

于 2013-04-09T01:58:03.020 に答える