Наше приложение может иметь несколько баз данных. Базы данных могут быть разного типа (Oracle и MS SQL) для одного и того же экземпляра приложения. Структуры баз данных немного отличаются, но используется тот же набор Hibernate POJO. Список баз данных может быть определен только при фактическом запуске приложения (поэтому его нельзя сохранить в виде фиксированного XML).
Пользователь должен выбрать БД во время входа в систему. Выбранная БД хранится в HTTP-сессии.
Поэтому я хотел бы использовать автоматическую проводку Sping, чтобы Session Factory автоматически подключалась к моим DAO в веб-контроллерах в зависимости от текущего пользователя. Нравится:
@Repository
@Transactional
@Controller
public abstract class UserGroupDAO {
@Autowired
@Qualifier("sessionFactory")
private SessionFactory sessionFactory;
public List<Users> getListOfUsers() {
Session session = sessionFactory.currentSession();
return session.createCriteria(Users.class).list();
}
}
@Controller
public class WebController {
@Autowired
@Qualifier("userGroupDAO")
private UserGroupDAO userGroupDAO;
@RequestMapping("/greeting.html")
public ModelAndView greeting(Model model) {
userGroupDAO.getListOfUsers();
}
Например: есть 2 БД - Oracle_DB и MS_SQL_DB и два пользователя A и B. Пользователь A вошел в Oracle_DB, пользователь B вошел в MS_SQL_DB. Когда пользователь A нажимает /greeting, он должен видеть список пользователей из Oracle_DB, когда пользователь B нажимает /greeting - из MS_SQL_DB.
Я просмотрел AbstractRoutingDatasource, но похоже, что он работает только для одной фабрики сеансов с несколькими источниками данных. Однако я ищу индивидуальную фабрику сеансов для каждого источника данных (и диспетчера транзакций тоже).
Заранее спасибо за помощь
Обзор проблемы
Базы данных генерируются динамически, поэтому нельзя жестко запрограммировать настройки базы данных в конфигурационный файл. Приложение Spring должно иметь возможность определять, какие базы данных доступны, а затем подключаться к ним.
multi-tenant
. - person M. Deinum   schedule 09.10.2014