Projeto usando duas bases de dados
15/04/2016 14:28
0
Boa tarde,

Estou com uma duvida que é o seguinte, preciso desenvolver um projeto onde o mesmo vai ter o seu banco de dados normal em SQLServer mas em uma determinada parte do sistema eu preciso consultar algumas informações no banco de dados do legado que é um ERP, em projetos antigos eu faço essa consulta via JDBC pois o banco disponibiliza de um driver para esse fim, minha duvida é como eu faria para fazer o grails ler essas informações do banco legado, lembrando que é somente alguns campos de uma tabela gigante.

Teria como eu fazer essa consultar somente com os campos que eu precisava ou vou ter que fazer todo o mapeamento da base do sistema legado?
Tags: Grails


0
Olá Danilo,
  eu tenho situação semelhante aqui, onde tenho meu projeto desenvolvido com tabelas em um banco Postgres, porém acessando um ERP em Firebird.
Para tanto configuro o meu DataSource.groovy da seguinte forma:

hibernate {
cache.use_second_level_cache = true
cache.use_query_cache = true
cache.region.factory_class = 'org.hibernate.cache.ehcache.EhCacheRegionFactory' // Hibernate 4
singleSession = true // configure OSIV singleSession mode
flush.mode = 'manual' // OSIV session flush mode outside of transactional context
}

// environment specific settings
environments {
 
production {
 
  dataSource {
dbCreate = "update"
driverClassName = "org.postgresql.Driver"
dialect = "org.hibernate.dialect.PostgreSQLDialect"
url = "jdbc:postgresql://127.0.0.1:5432/dwdev"
username = "hgsoft"
password = "*****"
pooled = true
properties {
maxActive = -1
minEvictableIdleTimeMillis=1800000
timeBetweenEvictionRunsMillis=1800000
numTestsPerEvictionRun=3
testOnBorrow=true
testWhileIdle=true
testOnReturn=true
validationQuery="SELECT 1"
}
  }

  dataSource_erp {
dbCreate = "none"
driverClassName = "org.firebirdsql.jdbc.FBDriver"
dialect = "org.hibernate.dialect.FirebirdDialect"
cache.provider_class = 'org.firebirdsql.pool.FBSimpleDataSource'
url = "jdbc:firebirdsql://10.1.1.202:4732/C:/data/ERP.FDB?encoding=ISO8859_1"

pooled = true
username = "sysdba"
password = "*********"
properties {
maxActive = -1
minEvictableIdleTimeMillis=1800000
timeBetweenEvictionRunsMillis=1800000
numTestsPerEvictionRun=3
testOnBorrow=true
testWhileIdle=true
testOnReturn=true
//jmxExport = true
validationQuery="SELECT 1"
  }
  }
 
}
 
development {
 
 
  dataSource {
dbCreate = "create-drop"
driverClassName = "org.postgresql.Driver"
dialect = "org.hibernate.dialect.PostgreSQLDialect"
url = "jdbc:postgresql://127.0.0.1:5432/dw"
username = "hgsoft"
password = "******"
pooled = true
properties {
maxActive = -1
minEvictableIdleTimeMillis=1800000
timeBetweenEvictionRunsMillis=1800000
numTestsPerEvictionRun=3
testOnBorrow=true
testWhileIdle=true
testOnReturn=true
validationQuery="SELECT 1"
}
  }
  dataSource_erp {
dbCreate = "none"
driverClassName = "org.firebirdsql.jdbc.FBDriver"
dialect = "org.hibernate.dialect.FirebirdDialect"
cache.provider_class = 'org.firebirdsql.pool.FBSimpleDataSource'
url = "jdbc:firebirdsql://localhost:3050//opt/data/ERPPro.fdb?encoding=ISO8859_1"
pooled = true
username = "sysdba"
password = "********"
properties {

maxActive = -1
minEvictableIdleTimeMillis=1800000
timeBetweenEvictionRunsMillis=1800000
numTestsPerEvictionRun=3
testOnBorrow=true
testWhileIdle=true
testOnReturn=true
//jmxExport = true
validationQuery="SELECT 1"
  }
  }

}
}


Depois para utilizar este datasource em sua classe você o referencia em static mapping. Como abaixo...

    static mapping = {

  datasource 'erp'
  table 'ECADPLANOFIN'
  version false
  id column: "CDCONTA"
  nmconta column:"NMCONTA"
  tpconta column:"TPCONTA"
  flredutora column:"FLREDUTORA"
  flativa column:"FLATIVA"
  fladiantamento column:"FLADIANTAMENTO"
  flimposto column:"FLIMPOSTO"
  cdnivel column:"CDNIVEL"
}

Neste caso já pode também ir mapeando os campos da tabela do seu ERP. Ou ainda, pode primeiramente preparar views dentro da base do ERP e usá-las, caso não queira ter o trabalho de fazer isso na definição da classe pelo mapping.

Obs.: Estou usando a versão 2.4.4 do Grails.
19/04/2016 00:15


1
Ah, repare que o dbcreate está none na definição do datasource do ERP, pois não quero alterar nada no ambiente, apenas consultar.
dataSource_erp {            
dbCreate = "none"
19/04/2016 00:17


1
@Alexsandro, bom dia!

Bacana, então vou usar o mapping para mapear as colunas do ERP, mas eu tenho que mapear todas colunas da tabela do ERP ou posso somente mapear as que eu preciso? E como eu faço para depois eu falar para o grails quando pesquisar na base do ERP e quando consultar na base própria do sistema em grails?

Por exemplo, eu vou criar dois objetos no grails onde esses dois objetos vai armazenar as informações do ERP e eles vão ser alimentados em apenas uma function, pois vou consultar uma informação em uma tabela e depois pegar os outros registros em outra pela chave primaria e com o resultado vou alimentar esses objetos, depois disso meu programa vai seguir normalmente apenas com o banco desenvolvido por mim.
19/04/2016 09:14


1
Então @Danilo Martins,
  se vai apenas ler do ERP então possivelmente só precise mapear os campos que te interessam. Agora se vai salvar dados de volta para dentro dele, daí deve precisar especificar pelo menos todos os não nulos. E neste caso de gravar de volta para o ERP tem que ter um cuidado adicional para não alterar a estrutura original destas tabelas por acidente.

Na prática você terá uma classe para a tabela do ERP e outra para o seu sistema.
Na classe do ERP você define a propriedade
datasource 'erp'
dentro do mapping, como no exemplo acima. Daí você faz a lógica para gravar em ambas as classes, que assim estará gravando nos dois sistemas.

Se for somente consulta no ERP funciona da mesma forma. Basta estar com a classe definida e mapeada para o datasource correto.
19/04/2016 10:30


0
Olá @Alessandro Haag

Se vocês me permitem, gostaria de colocar mais lenha nesta fogueira que é bem interessante.

Suponha que tenhamos uma tabela T1 que tem um histórico qualquer vinculado (hasMany historico). Pergunto:

Seria possível ter um banco de dados só para armazenar os dados históricos, mas mesmo assim manter o relacionamento (belongsTo, HasMany)?

Indo mais longe ainda, seria possível uma tabela ser criada num banco, mas a sua classe estender uma classe do outro banco?

Obrigado!
08/05/2016 19:03



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto