Como é que você acessar duas bases de dados em Grails
-
09-06-2019 - |
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?
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'
}
}
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 é:
- Um aplicativo gerencia seus próprios dados no seu próprio esquema de banco de dados
- 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
- sabe-se explicitamente que ele está sendo exportado e o que está sendo exportada
- 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.