Tengo un servicio .NET 4 C# que está utilizando las bibliotecas TPL para enhebrar. Recientemente lo cambiamos para usar también la agrupación de conexiones, ya que una conexión se estaba convirtiendo en un cuello de botella para el procesamiento.agrupación de conexión de base de datos con servicio de subprocesos múltiples
Anteriormente, estábamos usando una cláusula de bloqueo para controlar la seguridad de la hebra en el objeto de conexión. Como el trabajo haría una copia de seguridad, la cola existiría como tareas, y muchos hilos (tareas) estarían esperando en la cláusula de bloqueo. Ahora, en la mayoría de los escenarios, los hilos esperan en la base de datos IO y los procesos de trabajo MUCHO más rápido.
Sin embargo, ahora que estoy usando la agrupación de conexiones, tenemos un problema nuevo. Una vez que se alcanza el número máximo de conexiones (100 por defecto), si se solicitan conexiones adicionales, hay un tiempo de espera (ver Pooling info). Cuando esto sucede, se lanza una excepción que dice "Tiempo de espera de solicitud de conexión agotado".
Todos mis IDisposables están dentro del uso de declaraciones, y estoy administrando adecuadamente mis conexiones. Este escenario ocurre debido a que se solicita más trabajo del que el grupo puede procesar (lo que se espera). Entiendo por qué se lanza esta excepción y estoy al tanto de las formas de manejarla. Un simple reintento se siente como un truco. También me doy cuenta de que puedo aumentar el tiempo de espera a través de la cadena de conexión, pero eso no parece una solución sólida. En el diseño anterior (sin agrupación), los elementos de trabajo se procesarían debido al bloqueo dentro de la aplicación.
¿Cuál es una buena forma de manejar este escenario para garantizar que todo el trabajo se procese?
Se puede publicar algunos de su código? Sería útil ver cómo está creando y programando Tareas. –
Las tareas se crean más o menos así: Task.Factory.StartNew (() => ProcessItem (item)); No estoy haciendo un seguimiento de los objetos de la tarea lo suficiente como para limitar la creación de tareas (si esa es la ruta que estaba pensando). No todas las tareas requieren el trabajo de la base de datos, y no todo el trabajo de la base de datos está utilizando la misma base de datos (hay muchas diferentes, oráculo, mssql, etc.). –
¿Esto es para manejar sobrecargas en la carga, o las solicitudes están llegando constantemente demasiado rápido para que usted las procese? Si es el último, deberá admitir la derrota y el fracaso de retorno en algún momento. –