2012-08-15 6 views
5

Per chiarimenti: So che è la cosa giusta creare il PreparedStatement fuori dal ciclo. Ho fatto questa domanda solo per curiosità.Creazione di una istruzione preparata all'interno di un ciclo


Supponiamo che Sto creando un PreparedStatement all'interno di un ciclo con sempre la stessa query SQL.

final String sql = "INSERT INTO ..."; 
while (condition) { 
    ... 
    PreparedStatement statement = connection.prepareStatement(sql); 
    // Fill values of the prepared statement 
    // Execute statement 
    ... 
} 

È questo inutile dal momento che l'oggetto PreparedStatement viene sempre creato di nuovo? Oppure il database sottostante riconosce che è sempre la stessa query SQL con cui viene creato lo PreparedStatement e lo riutilizza?

+0

Perché stai creando t lui 'PreparedStatement' all'interno del ciclo? Metti la creazione fuori dal ciclo e riutilizzala nel ciclo. – Jesper

+2

Il punto di una dichiarazione preparata è prepararlo una volta e usarlo più volte. L'implementazione effettiva può essere a carico del driver, ma è necessario verificare le specifiche per verificare se esistono regole effettive in merito. –

+0

@Jesper So che è meglio crearlo dal loop. Ho appena fatto questa domanda per curiosità. :-) –

risposta

1

Alcuni driver memorizzano nella cache istruzioni preparate, sì. Ad esempio, scremare questa documentazione Oracle: http://docs.oracle.com/cd/B10501_01/java.920/a96654/stmtcach.htm

Non credo che ci sia qualcosa che richiede questo per tutti i driver, anche se certamente sembra una probabile funzione di molti driver JDBC. Suona come MySQL non potrebbe fare questo: How to use MySQL prepared statement caching?

Detto questo, se si vuole veramente utilizzare le istruzioni preparate in modo efficiente, sembra appesa ad un esempio di una dichiarazione preparata che si utilizza su ogni iterazione del ciclo fa un sacco più senso.

+0

+1 per fornire la documentazione di Oracle –

8

1. Se si utilizza la stessa PreparedStatement tutto il ciclo, poi suo meglio mantenere ilPreparedStatementfuori del ciclo.

2. Se avete SQL statment che continua a cambiare all'interno del ciclo, allora solo il suo valore di utilizzarlo nel ciclo.

3. Inoltre se continuano a cambiare, poi basta usare Statementinvece diPreparedStatement, altrimenti lo scopo stesso della PreparedStatement si perde quando si mantiene cambiarla.

1

Due modi finora so.

prima Way

sua Inserisci record uno ad uno

final String sql = "INSERT INTO tablename(columnname) Values(?)"; 

PreparedStatement statement = connection.prepareStatement(sql); 

while (condition) { 
statement.setString(1,value); 
statement.executeUpdate(); 
} 

(o)

secondo modo

Inserisce tutti record come Inserimento di massa

final String sql = "INSERT INTO tablename(columnname) Values(?)"; 

PreparedStatement statement = connection.prepareStatement(sql); 

while (condition) { 
statement.setString(1,value); 
statement.addBatch(); 
} 

statement.executeBatch();