Как вы получаете доступ к двум базам данных в Grails
-
09-06-2019 - |
Вопрос
Grails позволяет очень легко настраивать источники данных для различных сред (разработка, тестирование, производство) в своем файле DataSources.groovy, но, похоже, нет возможности настроить несколько источников данных в одной среде.Что мне делать, если мне нужно получить доступ к нескольким базам данных из одного приложения Grails?
Решение 3
Теперь есть плагин Grails, который позволяет использовать несколько источников данных непосредственно со слоем GORM Grails: http://burtbeckwith.com/blog/?p=70
Другие советы
Соединить разные базы данных в разных классах домена очень просто в Grails 2.x.x.
например
development {
dataSource {//DEFAULT data source
.
.
}
dataSource_admin { //Convention is dataSource_name
url = "//db url"
driverClassName = "oracle.jdbc.driver.OracleDriver"
username = "test"
password = 'test123'
}
dataSource_users {
}
}
Вы можете использовать любые источники данных в классах своего домена с помощью
class Role{
static mapping = {
datasource 'users'
}
}
class Product{
static mapping = {
datasource 'admin'
}
}
Если используется Grails 2.0 или выше, плагин не нужен, он поддерживается изначально.
http://www.grails.org/doc/latest/ руководство / single.html # multipleDatasources
Grails 2.0 может обрабатывать несколько источников данных без плагина:
Пример с другим источником данных для сред разработки (h2 DataSource) и тестирования (mysql dataSource_mysql):
Источник данных.groovy:
dataSource {
pooled = true
driverClassName = "org.h2.Driver"
username = "sa"
password = ""
}
dataSource_mysql {
dialect = org.hibernate.dialect.MySQLInnoDBDialect
driverClassName = 'com.mysql.jdbc.Driver'
username = "user"
password = "pass"
url = "jdbc:mysql://mysqldb.com/DBNAME"
}
hibernate {
cache.use_second_level_cache = true
cache.use_query_cache = false
cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory'
}
// environment specific settings
environments {
development {
dataSource {
configClass = HibernateFilterDomainConfiguration.class
dbCreate = "update" // one of 'create', 'create-drop', 'update', 'validate', ''
url = "jdbc:h2:file:../devDb;MVCC=TRUE"
sqlLogging = true
}
}
test {
dataSource_mysql {
configClass = HibernateFilterDomainConfiguration.class
dbCreate = "create" // one of 'create', 'create-drop', 'update', 'validate', ''
sqlLogging = true
}
}
production {
dataSource {
dbCreate = "update"
url = "jdbc:h2:prodDb;MVCC=TRUE;LOCK_TIMEOUT=10000"
pooled = true
properties {
maxActive = -1
minEvictableIdleTimeMillis=1800000
timeBetweenEvictionRunsMillis=1800000
numTestsPerEvictionRun=3
testOnBorrow=true
testWhileIdle=true
testOnReturn=true
validationQuery="SELECT 1"
}
}
}
}
Ты действительно хочешь это сделать?По моему опыту, обычным сценарием здесь является:
- Приложение управляет своими собственными данными в своей собственной схеме базы данных
- Часто приложению требуются данные из других источников (например, чтобы справочные данные не копировались и не вставлялись).
Обычно у меня всегда была роскошь иметь все схемы, размещенные в одном экземпляре базы данных.Поэтому мое заявление:
- имеет только одно подключение к базе данных - к схеме, которой он владеет, и имеет доступ на чтение / запись
- другие приложения "экспортируют" свои данные с помощью представлений
- мое приложение имеет доступ на чтение к этим представлениям и имеет синоним для этого представления, что делает его локальным
Причина использования представлений заключается в том, что приложение, предоставляющее доступ к данным
- явно знает, что он экспортируется и что экспортируется
- не раскрывает внутреннюю структуру схемы (поэтому, если внутренняя структура изменяется, пока представление правильное, приложения-потребители не знают)
На самом деле мне не приходилось делать это с приложением Grails, но этот подход должен сработать.
Другой подход к совместному использованию данных между приложениями заключается в создании веб-службы для предоставления доступа к данным.Grails упрощает это.
Надеюсь, это поможет, но такой подход может быть применим не ко всем ситуациям.
Следующий пост, по-видимому, является лучшим источником информации по этому вопросу:
Как получить mutli-источник данных в grails
Это сводится к следующему:
- Определите datasource1 в DevelopmentDataSource
- Определите datasource2 в resources.xml
- Напишите DAO для CRUD объектов домена, используя datasource2
- В поле hibernate.cfg.xml перечислите все объекты домена.
Только первый источник данных будет иметь методы динамического поиска.
Если вам нужен действительно простой запрос, и вы не возражаете против отсутствия функций ORM, вы могли бы использовать Groovy SQL или собственные функции SQL Hibernate.