2012-06-13 5 views
18

Ich arbeite mit JDBC, um eine Verbindung zu Oracle herzustellen. Ich testete connection.setAutoCommit(false) vs connection.setAutoCommit(true) und die Ergebnisse waren wie erwartet.JDBC-Verbindung Standard AutoCommit Verhalten

Während Verbindung standardmäßig funktioniert als ob autoCommit(true) [korrigieren Sie mich, wenn ich falsch liege], aber keiner der Datensätze eingefügt werden, bis connection.commit() aufgerufen wurde. Irgendwelche Ratschläge bezüglich Standardverhaltens?

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

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

conn.commit(); 
+1

Können Sie den Code zeigen, den Sie tatsächlich verwendet haben, wo es nicht funktioniert hat. Autocommit tritt nur auf, nachdem die Anweisung ausgeführt wurde. – Ben

+0

Machst du irgendetwas im Abschnitt "Verbindungsdetails vermieden", der die Autocommit-Einstellungen beeinflusst? –

+0

Sie haben nicht das interessanteste Teil gepostet - der Code, der eine Verbindung herstellt;) – npe

Antwort

20

Von Oracle JDBC documentation:

Wenn eine Verbindung erstellt wird, ist es in der Auto-commit-Modus. Dies bedeutet , dass jede einzelne SQL-Anweisung als eine Transaktion behandelt wird und automatisch Committed direkt nach der Ausführung ist. (Um genauer zu sein präzise, ​​der Standardwert ist für eine SQL-Anweisung festgeschrieben werden, wenn es abgeschlossen ist, nicht, wenn es ausgeführt wird. Eine Anweisung ist abgeschlossen, wenn alle seiner Ergebnissätze und Update-Zähler abgerufen wurden jedoch fast allen Fällen wird eine Erklärung abgeschlossen, und daher verpflichtet, direkt nach dem es ausgeführt wird)

Die andere Sache ist -. Sie Verbindung Schaffung Details weggelassen, so dass ich nur raten - wenn Sie Einige Frameworks verwenden oder eine Verbindung von einer Datenquelle oder einem Verbindungspool erhalten. Die autocommit kann von diesen Frameworks/poo in off umgewandelt werden ls/datasources - die Lösung ist, niemals auf Standardeinstellungen zu vertrauen ;-)

+0

also sollte ich es als Standard nehmen möglicherweise nicht identisch mit autocommit in allen Fällen. [etwas wie Standard gegen öffentliche in Java]? – stackex

+0

Die Standardwerte sollten identisch sein (autocommit = true), da dies die JDBC-Spezifikation angibt. Die JDBC-Spezifikation gilt jedoch nicht für Frameworks, Verbindungspools und Datenquellen. Wenn Sie beispielsweise eine Datenquelle in JBoss definieren, können Sie autocommit in der Datenquellen-XML-Datei explizit auf false setzen, und die Verbindungen, die Sie aus einem Pool erhalten, werden standardmäßig deaktiviert. – npe