Después de estar buscando un buen rato la solución a este problema, encontré esto:
Al parecer el problema se encuentra en el manejo del pool. Por lo que lei se supone que al momento de usar datareaders sobre una coneccion, estas al momento de cerrarse permiten reutilizarse y es por eso que continuan abiertas. Esto implica que el que desarrolla deba de tener un control exacto sobre todas las conecciones y objetos sobre estas ultimas.
Si bien, es una forma de reutilizar recursos y optimizar el tiempo de respuesta, implica una desgastante tarea por parte del desarrollador al administrar de forma correcta todos sus objetos.
Para serles honesto, lo vi muy enrredado todo esto.
En fin, para solucionarlo, en mi cadena de coneccion a la DB agregue ";Pooling=False", y con esto las conecciones que quedan en "sleeping" se cierran mas rapido y me permite abrir mucho mas conecciones a la DB (logre abrir arriba de 1000 {creo que llega hasta 32,768}, cuando antes llegaba solo a 100) sin que el servidor se viera afectado.
Algo curioso que encontre (que quiza a alguien pudiera servirle) es que si al momento de estar corriendo mi aplicación, cambio algo sobre mi cadena de coneccion (por decir, si la origina era:
"Data Source=myserver;Initial Catalog=rh;user=x;password=x; Pooling=False", al cambiarla por "Data Source=myserver;Initial Catalog=rh; Pooling=False;user=x;password=x") todas las conecciones se cerraban (con la primera cadena), aunque esto implica que el servidor se tarde un poco mas en la respuesta e incluso, hace de nuevo una validacion de credenciales.
En resumen, logre con esto quitarme el problema de encima (ya que mas de 100 usuarios se conectan al mismo tiempo), aunque quiza no sea la mejor solucion al 100%.
Espero que el buen Guille pueda en algun tiempo, dar una explicacion completa sobre esto, y como solucionarla al 100
Informacion al respecto aqui:
http://betav.com/blog/billva/2007/05/managing_and_monitoring_net_co.htmlSaludos,