¿Como ejecutar 2 querys al mismo tiempo?

Hola foro,
mi pregunta es q quiero hacer 2 consultas que se ejecuten al mismo tiempo, por ejemplo cuando uno hace:

ResultSet rs = sentencia.executeQuery("SELECT algo FROM algunaTabla"); 
while (rs.next()) {
        System.out.println(rs.getObject("algo"));            
}

ahi solo se ejecuta esa consulta, pero como lo hara para ejecutar 2 consultas al mismo tiempo en el ciclo while??
se supne q tengo q tener 2 ResultSet o sea 2 variables "rs" una por cada consulta, pero no me funciona en el ciclo

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

Quizá sea mejor que hicieras

Quizá sea mejor que hicieras un join en tu query en vez de quererlo hacer en el código.

Pero si insistes, debería

Pero si insistes, debería funcionar algo como:

ResultSet rs  = sentencia.executeQuery("SELECT algo FROM algunaTabla");
while( rs.next() ) {
   ResultSet interno = otraSentencia.executeQuery("SELECT otraCosa FROM otraTabla");
   
}

Pero una vez más, así estas casi garantizando que tengas problemas de recursos ( ya sea conexiones, red, o performance ) en tu app

Pero supongo que te darás cuenta de eso muy rápidamente.

Imagen de ezamudio

conexiones

Si mal no recuerdo, una conexión solamente puede tener un ResultSet abierto, de modo que si quieres dos consultas simultáneas o anidadas, necesitas dos conexiones...

Imagen de bimboso_d

Posibilidad

Pues yo tengo una aplicacion con una sola conexion y varios resulset. aunque a lo mejor no sea lo mas correcto pero te dejo mi idea.

//Objetos a utilizar
CboImpl resultado = new CboImpl();
Connection objlConnection = null;
CallableStatement objlCallStm = null;
ResultSet objlResultSet = null;
StringBuffer objlQuery = null;

try {
     // Obtiene la conexion.
    objlConnection = DatabasePool.getConnection();

    for(int i=0; i < 2; i++){
      objlCallStm = null;
      objlResultSet = null;
      objlQuery = new StringBuffer();

      //Esto es el query a ejecutarse, puede ser el mismo o modificado.
      objlQuery.append("sps").append(i).append(")");

      //Ejecutando el query
      objlCallStm = executeQuery(objlQuery.toString(), objlConnection);

      //Resultado del query
      objlResultSet = getResultSet(objlCallStm);

      //recorriendo el resulset
     while((objlResultSet != null) && (objlResultSet.next())){
     system.out.println("Dentro del resulset");
     }
  }
} catch(Exception e){
  System.out.printl(e.getMessage())
}

Aclarando, no tiene nada que ver el contenido del objlCallStm ni el recorrido del resulset, incluso el catch no tiene que ser Exception, puede ser SQLException o algo asi para reducir el catch, pero solo es la idea lo que te quiero comentar, el hecho de que en el for, los objetos los apunto a null para perder toda referencia a su contenido y no se te repita el resulset, pues si no lo haces asi, te ejecuta "i" veces el query y te regresa la misma cantidad de resulset repetidos, claro que cuando insertas en una base de datos, pues esto ya es erroneo.
Saludos

Imagen de ezamudio

no son simultáneos

bimboso_d, tu ejemplo no tiene queries anidados ni concurrentes. Una misma conexión por supuesto que puede atender varios queries, pero uno tras otro. Tu ciclo podría tener miles de iteraciones y va a funcionar bien, porque es un solo query a la vez. Aquí lo que discutíamos era hacer queries anidados, o concurrentes: tener un ResultSet abierto y que uses la misma conexión para ejecutar otro query sin cerrar ese primer ResultSet, para obtener un segundo ResultSet...

Imagen de bimboso_d

Hooo

Jajaja ha pues entonces no entendi jajaja de todas formas saludos.

creo que lo que dice OscarRyz

creo que lo que dice OscarRyz debiese funcionar
mi unica anotacion es q dentro del primer while debiese declararse la nueva variable de conexion y obtener ahi la nueva conexion y el nuevo Resultset,
completando el fragmento de codigo de Oscar quedaria algo asi:

ResultSet rs  = sentencia.executeQuery("SELECT algo FROM algunaTabla");
while( rs.next() ) {
   Connection nuevaConecion= null;
   nuevaConecion = getConnection();
   Statement nuevostmt = nuevaConecion .createStatement();
   ResultSet interno = nuevostmt .executeQuery("SELECT otraCosa FROM otraTabla");
   while(rs2.next()) {
                System.out.println(muestra la query interna);
   }
}

@jbrothermx

Y segurito te va a dar problemas de performance

Lo que yo hago cuando mis poderes de SQL no dan para más ( que es casi siempre ) y no puedo hacer el join con el outer join con el inner outer left -right shla la la , sha la la query. Y sé el que el número de registros que mi consulta trae: Es:

1.- Hacer un select con alguna especia de paginación ( ej, where id > 200 and id < 400 )
2.- Iterar todo el resultset y meter el id en una lista
3.- Cerrar ese recurso ( usando un pool es muchisiimo mejor )
4.- Hacer fuera del for, otro query, ahora poniendo mi join usando las listas tipo: .... where id in ( ?,?,? ) llenado con los ids anteriores
5.- Obtener los nuevos datos.

Es decir algo como:

Rs rs = ...execute("select id from a where id > 100 and id < 200");
List ids = new ArrayList();
while( rs.next() ) {
   ids.add( rs.getInt("id");
}
close( rs );
String stmt = "select * from b where id in ( " + /*crearTantos ? como list.size() */ + ")";
Pstmt pstmt = conn.prepare(stmt);
for( int id : list ) {
   pstmt.setInt( i++, id ); // i++
}
Rs = stmt.execute();
while( rs.next() ){
// consumir el otro rs con los datos obtenidos

Pero siempre es mejor hacer un buen query con joins bien hechos que un DBA pueda optimizar, que hacer esto que menciono. Esto debe de tomarse como una mala práctica y usarse como último recurso.

Imagen de ezamudio

Performance

Ese último código de jbrothermx crea una conexión por cada registro del ResultSet externo. Eso es costosísimo. Si bien es cierto que se necesitan conexiones separadas, no se necesita una conexión nueva cada vez; se puede reutilizar la misma conexión.

Fuera de los ciclos, se puede crear la segunda conexión (cuando se crea la primera por ejemplo). Dentro del ciclo que itera sobre el ResultSet externo, se ejecuta el query interno que obtiene un ResultSet usando la segunda conexión, pero siempre es la misma conexión. Solamente hay que cerrar el ResultSet interno al terminar el ciclo interno.

Pero como dice Oscar, la mejor optimización sería un JOIN para hacer un solo ciclo de lectura. Dejen al RDBMS hacer lo que mejor sabe hacer.

Imagen de Andres villamayor

En todos los ejemplo que

En todos los ejemplo que estoy mirando y que estan buenisimo, pero ninguno comita? o solo dejan a Jdbc para el comit automatico.