Grails - переключение источников данных в зависимости от пользователя

Мы разрабатываем веб-приложение Grails, в котором разных пользователей (клиентов) нужно указывать на разные базы данных, содержащие только данные их организации. К сожалению, разделение баз данных является обязательным, и нас просят иметь только 1 веб-приложение для всех.

Однако Grails ожидает, что только один пул источников данных будет подключаться к одной базе данных.

Мы хотим иметь возможность переключать подключения к базе данных для каждого сеанса в зависимости от пользователя, который вошел в систему, где различные подключения считываются из файлов свойств во время инициализации BootStrap ().

До сих пор нам не удалось найти решение, которое, похоже, не имеет условий гонки, нет плагина, который мы можем найти, и, похоже, это не является популярной проблемой.

Нашим наиболее многообещающим было создание настраиваемого динамического источника данных, настроенного в Bootstrap для определения карты организации-> dataSource, и использование закрытия, определенного в Bootstrap, для поиска соответствующего источника данных перед поведением GORM, но это, похоже, вызывает состояние гонки, когда есть это задержка.

Есть ли у кого-нибудь идеи, как это переключение законно может быть выполнено?

Спасибо


person Adam Vainder    schedule 25.11.2013    source источник


Ответы (2)


В вашем вопросе неясно, развертываете ли вы свое приложение один раз и пытаетесь настроить DataSource, используемый пользователем, или вы просто хотите настроить путем развертывания.

Если это только для каждого развертывания, Grails позволяет вам перенести конфигурацию во внешнюю среду. Вы можете установить это для использования файла в пути к классам или в статическом месте.

person Community    schedule 25.11.2013
comment
Привет, Серджио. Мы не хотим настраивать развертыванием. Мы хотим иметь несколько источников данных в одном развертывании и иметь возможность динамически переключаться на любой из них при вызове веб-службы для базы данных, связанной с организацией пользователя, который делает запрос. Приложение представляет собой JS / GSP, взаимодействующее с веб-службами на основе Grails, и веб-службы будут знать информацию о пользователях, включая организацию, к которой они принадлежат. - person Adam Vainder; 26.11.2013
comment
Хм, это может быть то, что я не знал, что мы можем сделать ... так что, если у нас есть 2 источника данных customer1 и customer2, мы могли бы вызвать ZipCode.customer2.get (42), и он будет использовать источник данных customer2? Я правильно понимаю? - person Adam Vainder; 26.11.2013
comment
Да, вы можете вызвать ZipCode.customer2.get (). необходим, когда вы интерпретируете переменную. - person ; 26.11.2013
comment
Интересно. Это может быть самый простой подход, если мы сможем создавать источники данных динамически. Позвольте мне попробовать и посмотреть, сможем ли мы заставить его работать. - person Adam Vainder; 26.11.2013
comment
Серджио, предполагая, что у меня есть объект домена Emp, два настроенных источника данных и передаю String в метод, который фактически вызывает метод объекта домена с именем dataSourceName, когда я пытаюсь Emp. $ DataSourceName.list () я получаю ошибку компиляции Fatal при применении преобразований запроса произошла ошибка: null. Когда я пробую Emp. '$ DataSourceName'.list (), он компилируется, но во время выполнения я получаю сообщение об отсутствии свойства $ dataSourceName для класса Emp. Я также пробовал использовать {} вокруг dataSourceName с аналогичными результатами. Что я делаю не так? - person Adam Vainder; 26.11.2013
comment
Неважно, что ... тест работает. Интересно, что согласно [stackoverflow.com/questions/10534238/ Мне пришлось использовать def e = Emp.class e. $ DataSourceName.list (), чтобы он заработал! Я собираюсь посмотреть, насколько далеко мы сможем это сделать, спасибо за ваш вклад. - person Adam Vainder; 26.11.2013

Учитывая, что Grails построен на Spring, лучше всего разработать собственный разрешаемый источник данных.

  1. Динамическая маршрутизация источников данных
  2. Пример маршрутизации источника данных
person Joshua Moore    schedule 25.11.2013
comment
Привет, Джошуа, спасибо, я передам это, и мы взглянем на него. Если такое решение может быть интегрировано с GORM, оно может сработать. - person Adam Vainder; 26.11.2013
comment
Мы использовали очень похожий подход с Grails 1.2.x, и единственная проблема, с которой мы столкнулись с GORM, заключалась в том, что нам приходилось выполнять миграцию базы данных самостоятельно из-за того, как мы разрешали источник данных (аналогично тому, как это делается для каждого пользователя / компании). - person Joshua Moore; 26.11.2013
comment
Хммм ладно. Другой разработчик, работавший над этой проблемой, сказал мне, что он пробовал аналогичный подход, но он не сработал. Я лично постараюсь это адаптировать со временем. - person Adam Vainder; 26.11.2013
comment
Так наконец-то это сработало для вас? Мне нужно будет сделать что-то подобное - person Houcem Berrayana; 08.01.2014