JDBC - Соедините несколько баз данных

Я работаю над приложением, где я должен соединить количество N систем баз данных [N диапазоны любой где между 1 - 350].

Идея - пользователю подарят список баз данных и попросят выбрать любые из баз данных из списка.

После того как базы данных выбраны, я должен соединиться с каждой базой данных и выполнить хранимую процедуру.

Я планирую использовать простой JDBC и получить соединение для каждого из них один время [или путем выполнения их в нескольких потоках] и выполнить процедуру хранилища и закрыть соединение.

И все это должно произойти в транзакции. Что лучший способ состоит в том, чтобы сделать это?

Если не JDBC... какой-либо другой эффективный путь?

Обновление -

Хранимая процедура на самом деле вовлечена в выполнение некоторого sql - например, обновление столбца, дайте разрешение для пользователя и т.д.

10
задан jagamot 6 August 2010 в 21:53
поделиться

3 ответа

Я бы создал пул потоков с разумным максимальным количеством потоков, от десяти до двадцати потоков, возможно, с помощью Executors # newFixedThreadPool () и вызвал бы отдельное соединение с БД и выполнение задач SP, каждая как a Callable с использованием ExecutorService # invokeAll () . Вы хотели бы поиграть с количеством потоков и профилем, которые в конце концов дают наилучшую производительность.

Каждая реализация Callable должна принимать сведения о соединении и имя SP в качестве аргумента конструктора, чтобы вы могли повторно использовать одну и ту же реализацию для разных вызовов БД.


Обновление : хорошо, это веб-приложение. Вы не хотите тратить зря нити. Если предполагается, что он будет использоваться одним одновременным пользователем, то вам действительно следует убедиться, что пул потоков правильно завершен в конце запроса или на самом высоком конце сеанса. Но если предполагается, что он будет использоваться несколькими одновременными пользователями, то вы хотите поделиться пулом потоков в области приложения. Также здесь вам нужно убедиться, что он правильно завершает работу при завершении работы веб-приложения. Здесь может быть полезен ServletContextListener .

3
ответ дан 4 December 2019 в 03:15
поделиться

Как Даффимо указал в своем комментарии, вы сможете выполнять транзакции в нескольких базах данных, только если у вас есть координатор транзакций и двухфазная фиксация.

Для этого вам понадобится стек J2EE, который будет обрабатывать JTA. Если вы работаете в Tomcat или другом контейнере без JTA, вы можете загрузить и установить несколько вариантов.

Конечно, вам нужно будет позволить Контейнеру, а не базе данных / хранимой процедуре обрабатывать фиксации и откаты транзакции.

1
ответ дан 4 December 2019 в 03:15
поделиться

Это звучит вроде большой бардак, но это твоя проблема.

Вам нужен один пул соединений для каждой базы данных. Я бы не советовал вам самостоятельно управлять жизненным циклом подключения. Пусть сервер приложений сделает это за вас.

Если вы хотите, чтобы группа баз данных участвовала в одной большой транзакции, вам придется использовать драйверы JDBC XA для всех из них. Вам также понадобится менеджер транзакций JTA, который будет контролировать транзакцию за вас.

Хранимые процедуры не могут содержать никакой логики для обработки транзакций; вы должны позволить JTA сделать это.

Вы не говорите, что делает хранимая процедура. Если ничего не нужно возвращать, альтернативным вариантом может быть JMS, очередь и пул слушателей. На вашем месте я бы побеспокоился о потоках. Я бы нашел способ позволить контейнеру делать за меня все эти сложные вещи, если бы мог.

0
ответ дан 4 December 2019 в 03:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: