2012-02-14 62 views
7

私はこれが私のDBにconectionsを閉じていないからだと思う。私は私のDatalayerのために以下のコードを投稿しました。私は私の接続を閉じる必要がありますか?私はどうしたらいいの?これは問題を引き起こすコードですか?エラー最大プールサイズに達しましたか?

エラーコード:

タイムアウトに達しました。プールから接続を取得する前にタイムアウト期間が経過しています。これは、プールされたすべての接続が使用中で、プールの最大サイズに達したために発生した可能性があります。

説明現在のWeb要求の実行中に、未処理の例外が発生しました。エラーの詳細とコード内のどこで発生したのかについては、スタックトレースを参照してください。

例外の詳細:System.InvalidOperationException:タイムアウトが切れています。プールから接続を取得する前にタイムアウト期間が経過しています。これは、プールされたすべての接続が使用中で、プールの最大サイズに達したために発生した可能性があります。

public DataTable getPictures() 
    { 

     //get database connection string from config file 
     string strConectionString = ConfigurationManager.AppSettings["DataBaseConnection"]; 

     //set up sql 
     string StrSql = "SELECT MEMBERS.MemberName, Picture.PicLoc, Picture.PicID, Picture.PicRating FROM Picture INNER JOIN MEMBERS ON Picture.MemberID = MEMBERS.MemberID WHERE (Picture.PicID = @n) AND (Picture.PicAproval = 1) AND (Picture.PicArchive = 0)AND (MEMBERS.MemberSex = 'F')"; 

     DataTable dt = new DataTable(); 
     using (SqlDataAdapter daObj = new SqlDataAdapter(StrSql, strConectionString)) 
     { 
      daObj.SelectCommand.Parameters.Add("@n", SqlDbType.Int); 
      daObj.SelectCommand.Parameters["@n"].Value = GetItemFromArray(); 

      //fill data table 
      daObj.Fill(dt); 
     } 
     return dt; 
    } 

public int GetItemFromArray() 
    { 
     int myRandomPictureID; 
     int[] pictureIDs = new int[GetTotalNumberOfAprovedPictureIds()]; 


     Random r = new Random(); 
     int MYrandom = r.Next(0, pictureIDs.Length); 

     DLPicture GetPictureIds = new DLPicture(); 
     DataTable DAallAprovedPictureIds = GetPictureIds.GetPictureIdsIntoArray(); 

     //Assign Location and Rating to variables 
     int i = 0; 
     foreach (DataRow row in DAallAprovedPictureIds.Rows) 
     { 

      pictureIDs[i] = (int)row["PicID"]; 
      i++; 
     } 

     myRandomPictureID = pictureIDs[MYrandom]; 
     return myRandomPictureID; 
    } 

public DataTable GetPictureIdsIntoArray() 
    { 
     string strConectionString = ConfigurationManager.AppSettings["DataBaseConnection"]; 

     //set up sql 
     string StrSql = " SELECT Picture.PicID FROM MEMBERS INNER JOIN Picture ON MEMBERS.MemberID = Picture.MemberID WHERE (Picture.PicAproval = 1) AND (Picture.PicArchive = 0) AND (MEMBERS.MemberSex ='F')"; 
     DataTable dt = new DataTable(); 
     using (SqlDataAdapter daObj = new SqlDataAdapter(StrSql, strConectionString)) 
     { 

      //fill data table 
      daObj.Fill(dt); 
     } 
     return dt; 

    } 

答えて

3

私は、SqlDataAdapter自体が接続を処理すると考えています。ただし、複数のback-to-back fill()からdataアダプタへの接続の場合、各fill()リクエストで接続を開く方がパフォーマンスが向上します。その結果、データベース接続が数回開閉されます。

自分で接続を制御できると思います。

using (SqlConnection cnn= new SqlConnection (strConectionString)) 
using (SqlDataAdapter daObj = new SqlDataAdapter(StrSql, cnn)) 
    { 
     daObj.SelectCommand.Parameters.Add("@n", SqlDbType.Int); 
     daObj.SelectCommand.Parameters["@n"].Value = GetItemFromArray(); 

     cnn.Open(); 

     //fill data table 
     daObj.Fill(dt); 

     cnn.Close(); 
    } 
1

この行を追加してください。

daObj.Dispose(); 

EDIT: IISでプールをリサイクルすることもできます。一度使用すると接続を閉じるベストプラクティスです。

+2

daObjオブジェクトをすでに{}ブロックを使用して。 Dispose()に電話する必要はありますか?私はそれをする必要はないと思う、 –

0

使用すると、Disploseが呼び出されるようになります。私は投稿のコードが

細かいデフォルトの最大プールサイズは、統合セキュリティを使用して、ユーザーに100以上

をログに記録すると、接続と設定ファイルの競合でDataBaseConnectionでいくつかの設定かどうかを確認してください可能性が高いではありません100ですだと思いますプール。 http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring(v=vs.80).aspx

また、SqlDataAdapterオブジェクトまたはSqlDataConnectionオブジェクトが他の場所で破棄されていないかどうかを確認してください。あなたは、接続を効率的に処理しているかどうかを推測したくない場合は

+0

他の投稿にコメントを追加できないのはなぜですか? – findcaiyzh

2

は、あなたが開いているどのように多く伝えるためにクエリを実行することができます:

SELECT 
    DB_NAME(dbid) as DatabaseName, 
    COUNT(dbid) as ConnectionCount, 
    loginame as LoginName 
FROM 
    sys.sysprocesses 
WHERE 
    dbid > 0 
GROUP BY 
    dbid, loginame 
order by count(dbid) desc 
関連する問題