Начало транзакции JDBC - PullRequest
1 голос
/ 02 июля 2011

В JDBC можно сказать, что транзакция начинается, как только мы получаем соединение, и заканчивается как мы закрываем связь. Это правильно? Если да, можем ли мы сказать, В разных запросах обмена одно и то же соединение, даже все незафиксированные транзакции будут видны всем все запросы?

Ответы [ 3 ]

2 голосов
/ 03 июля 2011

@ BalusC - Это не совсем так.По умолчанию для autocommit установлено значение true, что означает, что транзакция начинается перед любой операцией JDBC и заканчивается сразу после этой отдельной операции, а не при закрытии соединения.

Но вы правы, что совместное использование соединения действительно не очень хорошо. Если вы хотите многопоточность вашей БД, лучше всего обрабатывать ее так, как у вас есть пул потоков (ищите ThreadPoolExecutor в java.util.concurrent) и для каждого потока вы получаете отдельное соединение.ConnectionPool также хорош, но я бы предпочел ограничить это через ThreadPool - таким образом, никогда не будет потока, ожидающего соединения из пула.

1 голос
/ 03 июля 2011

Это верно.Это поведение по умолчанию.Вы можете получить этот контроль, установив автоматическую фиксацию на false на connection.setAutoCommit(false) после получения соединения и фиксации транзакции на connection.commit() после выполнения всех запросов.

Однако, совместное использование соединения между различными запросами(темы) уже сам по себе плохой дизайн.Ваше приложение таким образом не потокобезопасно.Вы не хотите разделять одно и то же соединение между разными потоками.Если все, что вам нужно, это исключить стоимость подключения к базе данных, то вам следует рассмотреть возможность использования пула подключений.

0 голосов
/ 03 июля 2011

первое правило при доступе к базе данных.Каждая нетранзакционная операция должна:

1.открыть соединение, если есть пул соединений, то получить соединение из пула 2. Создать оператор выполнения 3. Если это запрос на чтение, отобразить набор результатов.4. закройте набор результатов.5. закройте заявление.6. закройте соединение.

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

Операция 1: 1. getSharedConnection 2.создать / выполнить оператор 3. если естьпрочитайте запрос, затем сопоставьте набор результатов.4. закрыть resultSEt 5. закрыть оператор

операция 2: то же, что и операция 1.

и транзакция:

public void updateInTransaction () {Connection conn = pool.getConnection(); // или вы можете создать новое соединение conn.setAutocommit (false);operation1 (Conn);работы2 (Conn);conn.Close;}

Это просто основы для небольших приложений.Если вы разрабатываете более крупные приложения, вам следует использовать ту же платформу, что и JDBCTemplates из Springsoruce.

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