2012-06-13 70 views
18

我正在使用JDBC連接到Oracle。我測試了connection.setAutoCommit(false)connection.setAutoCommit(true),結果如預期。JDBC連接默認自動提交行爲

雖然默認情況下,連接應該像autoCommit(true)一樣工作[糾正我,如果我錯了],但沒有記錄被插入,直到connection.commit()被調用。有關違約行爲的任何建議?

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

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

conn.commit(); 
+1

您能否顯示您實際使用的代碼在哪裏不起作用?自動提交只發生在語句執行後。 – Ben

+0

您是否在「避免連接細節」部分做任何事情來影響自動提交設置? –

+0

您沒有發佈最有趣的部分 - 創建連接的代碼;) – npe

回答

20

Oracle JDBC documentation

當創建一個連接,它是在自動提交模式。這意味着 每個單獨的SQL語句都被視爲一個事務,並且在執行後立即自動提交。 (要更精確 精確,缺省情況下,SQL語句默認爲 完成時,而不是執行時。語句在其結果集和更新計數的所有 已檢索完成時完成。幾乎所有的 情況下,不過,聲明中完成的,因此承諾, 後馬上執行)

另一件事是 - 你ommitted連接創建的細節,所以我只是猜測 - 如果你正在使用某些框架,或者從數據源或連接池獲取連接時,autocommit可能會被這些框架/ poo轉換爲off ls/datasources - 解決方案是永遠不會相信默認設置;-)

+0

所以我應該把它作爲默認值可能與所有情況下的自動提交都不相同。 [類似默認與公共在Java中]? – stackex

+0

默認值應該相同(autocommit = true),因爲這是JDBC規範說的。但是,JDBC規範不適用於框架,連接池和數據源。例如,在JBoss中定義數據源時,可以在數據源XML文件中明確地將autocommit設置爲false,並且默認情況下從池中獲取的連接將關閉。 – npe