2012-03-24 12 views
8

Quiero hacer consulta por lotes DB para el alto rendimiento, el ejemplo de SQL para consultar sobre la base de diferentes customer_id:consulta por lotes JDBC para un alto rendimiento

select order_id, 
     cost 
from customer c 
    join order o using(id) 
where c.id = ... 
order by 

No estoy seguro de cómo hacerlo usando JDBC declaración. Sé que puedo usar el procedimiento almacenado para este propósito, pero es mucho mejor si puedo escribir sql en la aplicación Java en lugar de SP.
Estoy usando DBCP para mi cliente Java y base de datos MySQL.

+1

¿Qué quiere decir exactamente con "consulta por lotes"? Puede usar 'where c.id in (...)' para obtener más de un cliente. –

+0

No tengo idea de lo que quiere decir con "conjuntos de resultados múltiples para clientes". –

+0

@a_horse_with_no_name Me refiero a un conjunto de resultados para un cliente, no mezcle las filas de retorno. – superche

Respuesta

8

El JDBC Specification 4.0 describe un mecanismo para las actualizaciones por lotes. Como tal, las funciones de proceso por lotes en JDBC se pueden utilizar con fines de inserción o actualización. Esto se describe en el capítulo 14 de la especificación.

yo sepa no hay un mecanismo para seleccionar lotes, probablemente porque no hay una necesidad evidente de que, dado que, como otros han recomendado, sólo tiene que recuperar todas las filas que desea a la vez mediante la construcción correctamente su consulta.

int[] ids = { 1, 2, 3, 4 }; 
StringBuilder sql = new StringBuilder(); 
sql.append("select jedi_name from jedi where id in("); 
for (int i = 0; i < ids.length; i++) { 
    sql.append("?"); 
    if(i+1 < ids.length){ 
     sql.append(","); 
    } 
} 
sql.append(")"); 
System.out.println(sql.toString()); 

try (Connection con = DriverManager.getConnection(...)) { 

    PreparedStatement stm = con.prepareStatement(sql.toString()); 
    for(int i=0; i < ids.length; i++){ 
     stm.setInt(i+1, ids[i]); 
    } 

    ResultSet rs = stm.executeQuery(); 
    while (rs.next()) { 
     System.out.println(rs.getString("jedi_name")); 
    } 

} catch (SQLException e) { 
    e.printStackTrace(); 
} 

salida

select jedi_name from jedi where id in(?,?,?,?) 
Luke, Obiwan, Yoda, Mace Windu 

¿Hay alguna razón por la que se consideraría que necesita una cosa como una declaración por lotes de selección?

+1

Mi teoría actual es que para selecciones (con ResultSet por ejemplo) tipo de "buffer automático" "las próximas filas sobre la marcha, por lo que están" agrupadas "de forma gratuita para selectas. FWIW – rogerdpack

+1

@rogerdpack ¿Te refieres a la propiedad [fetchSize] (http://docs.oracle.com/javase/8/docs/api/java/sql/Statement.html#setFetchSize-int-)? Eso probablemente funcione, aunque la documentación indica que puede ser solo una pista para la base de datos. Eso no es todo, los controladores necesariamente lo implementan. –

+0

¡Oye, eso es todo, gracias por el enlace! Para los seguidores, con Postgres aparece también es necesario que se corrija automáticamente (raro): http://stackoverflow.com/questions/1468036/java-jdbc-ignores-setfetchsize – rogerdpack

0

Realmente no importa cuál es su declaración de SQL (puede utilizar tantas combinaciones anidadas como su DB puede manejar). A continuación se muestra el ejemplo básico de Java (no DBCP). Para el ejemplo de DBCP, que es bastante similar, puede consultar su example.

Connection connect = DriverManager.getConnection(YOUR_CONNECTION_STRING); 
// Statements allow to issue SQL queries to the database 
Statement statement = connect.createStatement(); 

ResultSet resultSet = statement.executeQuery("select order_id, cost 
               from customer c 
               join order o using(id) 
               where c.id = ... 
              order by"); 
+1

Quiero hacer una consulta por lotes, lo que significa obtener resultados múltiples para una consulta DB, instrucción sql como: seleccionar order_id, costo del cliente c join order o usar (id) donde c.id = 123 ordenar por; seleccionar order_id, cost from customer c join order o using (id) donde c.id = 456 ordenar por; – superche

+0

puede alimentar cualquier instrucción sql que compile como un argumento para 'executeQuery()' BTW: en su ejemplo, 2 consultas se pueden unificar en una – aviad

Cuestiones relacionadas