2012-06-13 16 views
18

Estoy trabajando con JDBC para conectarme a Oracle. Probé connection.setAutoCommit(false) frente a connection.setAutoCommit(true) y los resultados fueron los esperados.Comportamiento de autocommit de conexión JDBC predeterminado

Mientras que por defecto se supone que la conexión funciona como si autoCommit(true) [corrígeme si estoy equivocado], pero ninguno de los registros se está insertando hasta que se llamó connection.commit(). ¿Algún consejo sobre el comportamiento predeterminado?

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

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

conn.commit(); 
+1

¿Puede mostrar el código que usó en realidad donde no funcionó? El compromiso automático solo se produce después de que se haya ejecutado la instrucción. – Ben

+0

¿Está haciendo algo en la sección 'detalles de conexión evitados' que afecta la configuración de la confirmación automática? –

+0

No ha publicado la parte más interesante, el código que crea una conexión;) – npe

Respuesta

20

De Oracle JDBC documentation:

Cuando se crea una conexión, se encuentra en modo de confirmación automática. Esto significa que cada instrucción SQL individual se trata como una transacción y es comprometido automáticamente justo después de que se ejecuta. (Para ser más preciso, el valor predeterminado es que una declaración SQL se confirme cuando se completa , no cuando se ejecuta. Una declaración se completa cuando todos los de sus conjuntos de resultados y recuentos actualizados se han recuperado. casi todos los casos, sin embargo, una declaración se ha completado, y por lo tanto comprometidos, justo después de que se ejecuta)

La otra cosa es -. que omitido detalles de conexión de creación, así que estoy adivinando - si están utilizando algunos marcos, o adquiriendo una conexión desde un origen de datos o grupo de conexiones, el autocommit puede ser convertido off por esos frameworks/poo ls/datasources: la solución es no confiar nunca en las configuraciones predeterminadas ;-)

+0

así que debería tomarlo como predeterminado puede no ser igual a la confirmación automática verdadera en todos los casos. [algo como default vs public in java]? – stackex

+0

Los valores predeterminados deben ser los mismos (autocommit = true) porque eso es lo que dice la especificación JDBC. Sin embargo, la especificación de JDBC no se aplica a marcos, grupos de conexiones y fuentes de datos. Por ejemplo, al definir un origen de datos en JBoss, puede establecer de forma explícita autocommit en false en el archivo XML del origen de datos, y las conexiones que obtendrá de un grupo de servidores se desactivarán de manera predeterminada. – npe

Cuestiones relacionadas