Pergunta

Grails torna muito fácil para configurar fontes de dados para os diferentes ambientes (desenvolvimento, teste, produção) em suas Fontes de dados.groovy arquivo, mas parece que não há nenhuma facilidade para a configuração de múltiplas fontes de dados em um único ambiente.O que devo fazer se eu precisar acessar vários bancos de dados a partir da mesma aplicação Grails?

Foi útil?

Solução 3

Agora existe plugin para Grails que permite o uso de múltiplas fontes de dados diretamente com Grails' GORM camada:http://burtbeckwith.com/blog/?p=70

Outras dicas

Ao se conectar a diferentes bancos de dados em diferentes classes de domínio é muito fácil Grails 2.x.x.

por exemplo

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 {

    }
}

Você pode usar quaisquer fontes de dados em suas classes de domínio por

class Role{
   static mapping = {
      datasource 'users'
   }
}

 class Product{
    static mapping = {
      datasource 'admin'
   }
 }

Para mais detalhes veja neste

Se o uso do Grails 2.0 ou superior, não é necessário para o plugin, é suportado de forma nativa.

http://www.grails.org/doc/latest/guide/single.html#multipleDatasources

Grails 2.0 pode lidar com várias fontes de dados, sem um plugin:

Exemplo com uma diferente fonte de dados para o desenvolvimento(h2 dataSource) e teste(mysql dataSource_mysql) ambientes:

Fonte de dados.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"
            }
        }
    }
}

Você realmente quer fazer isso?Na minha experiência, o cenário habitual é:

  1. Um aplicativo gerencia seus próprios dados no seu próprio esquema de banco de dados
  2. Muitas vezes, a aplicação vai exigir de dados a partir de outras fontes (por exemplo, para dados de referência não copiado e colado)

Eu normalmente sempre teve o luxo de todos os esquemas que residem em uma instância de banco de dados.Portanto, a minha aplicação:

  • só tem uma conexão de banco de dados, o qual é o esquema que possui e tem acesso de leitura/gravação
  • os outros aplicativos "exportar" seus dados através de pontos de vista
  • minha aplicação tem acesso de leitura para esses pontos de vista, e tem um sinônimo para esse modo de exibição, fazendo parecer locais

A razão por trás do uso de vistas é assim que a aplicação que está a expor os dados

  1. sabe-se explicitamente que ele está sendo exportado e o que está sendo exportada
  2. não expor a estrutura interna do esquema (por isso, se a estrutura interna de alterações, desde que a vista é o correto a consumir aplicativos não sei)

Eu não tinha que fazer isso com uma Pequena aplicação, mas a abordagem deve funcionar.

Outra abordagem para o compartilhamento de dados entre aplicativos é criar um serviço da web para expor os dados.Grails torna isso fácil.

Espero que ajude, mas esta abordagem pode não ser aplicável para todas as situações.

O seguinte post parece ser a melhor fonte de informações sobre o assunto:

Como obter multi-fonte de dados no grails

Resume-se a:

  • Definir datasource1 em DevelopmentDataSource
  • Definir datasource2 em resources.xml
  • Escrever um DAO para CRUD dos objetos de domínio usando datasource2
  • No hibernate.cfg.xml, lista todos os objetos de domínio.

Apenas a primeira fonte de dados terá dinâmico localizador de métodos.

Se a sua realmente uma simples consulta que você está depois e não me importo de não ter o ORM recursos que você pode usar Groovy SQL ou SQL nativo características do Hibernate.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top