Pregunta

Estoy dividiendo una operación de base de datos de solo lectura en varios fragmentos (cada uno lee un subconjunto de una gran cantidad de datos, los analiza y escribe los resultados en un archivo de disco).

Cada fragmento realiza una Selección (en una tabla de datos) en un nuevo hilo .net (usando un delegado y BeginInvoke)

Hay más subconjuntos de datos que conexiones disponibles en el grupo, por lo que cuando me quedo sin conexiones, antes de que se publique la primera, las solicitudes de conexión posteriores se ponen en cola ... hasta que expire el tiempo de espera de conexión, y entonces obtengo una excepción de tiempo de espera.

¿Cómo puedo, A) inhibir la excepción de conexión de tiempo de espera cuando todas las conexiones en el grupo están en uso, o B) detectar que están en uso antes de pedir otra para poder esperar hasta que una esté disponible antes de preguntar?

¿Fue útil?

Solución

Dos soluciones:

A) Configure su grupo de conexiones con un tiempo de espera de varios días. Eso bloqueará las tareas pendientes hasta que se devuelva una conexión. Inconveniente: esto no funcionará cuando se cuelgue una tarea.

B) Use un grupo de subprocesos y una cola de trabajo. El grupo de subprocesos debe tener el mismo tamaño que el grupo de conexiones (es decir, una conexión por subproceso). Coloque todo el trabajo en la cola y haga que las tareas recuperen elementos de trabajo de la cola hasta que la cola esté vacía.

Pseudocódigo para la solución B:

public class Setup
    connPool = createConnectionPool(100);
    queue = createWorkQueue();
    putAllWorkItemsInQueue(queue);
    for (int i=0; i<connPool.size(); i++) {
        t = new WorkerThread(queue)
        list.add(t);
        t.start();
    }
    while (queue.size() != 0) {
        Thread.sleep(1000);
    }
    for (thread in list) {
        thread.interrupt();
    }

public class WorkerThread
    run() {
        while (true) {
            try {
                workUnit = queue.get(); // This blocks
                process(workUnit);
            } catch (InterruptedException e) {
                break;
            }
        }
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top