2012-06-13 16 views
18

私はJDBCに接続してOracleに接続しています。私はconnection.setAutoCommit(false)connection.setAutoCommit(true)をテストし、結果は予想通りでした。JDBC接続のデフォルトの自動コミット動作

デフォルトでは接続はautoCommit(true)のように動作しますが[私が間違っている場合は私を修正]しますが、connection.commit()が呼び出されるまでレコードが挿入されていません。デフォルトの動作に関するアドバイスはありますか? Oracle JDBC documentationから

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

接続が作成されると、それが自動コミットモードです。つまり、個々のSQL文はトランザクションとして扱われ、実行後に自動的にコミットされるのは です( )。 ( の場合、デフォルトでは、実行時ではなく が完了した時点でコミットされます。結果セットと更新カウントのすべてがのときにステートメントが完了します。ほとんど すべてのケースでは、しかし、ステートメントが完了し、そのためにコミットされ、 それが実行された直後)

他の事がある - 。あなたは、接続の作成の詳細を省略さなので、私はちょうど推測している - あなたの場合いくつかのフレームワークを使用しているか、またはデータソースまたは接続プールから接続を取得している場合、autocommitはこれらのフレームワーク/ pooによってoffになる可能性がありますls/datasources - 解決策はデフォルト設定を絶対に信頼しないことです;-)

+0

ので、すべてのケースで自動コミットと同じではない可能性があります。 [javaのデフォルトとvsのような何か]? – stackex

+0

デフォルトは同じである必要があります(autocommit = true)。これはJDBC仕様のとおりです。ただし、JDBC仕様は、フレームワーク、接続プール、およびデータソースには適用されません。たとえば、JBossでデータソースを定義する場合、データソースXMLファイルでautocommitをfalseに明示的に設定することができます。また、プールから取得する接続は、デフォルトでは無効になります。 – npe