подключение к нескольким базам данных с использованием разных драйверов JDBC - PullRequest
3 голосов
/ 18 июня 2011

У меня есть требование написать Java-процесс на основе демона (не на основе веб-интерфейса), который будет подключаться к базе данных Oracle 10G, считывать некоторые данные из нее, а затем подключаться к базе данных SQL Server и записывать данные в таблицу.

Звучит достаточно просто, но у меня есть пара вопросов по этому поводу.

  • мне понадобятся два драйвера jdbc, то есть один для подключения к базе данных Oracle, а другой для подключения к базе данных сервера sql. Драйвер jdbc сервера sql является драйвером jtds jdbc (http://jtds.sourceforge.net/), и для Oracle я буду использовать стандартный драйвер jracle jdbc. Могу ли я столкнуться с какими-либо проблемами с обоими драйверами, доступными в classpath вместе?

  • Я предполагаю, что все, что мне нужно, это класс ConnectionManager для управления соединениями и клиентский класс DAO, который будет вызывать соответствующий метод для получения необходимого соединения в зависимости от того, читает ли он из Oracle или пишет в SQL Сервер. Это разумный подход или есть лучший дизайн / шаблон для этого?

EDIT

Хорошо, я попытался собрать быстрое дизайнерское решение. Смотрите изображение ниже

image

Проблема, которую, я думаю, у меня возникает, это как совершить. Вот поток обработки

  • InvoiceBD получает соединение Oracle из класса фабрики и вызывает InvoiceUploadDAO.readData, передавая ему объект соединения Oracle.
  • InvoiceBD получает соединение SQL Server от фабричного класса и вызывает InvoiceUploadDAO.writeData, передавая ему объект соединения SQL Server.
  • InvoiceBD повторно использует соединение Oracle для вызова состояния InvoiceUploadDAO.update до состояния «Завершено» в базе данных Oracle.

InvoiceBD фиксирует соединение с Oracle. InvoiceBD фиксирует соединение с SQL Server.

Или, если что-то идет не так, оба объекта соединения откатываются.

Это звучит примерно так?

Спасибо

Ответы [ 2 ]

4 голосов
/ 18 июня 2011

Могу ли я столкнуться с какими-либо проблемами с обоими драйверами, доступными в classpath вместе?

Вряд ли. Метод DriverManager.getConnection фактически делегирует построение соединения всем зарегистрированным в нем драйверам. Только драйверы, которые распознают протоколы в URL JDBC, будут возвращать соединение. Спецификация JDBC гласит:

Когда DriverManager пытается установить соединение, это вызывает метод подключения водителя и передает Драйвер URL. Если Driver реализация понимает URL, это вернет объект Connection; в противном случае возвращается null.

...

Формат URL JDBC:

jdbc:<subprotocol>:<subname>

В случае как jTDS, так и Oracle (тонкого) драйвера, форматы протокола различны, и, следовательно, у вас никогда не возникнет проблемы. Однако не забывайте размещать более одной версии одного и того же драйвера.

Это разумный подход или есть лучший дизайн / шаблон для этого?

Вы ищете DataSource. Источники данных были бы доступны в среде Java EE, а не в приложениях Java SE. Однако вы можете создать свой собственный DataSource или аналогичный класс; вам не нужно реализовывать сам интерфейс DataSource, но вы можете сделать что-то подобное. В вашем контексте ваш ConnectionManager класс возьмет на себя роль источника данных, возможно, приняв параметр, который определяет, к какой базе данных подключаться; вы можете подумать об использовании пула соединений, если он вам нужен (маловероятно, если вам нужно только одно соединение с базой данных).

Вы также можете принять подход @ duffymo к созданию классов DAO, хотя он лучше подходит для ситуации, когда запросы SQL отличаются.

3 голосов
/ 18 июня 2011
  1. Нет проблем с обоими драйверами в classpath. Возможно, вы захотите подумать об использовании драйверов XA для обоих, если вам нужно, чтобы чтение и запись были одной транзакцией. Если вам когда-либо понадобится двухфазная фиксация, вам понадобятся драйверы XA для обоих.
  2. Вам понадобятся два экземпляра DAO, один для чтения Oracle и другой для записи SQL Server.
...