Динамическая настройка источников данных - PullRequest
2 голосов
/ 29 марта 2011

Ситуация такова: таблица, которая используется в запросе (назовите ее SUMMARY), ранее находилась на том же сервере и в базе данных, в которой я выполняю все запросы приложения (назовите ее server1 и DB1). Но недавно таблица SUMMARY была удалена из этой базы данных, что делает необходимым обращение к другим комбинациям сервер / база данных.

Данные из имени сервера и базы данных, которые будут использоваться для доступа к таблице SUMMARY, для этой цели параметризованы в таблице. Эти данные зависят от базы данных, которая подключена, таким образом: например, если я нахожусь в базе данных DB1 сервера server1, то параметры будут равны server21 и DB21, тогда как если кто-то ссылается на параметры из DB5 из параметров server1, то это будет server16. и DB16.

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

Проблема и тема этой записи в том, приходилось ли кому-либо когда-либо динамически конфигурировать источник данных, который будет использоваться в hibernate.properties, поскольку обычно это одно фиксированное значение, и в этом случае следует разрешить изменения в чтобы просмотреть таблицу SUMMARY (используя параметры, полученные моим SQL-запросом) только в этом конкретном случае , тогда как все остальные операции с базой данных должны выполняться с использованием исходных свойств соединения.

То есть: мне нужно динамически генерировать источник данных на основе параметров, поступающих из запроса, поэтому подходы, которые справляются с этим, заранее зная , сколько и каковы возможные соединения должен быть отброшен , потому что они не способны решить мою проблему.

Характеристики приложения:

  • ядро ​​базы данных: SQL Server 2005
  • Prog. Язык: Java 5.0
  • Каркасы: Spring 2.0.4, Hibernate 3.0.5
  • App. Сервер: WAS 6.1

Заранее спасибо всем, кто обладает этими знаниями и хочет поделиться.

Ответы [ 3 ]

1 голос
/ 30 марта 2011

Вы можете использовать ConnectionProvider в спящем режиме, чтобы решить, как получить соединение, которое будет использоваться сеансом. Мы используем что-то подобное в нашем приложении:

    public Connection getConnection() throws SQLException {
        DataSource ds = (DataSource) BeanFactory.getBean("dataSource" + UserInfo.getDSName());
        return ds.getConnection();
}

UserInfo - это класс, который хранит вещи в ThreadLocal. Этот код будет выбирать источник данных из Spring в зависимости от имени, которое было передано в ThreadLocal. Что мы делаем, это устанавливаем имя источника данных, который мы хотим использовать, перед открытием сеанса (реальная логика немного сложнее, чем это, поскольку это зависит от предпочтений пользователя и других вещей).

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

Вы можете проверить javadocs для интерфейса ConnectionProvider. Создайте собственную реализацию, установите свойство hibernate.connection.provider_class в файле конфигурации Hibernate так, чтобы оно указывало на ваш класс, и все готово.

0 голосов
/ 15 апреля 2017

или расширить org.apache.commons.dbcp.BasicDataSource

public class MyDataSource extends BasicDataSource {
private void init() {
    username = ...
    password = ...
    url = ...
}

@Override
protected synchronized DataSource createDataSource() throws SQLException {
    init();
    return super.createDataSource();
}
}
0 голосов
/ 29 марта 2011

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

...