Что происходит именно тогда, когда мы совершаем? - PullRequest
0 голосов
/ 27 февраля 2019

Я пытаюсь понять, что именно происходит, когда мы фиксируем

Connection conn=new Connection();
conn.setAutoCommit(false);
PreparedStatement ps=connection.prepareStaement("insert statement 1");
ps.executeUpdate();
PreparedStatement ps2=connection.prepareStaement("insert statement 2");
ps2.executeUpdate();
conn.commit();
conn.close();

Как эти 2 подготовленных оператора достигнут базы данных?

Будут ли они объединены в один вызов базы данных?Или они будут вставлены отдельно?У меня сложилось впечатление, что они будут по одному звонку в базу данных.База данных получает что-то вроде:

START TRANSACTION
insert statement 1
insert statement 2
COMMIT

Кроме того, чем предыдущий отличается от этого, сколько вызовов происходит на этом:

Connection conn=new Connection();
conn.setAutoCommit(false);
PreparedStatement ps=connection.prepareStaement("insert statement ?");
ps.setString(1,"1");
ps.addBatch();
ps.setString(1,"2");
ps.addBatch();
ps.executeBatch();
conn.commit();
conn.close();

1 Ответ

0 голосов
/ 27 февраля 2019

Помимо подключения / отключения, в первом сценарии есть 5 вызовов базы данных (подготовка, выполнение, подготовка, выполнение, принятие) и 3 во втором (подготовка, выполнение, принятие).На самом деле это немного предвзято: для того, чтобы примеры были сопоставимыми, вам нужно было бы выполнить один и тот же оператор дважды в первом сценарии, следовательно, сохранить одну подготовку.Кроме того, как прокомментировал Andreas , некоторые драйверы могут не выполнять вызов базы данных для подготовки и вместо этого объединять его с первым выполнением.

В любом случае, концептуально, на меньшевызов базы данных во втором сценарии , чем в первом.

Транзакции являются серверной функциональностью.При использовании транзакций изменения в базе данных видны только сеансу, который их выполняет.Когда вызывается COMMIT, они становятся постоянными и видимыми для других пользователей.С другой стороны, сеанс-владелец может выбрать ROLLBACK, что в основном означает: я окончательно отказываюсь от изменений, которые я сделал со времени моего последнего COMMIT.Вы можете видеть, что каждый из ваших фрагментов кода происходит в одной транзакции базы данных.С этой точки зрения они ничем не отличаются.

Каждый вызов от клиента к серверу требует одну обратную передачу по сети, что может быть дорогостоящим при выполнении множества небольших операций (скажем, куча INSERT с).Именно здесь вступают в игру партии : они позволяют выполнять несколько операций за один вызов базы данных.В связи с этим второй фрагмент кода может масштабироваться лучше, поскольку он всегда будет выполнять одинаковое количество вызовов базы данных независимо от количества обрабатываемых записей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...