sql >> Base de Datos >  >> RDS >> Oracle

¿Puedo cambiar la propiedad AutoCommit de una conexión JDBC varias veces?

Última actualización :sí, puede cambiar autoCommit varias veces, también puede solucionarlo usando el comando commit/rollback en una declaración como descubrió. Mi consejo es seguir con autoCommit establecido en falso y siempre usar transacciones donde las necesite.

También uso Postgres y Oracle y siempre uso autocommit =false, ya que no puedo administrar transacciones con autocommit =true

Puede cambiar la confirmación automática a medida que probó, pero lo animo a que administre las transacciones explícitamente, incluso si se trata de una declaración única.

Si puede usar un marco como Spring (o Guice), hay una gestión de transacciones realizada a través de AOP y no necesita molestarse con las instrucciones de confirmación y reversión.

En Oracle, el tiempo de compromiso no depende de la cantidad de datos comprometidos y el compromiso con una mayor frecuencia (con respecto a los requisitos funcionales) también puede afectar el rendimiento.

Actualizar :De su comentario, afirma que Postgres respeta los límites de transacción en la confirmación automática; No puedo reproducir el comportamiento aquí es un caso de prueba simple:

package test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class TestPostgresAutocommit {

    public static void main(String[] args) throws Exception {
        Connection connection= DriverManager.getConnection("jdbc:postgresql://pgdev/dbxxx","xxx","xxx");
        connection.setAutoCommit(true);
        Connection connection2= DriverManager.getConnection("jdbc:postgresql://pgdev/dbxxx","xxx","xxx");
        connection2.setAutoCommit(true);        
        Statement statement=connection.createStatement();
        for (int i=0; i<10; i++) {
            statement.execute("insert into test_gc(col1,col2) values ("+ i + "," + "'" + i + "')");
        }
        statement.close();
        countElements(connection2);
        statement=connection.createStatement();
        statement.execute("delete from test_gc");
        statement.close();
        statement=connection.createStatement();
        statement.execute("begin");
        statement.close();
        statement=connection.createStatement();
        for (int i=0; i<10; i++) {
            statement.execute("insert into test_gc(col1,col2) values ("+ i + "," + "'" + i + "')");
        }
        connection.rollback();
        countElements(connection2);

    }

    private static void countElements(Connection connection2) throws Exception {
        Statement statement2=connection2.createStatement();
        ResultSet rs=statement2.executeQuery("select count(*) from test_gc");
        rs.next();
        System.out.println("row num in table=" + rs.getInt(1)); 
        rs.close();
        statement2.close();

    }

}

el programa falla al retroceder con una excepción:

Por lo tanto, no es posible administrar transacciones cuando autoCommit es verdadero; ¿Encontraste algo diferente?

Actualización II :Incluso con este código que creo que refleja los datos en su comentario, obtuve la Excepción:

package test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class TestPostgresAutocommit {

    public static void main(String[] args) throws Exception {
        //System.out.println("start");
        Connection connection= DriverManager.getConnection("jdbc:postgresql://pgdev/dbxxx","xxx","xxx");
        connection.setAutoCommit(true);
        Connection connection2= DriverManager.getConnection("jdbc:postgresql://pgdev/dbdxxx","xxx","xxx");
        connection2.setAutoCommit(true);        
        Statement statement=connection.createStatement();
        for (int i=0; i<10; i++) {
            statement.execute("insert into test_gc(col1,col2) values ("+ i + "," + "'" + i + "')");
        }
        statement.close();
        countElements(connection2);
        statement=connection.createStatement();
        statement.execute("delete from test_gc");
        statement.close();
        statement=connection.createStatement();
        statement.execute("begin");
        for (int i=0; i<10; i++) {
            statement.execute("insert into test_gc(col1,col2) values ("+ i + "," + "'" + i + "')");
        }
        connection.rollback();
        countElements(connection2);

    }

    private static void countElements(Connection connection2) throws Exception {
        Statement statement2=connection2.createStatement();
        ResultSet rs=statement2.executeQuery("select count(*) from test_gc");
        rs.next();
        System.out.println("row num in table=" + rs.getInt(1)); 
        rs.close();
        statement2.close();

    }

}