Ho un oracle stored proc
che deve essere chiamato dal mio programma Java. Avevo usato CallableStatement
per passare i parametri al proc memorizzato. Sto usando il driver oracle thin (configurato in web logic server rispetto alla relativa voce jndi). Questo processo memorizzato non ha valori OUT. Questo processo memorizzato accetta un valore numerico e fa molti aggiornamenti nel db in base al valore ricevuto.Considerazioni sulla preparazione, sulla callableStatement e sulla prestazione
Ricevo un oggetto di connessione e quindi richiama questo processo memorizzato in loop (20 volte per passare 20 numeri). Quando richiama direttamente questo processo memorizzato da un client Oracle, l'esecuzione viene completata in 2-3 secondi. Tuttavia il comportamento non è prevedibile dal mio codice java. Alcune chiamate richiedono anche 30-40 secondi per essere completate.
Ho provato a utilizzare PreparedStatement
anziché CallableStatement
e potrebbe vedere un miglioramento marginale delle prestazioni (sebbene il comportamento sia ancora incoerente).
- è ok nel mio caso da usare al posto di
PreparedStatement
CallableStatement
dato che la StoredProc non ha parametri OUT? - C'è qualche motivo per cui lo
PreparedStatement
ha un guadagno di prestazioni superiore aCallableStatement
o è qualcosa che potrei aver osservato in modo errato? - Esiste un approccio migliore per risolvere questo problema di prestazioni?
È possibile inserire il codice? In alternativa, conferma che la tua connessione non viene stabilita con ciascuna iterazione (invece di usare ripetutamente una connessione), e conferma che non stai chiamando 'conn.prepareCall()' ad ogni iterazione (invece di avere solo .setInt () 'e' .execute() 'nel ciclo). – Matt
Si chiama la stored procedure più di una volta, corretta? Hai provato a utilizzare chiamate batch? http://docs.oracle.com/javase/1.3/docs/guide/jdbc/getstart/callablestatement.html vedere 7.1.3 –
Invece di effettuare 20 chiamate, perché non provare un blocco PL/SQL anonimo (iniziare ... chiama proc ... call proc ...... end;) che chiama il tuo stored proc 20 volte e effettua una chiamata al database con il blocco anonimo. – GriffeyDog