2012-03-29 17 views
5

Para completar ciertas solicitudes del usuario, en mi aplicación, estoy emitiendo múltiples consultas de bases de datos desde un solo método, pero actualmente se están ejecutando secuencialmente & por lo que la aplicación está bloqueada hasta el momento en que ha recibido la respuesta/datos para la consulta anterior, luego proceder a la siguiente consulta. Esto no es algo que me gusta mucho. Me gustaría enviar consultas paralelas.Múltiples consultas de bases de datos en paralelo, para una sola solicitud de cliente

También después de realizar consultas me gustaría hacer otro trabajo (en lugar de estar bloqueado hasta respuesta de consultas anteriores) & para obtener la respuesta para cada consulta Me gustaría ejecutar un bloque de código específico para los datos de cada consulta. ¿Cuál es la manera de hacer esto?

Editar: Mi API DB proporciona la agrupación de conexiones.


estoy sólo un poco familiarizados con múltiples hilos de Java.

Using:- 
------ 
Java 1.6 
Cassandra 1.1 Database with Hector 
+1

Aquí hay muchas complejidades. Recomiendo comenzar leyendo un poco sobre el subprocesamiento en Java: http://docs.oracle.com/javase/tutorial/essential/concurrency/ – Gray

Respuesta

-3

Aquí es un enfoque muy trivial/limitada:

final Connection conn = ...; 
final Object[] result = new Object[1]; 
Thread t1 = new Thread(new Runnable() { 
    public void run() { 
     Object results = conn.executeQuery(); 
     result[0] = results; 
    } 
}); 
t1.setName("DBQueryWorker"); 
t1.start(); 
// do other work 
while (t1.isAlive()) { 
    // wait on thread one 
} 

Este es un enfoque simple, pero muchos otros son posibles (por ejemplo, conjunto de hilos a través de ejecutores de tareas Java concurrencia, ejecutores de tareas primavera, etc.) .

+1

Esto es esencialmente de un solo subproceso, ya que solo tiene 1 objeto de conexión , y el hilo principal espera (de la manera incorrecta - debería usar join()) en el hilo de solicitud – ControlAltDel

+0

@ user1291492: En caso de que esta solución sea incorrecta, ¿podría agregar algunos ejemplos de código/sugerencias sobre cómo implementar esto en su respuesta? –

+0

No creo que sea justo decir que esto tiene un solo hilo. Su "otro trabajo" podría hacerse fácilmente mientras la conexión está ocupada (suponiendo que no la use). En última instancia, es probable que necesite más de una conexión para hacer frente a su escenario de múltiples hilos, pero este fue un ejemplo básico, no una solución completa. Estoy de acuerdo con la sugerencia de usar join en lugar de busy-wait al final, sin embargo. – jsight

0

Usted debe entender antes de empezar a hacer esto

  1. Para beneficiarse de concurrencia, es necesario tener múltiples conexiones db. La mejor manera de resolver esto es crear un grupo db.

  2. Necesita crear una clase ejecutable/invocable para ejecutar una declaración de db. Necesitará armar algún sistema de mensajería para alertar a los oyentes cuando su consulta haya completado

  3. Entienda que cuando está enviando varias solicitudes al mismo tiempo, todas las apuestas están desactivadas y se completará primero, y que hay puede haber conflictos entre declaraciones que desestabilicen su aplicación.

+0

Mi API de acceso DB proporciona agrupación de conexiones. ¿Debo estar seguro de que entre las múltiples consultas de datos se completará primero? ¿No puede ser como que lo que completa primero conduce a la ejecución de su bloque de código específico? –

0

Tengo la tarea/problema similar. Para obtener el resultado de compilación completo, debo enviar algunas solicitudes para unos pocos servicios diferentes (pocos en REST, pocos en Thrift), para disminuir la latencia necesito enviarlos en paralelo. Mi idea es usar java.util.concurrent.Future, crear un administrador de agregación simple, que cree muchas solicitudes juntas y se aguarde la última respuesta recuperada y devuelva todos los datos necesarios. En una solución más avanzada, este administrador puede hacer/combinar el resultado final durante otras consultas, pero esta solución puede no ser segura para subprocesos.

Cuestiones relacionadas