Lauro Becker

Java, Grails and other great things

Tag Archives: java

Grails: DataSource em arquivo properties

Você desenvolveu um produto em Grails para somente um cliente e configurou a conexão com o banco de dados no arquivo DataSource.groovy, de acordo com os ambientes de desenvolvimento, teste e produção. Implantou o sistema e tudo funciona perfeitamente.

Certo dia seu cliente liga dizendo que está melhorando a infra-estrutura da empresa e decide trocar o banco de dados para outro servidor. Você, naturalmente, altera o arquivo DataSource.groovy, empacota a aplicação e atualiza no cliente.

Na outra semana esse servidor novo queima, e é necessário restaurar o backup (que certamente seu cliente faz periodicamente) para outro servidor. Lá vai você de novo. Abre sua IDE de desenvolvimento, altera a configuração para o novo IP, empacota a aplicação e atualiza.

Como seu produto é de qualidade, você arranja outro cliente. Ele, obviamente, possui suas próprias configurações de banco de dados (talvez até outro SGBD, o que não é problema utilizando GORM). E agora, como lidar com essas duas configurações? Criar um branch feio no seu sistema de controle de versão e, cada vez que o cliente alterar a senha do banco de dados, p. ex., você terá que empacotar e atualizar novamente? Seria, no mínimo, tedioso.

Então você tem a brilhante e original idéia de deixar as configurações de DB em um arquivo externo! Somente altera as configurações e, com um restart da aplicação e um pouco de sorte, ela sairá rodando normalmente.

“Legal! Como eu faço isso? Se fosse com JDBC eu simplesmente carregaria um arquivo properties de algum lugar e utilizaria essas informações para abrir a conexão. Mas é Grails e eu não faço a mínima idéia de como começar.”

Confesso que perdi um bom tempo até encontrar uma forma de fazer isso. E a solução é simples, com alguns pequenos detalhes que devem ser levados em consideração.

Crie um arquivo chamado datasources.properties em grails-app/conf e coloque o seguinte conteúdo:

dataSource.username=usuario
dataSource.password=senha
dataSource.url=url de conexão

Adicione a seguinte linha em Config.groovy:

grails.config.locations = [ "classpath:datasources.properties" ]

Abra o arquivo DataSource.groovy e deixe similar a esse:

dataSource {
    pooled = true
    driverClassName = "driver do seu banco de dados"
}
hibernate {
    cache.use_second_level_cache = true
    cache.use_query_cache = true
    cache.provider_class = 'net.sf.ehcache.hibernate.EhCacheProvider'
}

//environment specific settings
environments {
	development {
		dataSource {
		  url = "override in datasources.properties"
	          username = "override in datasources.properties"
	          password = "override in datasources.properties"
		}
	}
	test {
		dataSource {
		  url = "override in datasources.properties"
	          username = "override in datasources.properties"
	          password = "override in datasources.properties"
		}
	}
	production {
		dataSource {
		  url = "override in datasources.properties"
	          username = "override in datasources.properties"
	          password = "override in datasources.properties"
		}
	}
}

“Ãh?? O que é esse ‘override in datasources.properties’??” Já vai ficar claro. Não perca o foco :P. Continue lendo…

Execute um grails clean e suba a aplicação. Provavelmente você verá um erro dizendo que não foi possível encontrar a URL “override in datasources.properties”. Suba a aplicação de novo e, desta vez, tenha um pouco mais de fé.

TA-DAAA!

Mas o que aconteceu aí? Uma breve explicação: No ambiente de desenvolvimento, rodando com o script run-app, na primeira vez que você sobe por algum motivo o Grails não reconhece a configuração externa. Creio que seja um bug e deverá ser resolvido nas próximas versões. Na segunda vez ele reconhece o arquivo de properties e carrega de lá as informações.

Quando você for rodar em produção, fazendo deploy no Tomcat, p. ex., o arquivo properties será reconhecido de cara.

Conclusão: Não é a solução mais elegante. Aliás, falta muito para isso. Mas você precisava urgentemente disso para não continuar naquela rotina entediante de atualizações, lembra? 😀

Uma solução muito melhor seria utilizando JNDI. Se quiser saber mais, dá uma conferida no blog do Lucas Teixeira.

Mais sobre configurações externas: http://grails.org/doc/latest/guide/3.%20Configuration.html#3.4 Externalized Configuration

Advertisements