Best Practice für AutoCommit-Anweisungen in Java für MySQL Nutzung via JDBC

Rauben :

In meinem Java-Code I interact mit einer MySQL-Datenbank über eine JDBC-Verbindung. Ich Setup eine Verbindung und einige Anweisungen (zur Wiederverwendung)

            connect = DriverManager.getConnection(connectionstring);            
            statement = connect.createStatement();
            statement2 = connect.createStatement();

Für die meisten der Code, statement.executeQuery (Abfrage) ist in Ordnung, aber einige Operationen sind „Blöcke“, so dass ich sicherstellen müssen, dass sie entweder alle zusammen gehen, oder keiner von ihnen tun. Ich glaube, dass der folgende Code dies erreicht.

            connect.setAutoCommit(false);
            statement.addBatch(insertquery1);
            statement.addBatch(insertquery2);
            statement.addBatch(insertquery3);
            statement.addBatch(insertquery4);
            statement.executeBatch();
            connect.commit();           
            connect.setAutoCommit(true);

Soweit ich das beurteilen kann, die Verbindungs Anrufe über die gesamte Verbindung beeinflussen, auswirken würde so sowohl Aussage und statement2. Außerdem kann ich scheinbar die AutoCommit Werte gesetzt , nachdem ich die Aussage Objekt erstellt und es gilt nach wie vor zu. Ist das richtig? Und wäre es besser Praxis / effizienter sein , sie zu spalten und einen anderen Verbindungsobjekt hält nur für autocommit Anrufe wie unten?

            // objects purely for batch operations
            connect = DriverManager.getConnection(connectionstring);            
            connect.setAutoCommit(false);
            statement = connect.createStatement();
            // objects for normal operations
            connect2 = DriverManager.getConnection(connectionstring);           
            connect2.setAutoCommit(true);
            statement2 = connect2.createStatement();

In meiner Anwendung sie weniger als 1% der Anrufe, aber dieser Prozentsatz in Chargen durchgeführt werden muss. Was ist das Beste der Praxis?

Tim Biegeleisen:

Der ganze Sinn der Auto-Einstellung falsch begehen ist, so dass mehrere SQL-Anweisungen können alle laufen innerhalb der gleichen Transaktion. Und mit jedem Ihrer vier Insert-Anweisungen etwas schief gehen sollte, würde die gesamte Transaktion logisch rückgängig gemacht werden, so dass Sie nicht mit inkonsistenten Daten in der Datenbank landen. Das Muster, das Sie bereits folgende ist Best Practice:

connect.setAutoCommit(false);
statement.addBatch(insertquery1);
statement.addBatch(insertquery2);
statement.addBatch(insertquery3);
statement.addBatch(insertquery4);
statement.executeBatch();
connect.commit();           
connect.setAutoCommit(true);

Das heißt, es ist am beste Praxis Rückkehr Auto verpflichten, wahr, nachdem Sie Ihre Transaktion abgeschlossen haben. Dies ist so, dass jeder anderer Teil des Codes, oder vielleicht Ihre Zukunft Code, sollte es jemand anderes erben, die immer noch das gleiche Verbindungsobjekt verwendet würde das Standardverhalten von automatischem Empfang wahr begehen ist.

Ich denke du magst

Origin http://10.200.1.11:23101/article/api/json?id=389868&siteId=1
Empfohlen
Rangfolge