0

Для каждого клиента у меня есть отдельные базы данных, но бизнес-логика и таблицы одинаковы для каждого клиента. Я хочу общий сервис и уровень dao для каждого клиента. В dao я выбираю источник данных на основе зарегистрированного пользовательского клиента. В @Transactional, я должен передать bean id менеджера транзакций. Как сделать общий слой обслуживания с аннотацией @Transactional.Несколько менеджеров транзакций весной и выберите один во время выполнения

Тот же вопрос здесь

  1. Multiple transaction managers - Selecting a one at runtime - Spring

  2. Choose between muliple transaction managers at runtime

но никто ответ

+0

на другой ноте, что вы имеете в виду отдельные базы данных, но те же таблицы? Вы имеете в виду, что каждая база данных имеет одну и ту же схему? –

+0

Да..а каждая и каждая база данных имеет одинаковую схему –

+0

Не отвечаю на вопрос, фактически ищем решение для вас, но, кроме того, я действительно не считаю это хорошей идеей иметь отдельные базы данных для каждого клиента, когда схема такая же, почему бы не использовать одну единственную базу данных? что происходит, даже если вы получаете 100 клиентов, что приводит к 100 базам данных, что означает 100 подключений к базе данных для управления. Это ресурсоемкость. –

ответ

0

Если вы хотите создать соединение с базой данных динамически, то есть смотреть по адресу this SO сообщение.

От должности связаны: основном в JDBC большинство из этих свойств не настраивается в API, как это, скорее, они зависят от реализации. Способ JDBC обрабатывает это, позволяя URL-адрес соединения отличаться на одного поставщика .

Так что вы делаете, это зарегистрировать драйвер, так что система JDBC может знать , что делать с URL:

DriverManager.registerDriver((Driver) 
Class.forName("com.mysql.jdbc.Driver").newInstance()); 

Затем вы формируете в URL:

String url = 
"jdbc:mysql://[host][,failoverhost...][:port]/[database][?propertyName1][=propertyValue1][&propertyName2][=propertyValue2]" 

И, наконец, используйте его, чтобы получить ть соединение:

Connection c = DriverManager.getConnection(url); 

Более сложных JDBC, вы ввязываться с пулами соединений и , как и серверами приложений часто имеют свой собственный способ регистрации водителей в JNDI и вы смотрите вверх DataSource оттуда, и позвоните по телефону getConnection.

С точки зрения свойств, поддерживаемых MySQL, см. Здесь (Ссылка мертва).

EDIT: Еще одна мысль, технически просто иметь строку кода, который делает Class.forName («com.mysql.jdbc.Driver») должно быть достаточно, так как класс должен иметь свой собственный статический инициализатор, который регистрирует a , но иногда драйвер JDBC этого не делает, поэтому, если вы не уверены, нет никакого вреда при регистрации второго, он просто создает дублирующий объект в memeory.

Не знаю, будет ли это работать, так как я его не тестировал, но вы могли бы попробовать .

Теперь, что вы можете сделать, используйте аннотацию @Transactional поверх DAO без указания каких-либо значений (это работает). Теперь в ваших классах DAO вместо того, чтобы вставлять какой-либо компонент DataSource, создайте свой собственный источник данных динамически, как указано в приведенной выше ссылке, а затем либо введите эту зависимость во время выполнения, используйте методы установки геттера, либо просто используйте ключевое слово new. Надеюсь, это сработает.

ПРИМЕЧАНИЕ: Я еще не проверял его сам, поэтому, если это работает, сообщите мне об этом.

0

Вам не нужно настраивать и переключаться между несколькими менеджерами транзакций для достижения конечной цели. Вместо этого используйте пружину, снабженную механизмом org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource.

Подробные примеры можно найти здесь:

  1. https://spring.io/blog/2007/01/23/dynamic-datasource-routing/
  2. http://howtodoinjava.com/spring/spring-orm/spring-3-2-5-abstractroutingdatasource-example/
Смежные вопросы