2012-03-24 15 views
8

voglio fare query batch DB per alte prestazioni, ad esempio SQL per query basata su diversi customer_id:query batch JDBC per elevate prestazioni

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

Non sono sicuro di come farlo using JDBC. So che posso usare la stored procedure per questo scopo, ma è molto meglio se posso semplicemente scrivere sql in app Java anziché SP.
Sto utilizzando DBCP per il mio client Java e DB MySQL.

+1

Che cosa intendi esattamente con "query batch"? Puoi usare 'where c.id in (...)' per ottenere più di un cliente. –

+0

Non ho idea di cosa intendi con "set di risultati multipli per i clienti". –

+0

@a_horse_with_no_name Intendo un set di risultati per un cliente, non mescolare le righe di ritorno. – superche

risposta

8

Il JDBC Specification 4.0 descrive un meccanismo per gli aggiornamenti in batch. Pertanto, le funzionalità batch in JDBC possono essere utilizzate per scopi di inserimento o aggiornamento. Questo è descritto nel capitolo 14 della specifica.

AFAIK non esiste un meccanismo per selezionare i lotti, probabilmente perché non vi è alcuna necessità apparente poiché, come altri hanno raccomandato, è possibile recuperare semplicemente tutte le righe che si desidera in una volta creando correttamente la query.

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(); 
} 

uscita

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

C'è qualche motivo per cui si dovrebbe prendere in considerazione che avete bisogno di una cosa del genere un'istruzione batch di selezione?

+1

La mia teoria corrente è che per selects (con ResultSet per esempio) tipo di "buffer auto "le prossime poche file mentre vai, quindi sono" in batch "gratis per selects. FWIW – rogerdpack

+1

@rogerdpack Intende la proprietà [fetchSize] (http://docs.oracle.com/javase/8/docs/api/java/sql/Statement.html#setFetchSize-int-)? Probabilmente funziona, anche se la documentazione afferma che potrebbe essere solo un suggerimento per il database. Non tutti i driver lo implementano necessariamente. –

+0

Ehi, grazie per il link! Per i follower, con Postgres appare anche bisogno di autocommit off (strano): http://stackoverflow.com/questions/1468036/java-jdbc-ignores-setfetchsize – rogerdpack

0

Non importa quale sia la tua istruzione SQL (puoi usare tutti i join annidati che il DB può gestire). Di seguito è riportato un esempio Java di base (non DBCP). Per esempio DBCP che è abbastanza simile è possibile controllare il loro 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

Voglio fare una query batch che significa ottenere più risultati per una query DB, istruzione sql come: select order_id, costo da c ordine c join o using (id) dove c.id = 123 order by; select order_id, costo dal cliente c join order o using (id) dove c.id = 456 ordina per; – superche

+0

puoi alimentare qualsiasi istruzione sql che compila come argomento per 'executeQuery()' BTW: nel tuo esempio 2 query possono essere consolidate in una – aviad

Problemi correlati