Лучшая практика для операторов AutoCommit в Java для MySQL использования через JDBC - PullRequest
3 голосов
/ 02 апреля 2020

В моем коде Java я взаимодействую с базой данных MySQL через соединение JDB C. Я устанавливаю соединение и некоторые операторы (для повторного использования)

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

Для большей части кода Statement.executeQuery (запрос) подходит, но некоторые операции являются «блоками», поэтому мне нужно убедиться, что они либо все вместе проходят, либо никто из них этого не делает. Я полагаю, что следующий код достигает этого.

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

Насколько я могу судить, вызовы connect влияют на все соединение, поэтому влияют и на оператор, и на оператор2. Кроме того, казалось бы, я могу установить значения AutoCommit после Я создал объект оператора, и он все еще применяется к нему. Это правильно? И будет ли лучше практиковать / более эффективно разделять их и сохранять другой объект соединения только для автокоммитов, как показано ниже?

            // 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();

В моем приложении они составляют менее 1% вызовов, но этот процент делает нужно делать партиями. Что такое лучшая практика?

1 Ответ

5 голосов
/ 02 апреля 2020

Смысл установки автоматической фиксации в false заключается в том, что несколько операторов SQL могут выполняться внутри одной транзакции. И, если что-то go не так с любым из ваших 4 операторов вставки, вся транзакция будет логически откатываться, чтобы вы не столкнулись с противоречивыми данными в вашей базе данных. Лучше всего использовать шаблон, которому вы уже придерживаетесь:

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

То есть рекомендуется возвращать автоматическую фиксацию как истинную после завершения транзакции. Это делается для того, чтобы любая другая часть вашего кода или, возможно, ваш будущий код, если кто-то другой унаследовал его, который все еще использует тот же объект соединения, получит поведение по умолчанию автоматической фиксации, равное true.

...