2012-02-14 7 views
7

Creo que esto se debe a que no cierro las conexiones a mi base de datos. Publiqué el código im usando debajo para mi Datalayer. ¿Debo cerrar mi conexión? ¿Cómo lo haría yo también? ¿Es este el código que causa problemas?¿Se ha alcanzado el error del tamaño máximo de la agrupación?

Aquí está el código de error:

tiempo de espera agotado. El tiempo de espera transcurrido antes de obtener una conexión del grupo. Esto puede haber ocurrido porque todas las conexiones agrupadas estaban en uso y se alcanzó el tamaño máximo de la agrupación.

Descripción: Se produjo una excepción no controlada durante la ejecución de la solicitud web actual. Revise el seguimiento de la pila para obtener más información sobre el error y dónde se originó en el código.

Detalles de la excepción: System.InvalidOperationException: el tiempo de espera expiró. El tiempo de espera transcurrido antes de obtener una conexión del grupo. Esto puede haber ocurrido porque todas las conexiones agrupadas estaban en uso y se alcanzó el tamaño máximo de la agrupación.

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; 

    } 

Respuesta

3

Creo que SqlDataAdapter maneja la conexión por sí mismo. Sin embargo, en el caso de relleno múltiple() para el adaptador de datos, eso es más rendimiento para abrir la conexión en cada solicitud de relleno(). El resultado es que la conexión de la base de datos se abre y se cierra varias veces.

Creo que puede controlar la conexión usted mismo.

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

agregue esta línea después del relleno.

daObj.Dispose(); 

EDIT: También se puede reciclar piscina en IIS. pero su mejor práctica para cerrar la conexión una vez utilizada.

+2

El objeto daObj ya en el uso de {} bloque. ¿Necesitamos llamar a Dispose()? Creo que no es necesario que haga eso, –

0

usando se asegura de que se llamará a Displose. Creo que el código publicado es bien

defecto máximo del grupo Tamaño es de 100. No es probable que el uso de seguridad integrada y registra los usuarios más de 100.

Por favor, compruebe si un cierto ajuste en DataBaseConnection en conflicto con el archivo de configuración de conexión piscina. consulte: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring(v=vs.80).aspx

Y compruebe si el objeto SqlDataAdapter o SqlDataConnection no está disponible en otros lugares.

+0

¿Por qué no puedo agregar un comentario a la publicación de otra persona? – findcaiyzh

2

Si usted no quiere que adivinar si usted está manejando las conexiones de manera eficiente, se puede ejecutar una consulta para saber cuántos están abiertos:

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 
Cuestiones relacionadas