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?

¿Fue útil?

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'
   }
 }

Para más detalles mira esto

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:

  1. Una aplicación gestiona sus propios datos en su propio esquema de base de datos.
  2. 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

  1. sabe explícitamente que se está exportando y qué se está exportando
  2. 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top