2016-06-18 3 views
3

Я пытаюсь получить доступ к данным в нескольких базах данных на одном запущенном экземпляре. структуры таблиц этих баз данных одинаковы; Насколько я знаю, создать новую связь с помощью jdbc очень дорого. Но строка подключения jdbc требует формата jdbc:mysql://hostname/ databaseName, который должен указывать конкретную базу данных. Так что мне интересно, есть ли способ запросить данные в нескольких базах данных, используя одно соединение?Как подключить несколько баз данных на одном сервере с JDBC?

Multiple databases on a single running instance

+2

Читайте на http://stackoverflow.com/questions/10593647/how-to-create-multiple-database-connections-for-different-databases-in-java –

ответ

1

Документация MySQL плохо написано на эту тему.

Страница SELECT Syntax ссылается на страницу JOIN Syntax, на которой можно записать имя таблицы, даже если вы не используете предложения JOIN. Страница JOIN Syntax просто говорит tbl_name, не уточняя, что это такое. Существует даже комментарий в нижней части вызова это:

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

Schema Object Names страница ничего не говорит о квалификационных именах, но есть суб-страница под названием Identifier Qualifiers, в котором говорится, что столбец таблицы можно назвать с использованием синтаксиса db_name.tbl_name.col_name. На странице ничего не говорится о возможности ссылаться на таблицы с использованием db_name.tbl_name.

Но, если вы можете обратиться к колонке с использованием db_name.tbl_name.col_name, это будет иметь смысл только, если вы также можете обратиться к таблице с использованием db_name.tbl_name, что означает, что вы можете получить доступ к всем базам данных с помощью одного Connection, если вы в порядке, чтобы квалифицировать имена таблиц в операторах SQL.


Как отметил @MarkRotteveel в комментарии, вы также можете переключить базу данных с помощью метода Connection.setCatalog(String catalog).

Это отражено в MySQL Connector/J 5.1 Developer Guide:

Первоначальная база данных для подключения

Если база данных не указан, то соединение осуществляется с базой данных по умолчанию. В этом случае вызовите метод setCatalog() в экземпляре Connection или полностью укажите имена таблиц, используя имя базы данных (то есть SELECT dbname.tablename.colname FROM dbname.tablename...) в вашем SQL. Открытие соединения без указания используемой базы данных обычно полезно только при создании инструментов, которые работают с несколькими базами данных, например с менеджерами баз данных GUI.

Примечание: Всегда используйте метод Connection.setCatalog() указать нужную базу данных в приложениях JDBC, а не USE database заявления.

+0

Вы также можете переключаться между базами данных с помощью 'Connection.setCatalog (..)'; это может облегчить жизнь в некоторых ситуациях. –

+0

@MarkRotteveel Я не пробовал с MySQL, но вы уверены, что это ['setCatalog()'] (https://docs.oracle.com/javase/7/docs/api/java/sql/Connection.html# setCatalog (java.lang.String)), а не ['setSchema()'] (https://docs.oracle.com/javase/7/docs/api/java/sql/Connection.html#setSchema (java.lang .String))? – Andreas

+0

См. Реализацию: ['ConnectionImpl.setCatalog'] (https://github.com/mysql/mysql-connector-j/blob/release/5.1/src/com/mysql/jdbc/ConnectionImpl.java#L4869) и [ 'ConnectionImpl.setSchema'] (https://github.com/mysql/mysql-connector-j/blob/release/5.1/src/com/mysql/jdbc/ConnectionImpl.java#L5439). См. Также комментарий к 'setSchema', который говорит _", пока мы не перевернем каталог/схему, это не-op "_. Базы данных в MySQL, по-видимому, представляют собой сочетание каталога (хранится отдельно) и схемы (обработка запросов). –

Смежные вопросы