2012-06-13 24 views
18

Sto lavorando con JDBC per connettersi a Oracle. Ho provato connection.setAutoCommit(false) vs connection.setAutoCommit(true) ed i risultati erano come previsto.Comportamento JDBC comportamento autoCommit predefinito

Mentre per impostazione predefinita la connessione dovrebbe funzionare come se autoCommit(true) [correggimi se ho torto], ma nessuno dei record viene inserito fino a quando è stato chiamato connection.commit(). Qualche consiglio riguardo al comportamento predefinito?

String insert = "INSERT INTO MONITOR (number, name,value) VALUES (?,?,?)"; 

conn = connection; //connection details avoided 
preparedStmtInsert = conn.prepareStatement(insert); 
preparedStmtInsert.execute(); 

conn.commit(); 
+1

Puoi mostrare il codice che hai effettivamente usato dove non ha funzionato. L'autocommit si verifica solo dopo che l'istruzione è stata eseguita. – Ben

+0

Stai facendo qualcosa nella sezione 'dettagli di connessione evitati? Che fa qualcosa per influenzare le impostazioni di autocommit? –

+0

Non hai inserito la parte più interessante - il codice che crea una connessione;) – npe

risposta

20

Da Oracle JDBC documentation:

Quando si crea una connessione, è in modalità auto-commit. Ciò significa che ogni singola istruzione SQL viene trattata come una transazione ed è commesso automaticamente subito dopo l'esecuzione. (Per essere più precisi, , il valore predefinito è che un'istruzione SQL sia impegnata quando è completata, non quando viene eseguita. Una dichiarazione è completata quando sono stati richiamati tutti dei set di risultati e conteggi di aggiornamento. quasi tutti i casi, tuttavia, una dichiarazione è completata, e quindi impegnati, subito dopo viene eseguito)

L'altra cosa è -. si omesso di connessione dati per la creazione, quindi sto solo indovinare - se stanno usando alcuni framework, o acquisendo una connessione da un'origine dati o un pool di connessioni, lo autocommit può essere trasformato da off da quei framework/poo ls/datasources - la soluzione è di non fidarsi mai delle impostazioni predefinite ;-)

+0

quindi dovrei prenderlo come predefinito potrebbe non essere uguale a autocommit true in tutti i casi. [qualcosa come default vs public in java]? – stackex

+0

I valori di default dovrebbero essere gli stessi (autocommit = true) perché è quello che dice la specifica JDBC. Tuttavia, le specifiche JDBC non si applicano a framework, pool di connessioni e origini dati. Ad esempio, quando si definisce un'origine dati in JBoss è possibile impostare in modo esplicito autocommit su false nel file XML dell'origine dati e le connessioni che si otterranno da un pool verranno disattivate per impostazione predefinita. – npe

Problemi correlati