¿Cómo se accede a dos bases de datos en Grails?
-
09-06-2019 - |
Pregunta
Grails hace que sea muy fácil configurar fuentes de datos para diferentes entornos (desarrollo, prueba, producción) en su archivo DataSources.groovy, pero parece no haber ninguna posibilidad de configurar múltiples fuentes de datos en un entorno.¿Qué hago si necesito acceder a varias bases de datos desde la misma aplicación Grails?
Solución 3
Ahora existe un complemento de Grails que permite el uso de múltiples fuentes de datos directamente con la capa GORM de Grails:http://burtbeckwith.com/blog/?p=70
Otros consejos
Conectar diferentes bases de datos en diferentes clases de dominio es muy fácil en Grails 2.x.x.
Por ejemplo
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 {
}
}
Puede utilizar cualquier fuente de datos en sus clases de dominio al
class Role{
static mapping = {
datasource 'users'
}
}
class Product{
static mapping = {
datasource 'admin'
}
}
Si usa Grails 2.0 o superior, no es necesario el complemento, es compatible de forma nativa.
http://www.grails.org/doc/latest/guide/single.html#multipleDatasources
Grails 2.0 puede manejar múltiples fuentes de datos sin un complemento:
Ejemplo con una fuente de datos diferente para los entornos dev(h2 dataSource) y test(mysql dataSource_mysql):
Fuente de datos.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"
}
}
}
}
¿Realmente quieres hacer esto?En mi experiencia, el escenario habitual aquí es:
- Una aplicación gestiona sus propios datos en su propio esquema de base de datos.
- A menudo, la aplicación requerirá datos de otras fuentes (por ejemplo, para que los datos de referencia no se copien y peguen).
Normalmente siempre he tenido el lujo de que todos los esquemas residan en una única instancia de base de datos.Por lo tanto, mi aplicación:
- solo tiene una conexión de base de datos, que es al esquema que posee y tiene acceso de lectura/escritura
- las otras aplicaciones 'exportan' sus datos a través de vistas
- mi aplicación tiene acceso de lectura a esas vistas y tiene un sinónimo para esa vista que la hace parecer local
La razón detrás del uso de vistas es para que la aplicación que expone los datos
- sabe explícitamente que se está exportando y qué se está exportando
- no expone la estructura interna del esquema (por lo tanto, si la estructura interna cambia, siempre que la vista sea correcta, las aplicaciones consumidoras no lo sabrán)
En realidad, no he tenido que hacer esto con una aplicación Grails, pero el enfoque debería funcionar.
Otro enfoque para compartir datos entre aplicaciones es crear un servicio web para exponer los datos.Grails lo hace fácil.
Espero que ayude, pero es posible que este enfoque no sea aplicable a todas las situaciones.
La siguiente publicación parece ser la mejor fuente de información sobre el tema:
Cómo obtener mutli-dataSource en griales
Se reduce a:
- Definir fuente de datos1 en DevelopmentDataSource
- Definir fuente de datos2 en resources.xml
- Escriba un DAO para CRUD de los objetos del dominio usando datasource2
- En hibernate.cfg.xml, enumere todos los objetos del dominio.
Sólo la primera fuente de datos tendrá métodos de búsqueda dinámica.
Si lo que busca es una consulta realmente simple y no le importa no tener las funciones ORM, puede usar Groovy SQL o las funciones SQL nativas de Hibernate.