1

セットアップ

SQL Server 2008 データベースからデータを取得する Web アプリ経由でアクセスされる .net mvc 4 Web API サービス レイヤーがあります。

問題

Web サービスに対して同時に 5 つを超える GET 要求が行われると、a500 Interal Server Errorが Web アプリに返されます。.net エラーをよく見ると、次のように表示されます。

エラーが発生しました。
接続は閉じられませんでした。接続の現在の状態はオープンです

例外がスローされている C# サービス コード:

public class ImageLinkRepository : IImageLinkRepository
{
  private SqlConnection cnnSQL = new SqlConnection(...);

  public IEnumerable<ImageLink> Get(String userId)
        {

            ImageLinks = new List<ImageLink>();

            // open connection to DB
            cnnSQL.Open();

            try
            {
                SqlCommand cmmSQL = new SqlCommand("nVision_select_lcimagelinks_sp", cnnSQL);
                cmmSQL.CommandType = System.Data.CommandType.StoredProcedure;

                SqlParameter prmSQL = cmmSQL.Parameters.Add(new SqlParameter
                {
                    ParameterName = "@LCIMGLINKUSERID",
                    Value = userId
                });

                SqlDataReader rdrSQL = cmmSQL.ExecuteReader();

                if (rdrSQL.HasRows)
                {
                    while (rdrSQL.Read())
                    {
                        ImageLinks.Add(new ImageLink 
                        { 
                            // set new ImageLink object's properties    
                            imageTopicId = DBReader.SQLString(rdrSQL, "LCIMGLINKIMGTOPICID"), 
                            id = DBReader.SQLInt(rdrSQL, "LCIMGLINKPK"),
                            recordId = DBReader.SQLString(rdrSQL, "LCIMGLINKRECORDID"),
                            text = DBReader.SQLString(rdrSQL, "LCIMGLINKTEXT"),
                            topicId = DBReader.SQLString(rdrSQL, "LCIMGLINKTOPICID"),
                            topicItem = DBReader.SQLString(rdrSQL, "LCIMGLINKTOPICITEM"),
                            url = DBReader.SQLString(rdrSQL, "LCIMGLINKURL"),
                            user = DBReader.SQLString(rdrSQL, "LCIMGLINKUSERID")
                        });
                    }
                }    
            }

            // close connection to DB
            cnnSQL.Close();

            return ImageLinks;
        }
}

接続が開いている場合は手動で接続を閉じようとしましたが、接続が閉じている場合のみ接続を開こうとしましたが、どちらも機能しません。

私は何か間違ったことをしているに違いありません。確かに、サービスは同時リクエストを処理できるはずです。私は何が欠けていますか?

4

1 に答える 1

2

SQL 接続プールを使い果たしている可能性があります。まずSqlCommand、 、SqlConnection、およびSqlReaderswithusing()ステートメントをラップして、それらが正しく破棄されて閉じられるようにする必要があります。

フィールドとして構築されているというSqlConnectionことは、コントローラーがそれを破棄する責任を負う必要があることを意味します。メソッド内で構築する方が簡単で、 a でラップすることもできますusing()(それ以外の場合は、クラスで を実装し、 Connection を順番にIDisposable()呼び出す必要があります)。.Dispose()

try
{
  using (var cnnSQL = new SqlConnection(...))
  {
    using (var cmmSQL = new SqlCommand("nVision_select_lcimagelinks_sp", cnnSQL))
    {
      cmmSQL.CommandType = System.Data.CommandType.StoredProcedure;

      SqlParameter prmSQL = cmmSQL.Parameters.Add(new SqlParameter
      {
          ParameterName = "@LCIMGLINKUSERID",
          Value = userId
      });

      using (var rdrSQL = cmmSQL.ExecuteReader())
      {
      ...
      }
    }
  {
} ...
于 2013-08-30T15:35:49.687 に答える