{"id":922,"date":"2011-01-22T16:55:47","date_gmt":"2011-01-22T19:55:47","guid":{"rendered":"https:\/\/devkico.itexto.com.br\/?p=922"},"modified":"2011-01-22T16:57:06","modified_gmt":"2011-01-22T19:57:06","slug":"grails-aspectos-interessantes-na-configuracao-do-bd","status":"publish","type":"post","link":"https:\/\/devkico.itexto.com.br\/?p=922","title":{"rendered":"Grails: aspectos interessantes na configura\u00e7\u00e3o de acesso a dados"},"content":{"rendered":"<p><a href=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/02\/grails_logo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-604\" style=\"margin: 10px;\" title=\"grails_logo\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/02\/grails_logo.png\" alt=\"\" width=\"163\" height=\"43\" \/><\/a>Em diversas aplica\u00e7\u00f5es que trabalhei, o \u00fanico arquivo de configura\u00e7\u00e3o que precisamos alterar \u00e9 o DataSources.groovy. E sabe o que \u00e9 mais interessante neste componente do framework? <strong>\u00c9 um arquivo de configura\u00e7\u00e3o vivo!<\/strong><\/p>\n<p><a href=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2011\/01\/FRANKENG.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-923\" title=\"FRANKENG\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2011\/01\/FRANKENG.jpg\" alt=\"\" width=\"222\" height=\"165\" \/><\/a>Grails sempre me surpreende, at\u00e9 em sua configura\u00e7\u00e3o b\u00e1sica. Por\u00e9m, antes de mostrar alguns aspectos pouco conhecidos deste arquivo, vou come\u00e7ar pelo b\u00e1sico.<\/p>\n<h2>DataSource.groovy: o b\u00e1sico<\/h2>\n<p>Localizado em seu projeto Grails no diret\u00f3rio grails-app\/conf, este \u00e9 o arquivo aonde devemos incluir as informa\u00e7\u00f5es que precisaremos para que possamos acessar a base de dados aonde nossas classes de dom\u00ednio ser\u00e3o persistidas.<\/p>\n<p>Normalmente o arquivo \u00e9 composto por tr\u00eas se\u00e7\u00f5es: <em>dataSource<\/em>, <em>hibernate<\/em> e <em>environments<\/em>. No momento em que criamos uma aplica\u00e7\u00e3o Grails com o comando grails-app, este arquivo \u00e9 gerado com a apar\u00eancia abaixo:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n\r\ndataSource {\r\n    pooled = true\r\n    driverClassName = &quot;org.hsqldb.jdbcDriver&quot;\r\n    username = &quot;sa&quot;\r\n    password = &quot;&quot;\r\n}\r\nhibernate {\r\n    cache.use_second_level_cache = true\r\n    cache.use_query_cache = true\r\n    cache.provider_class = 'net.sf.ehcache.hibernate.EhCacheProvider'\r\n}\r\n\/\/ environment specific settings\r\nenvironments {\r\n    development {\r\n        dataSource {\r\n            dbCreate = &quot;create-drop&quot; \/\/ one of 'create', 'create-drop','update'\r\n            url = &quot;jdbc:hsqldb:mem:devDB&quot;\r\n        }\r\n    }\r\n    test {\r\n        dataSource {\r\n            dbCreate = &quot;update&quot;\r\n            url = &quot;jdbc:hsqldb:mem:testDb&quot;\r\n        }\r\n    }\r\n    production {\r\n        dataSource {\r\n            dbCreate = &quot;update&quot;\r\n            url = &quot;jdbc:hsqldb:file:prodDb;shutdown=true&quot;\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<p>Como pode ser visto, cada uma das se\u00e7\u00f5es que mencionei compreende um bloco de c\u00f3digo, cuja utilidade b\u00e1sica de cada uma, a grosso modo, \u00e9 a seguinte:<\/p>\n<ul>\n<li><strong>dataSource<\/strong> &#8211; Armazena as configura\u00e7\u00f5es que s\u00e3o comuns a todos os ambientes de execu\u00e7\u00e3o (falarei mais sobre os ambientes de execu\u00e7\u00e3o neste post)<\/li>\n<li><strong>hibernate<\/strong> &#8211; Cont\u00e9m informa\u00e7\u00f5es espec\u00edficas do Hibernate, como por exemplo se desejamos trabalhar com cache, expor comandos SQL, etc. Todas as configura\u00e7\u00f5es do Hibernate, que voc\u00ea normalmente incluiria no arquivo hibernate.cfg (ou no Spring) deste ORM entram neste bloco.<\/li>\n<li><strong>environments<\/strong> &#8211; Uma aplica\u00e7\u00e3o Grails comporta o conceito de ambientes de execu\u00e7\u00e3o. No contexto deste arquivo, um ambiente representa uma configura\u00e7\u00e3o espec\u00edfica de acesso ao banco de dados. Por default, temos tr\u00eas ambientes: desenvolvimento (development), testes (test) e produ\u00e7\u00e3o (production).<\/li>\n<\/ul>\n<h3>Como assim ambientes?<\/h3>\n<p>Como mencionei, Grails implementa o conceito de ambientes de execu\u00e7\u00e3o. \u00c9 comum que no ciclo de vida de uma aplica\u00e7\u00e3o esta possua tr\u00eas tipos de ambiente: aquele no qual a desenvolvemos (development), aquele no qual executamos nossos testes automatizados (test) e, finalmente aquele que realmente importa, que \u00e9 o ambiente de produ\u00e7\u00e3o (production).<\/p>\n<p>Na realidade,<a href=\"https:\/\/devkico.itexto.com.br\/?p=625\"> como j\u00e1 escrevi neste blog anteriormente<\/a>, podemos inclusive ter mais de tr\u00eas ambientes. \u00c9 uma maneira interessante de se ter por exemplo uma base de dados apenas para a execu\u00e7\u00e3o de testes, o que facilita demais a vida do desenvolvedor.<\/p>\n<p>O mais interessante \u00e9 que os ambientes de execu\u00e7\u00e3o v\u00e3o al\u00e9m da &#8220;mera&#8221; configura\u00e7\u00e3o de datasources. Voc\u00ea pode, por exemplo, criar um ambiente de execu\u00e7\u00e3o adicional que encapsule l\u00f3gica espec\u00edfica de um cliente seu (se sua empresa trabalha com o desenvolvimento de produtos, fica ai minha dica pra voc\u00ea ;) ).<\/p>\n<h3>Reaproveitando c\u00f3digo &#8211; dataSource<\/h3>\n<p>A se\u00e7\u00e3o <em>DataSource<\/em> normalmente \u00e9 mal compreendida por diversos iniciantes. A grosso modo, no entanto, esta \u00e9 a parte da sua configura\u00e7\u00e3o que voc\u00ea deve usar para incluir os aspectos que ser\u00e3o comuns a todos os seus ambientes. Por exemplo: se todos usarem o MySQL como banco de dados, n\u00e3o \u00e9 necess\u00e1rio redigitar estes dados em cada um dos ambientes, basta inserir estas configura\u00e7\u00f5es nesta se\u00e7\u00e3o, tal como no exemplo abaixo:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\ndataSource {\r\n    pooled = true\r\n    driverClassName = &quot;com.mysql.jdbc.Driver&quot;\r\n}\r\nhibernate {\r\n    cache.use_second_level_cache = true\r\n    cache.use_query_cache = true\r\n    cache.provider_class = 'net.sf.ehcache.hibernate.EhCacheProvider'\r\n}\r\n\/\/ environment specific settings\r\nenvironments {\r\n    development {\r\n        dataSource {\r\n            url = &quot;jdbc:mysql:\/\/mysql\/desenvolvimento&quot;\r\n            username = &quot;jacob&quot;\r\n            password = &quot;lost&quot;\r\n        }\r\n    }\r\n    test {\r\n        dataSource {\r\n            url = &quot;jdbc:mysql:\/\/mysql\/tests&quot;\r\n            username = &quot;Benjamin&quot;\r\n            password = &quot;Linus&quot;\r\n        }\r\n    }\r\n    production {\r\n        dataSource {\r\n             url = &quot;jdbc:mysql:\/\/mysql\/production&quot;\r\n             username = &quot;Jack&quot;\r\n             password = &quot;Shephard&quot;\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<h3>E o dbCreate? <span style=\"color: #ff0000;\">(LEIA COM ATEN\u00c7\u00c3O!)<\/span><\/h3>\n<p>A propriedade dbCreate \u00e9 uma das mais \u00fateis e perigosas do Grails. N\u00f3s a usamos para <em>hibernate.hbm2ddl.auto<\/em>, e pode receber os seguintes valores:<\/p>\n<ul>\n<li><strong>create<\/strong> &#8211; Cria toda a estrutura de banco de dados pra voc\u00ea no momento em que a aplica\u00e7\u00e3o for iniciada, e tamb\u00e9m apaga todos os dados contidos nas tabelas caso estas j\u00e1 existam.<\/li>\n<li><strong>create-drop <\/strong>&#8211; Funciona da mesma maneira que <strong>create<\/strong>. A diferen\u00e7a \u00e9 que quando a aplica\u00e7\u00e3o \u00e9 finalizada, todas as tabelas s\u00e3o destru\u00eddas.<\/li>\n<li><strong>update<\/strong> &#8211; Atualiza as tabelas do banco de dados. Caso estas n\u00e3o existam, s\u00e3o criadas. Se novos atributos forem inclu\u00eddos em suas classes, estes ser\u00e3o refletidos em suas tabelas tamb\u00e9m. No entanto, algumas mudan\u00e7as n\u00e3o ser\u00e3o efetuadas. Se voc\u00ea por exemplo tiver renomeado campos, por exemplo, o GORM n\u00e3o saber\u00e1 como lidar com isto (n\u00e3o ocorrer\u00e3o erros). \u00c9 importante notar tamb\u00e9m que caso atributos sejam exclu\u00eddos de suas classes de dom\u00ednio, isto n\u00e3o implicar\u00e1 na remo\u00e7\u00e3o de campos nas tabelas relacionadas (ainda bem!).<\/li>\n<li><strong>validate<\/strong> &#8211; simplesmente verifica se as suas classes de dom\u00ednio est\u00e3o de acordo com as tabelas do banco de dados. Nenhuma altera\u00e7\u00e3o \u00e9 feita no banco de dados.<\/li>\n<\/ul>\n<p>Por medida de seguran\u00e7a, no ambiente de produ\u00e7\u00e3o voc\u00ea deve simplesmente excluir esta propriedade. Assim n\u00e3o correr\u00e1 o risco de acidentalmente apagar ou modificar uma estrutura de dados que j\u00e1 esteja sendo usada por seus usu\u00e1rios.<\/p>\n<h3>Agora, o aspecto &#8220;vivo&#8221; da configura\u00e7\u00e3o<\/h3>\n<p><a href=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2011\/01\/tumblr_l6brt5JZPQ1qct2v7o1_500.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-medium wp-image-929\" style=\"margin: 10px;\" title=\"tumblr_l6brt5JZPQ1qct2v7o1_500\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2011\/01\/tumblr_l6brt5JZPQ1qct2v7o1_500-300x251.jpg\" alt=\"\" width=\"180\" height=\"151\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2011\/01\/tumblr_l6brt5JZPQ1qct2v7o1_500-300x251.jpg 300w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2011\/01\/tumblr_l6brt5JZPQ1qct2v7o1_500.jpg 429w\" sizes=\"(max-width: 180px) 100vw, 180px\" \/><\/a>J\u00e1 reparou que o arquivo &#8220;DataSource.groovy&#8221; possui a extens\u00e3o &#8220;.groovy&#8221;? Ao contr\u00e1rio da maior parte dos arquivos de configura\u00e7\u00e3o, algumas das configura\u00e7\u00f5es do Grails s\u00e3o na realidade scripts!<\/p>\n<p>Sendo assim, caso seja necess\u00e1rio, voc\u00ea pode definir o funcionamento do seu ambiente n\u00e3o apenas declarativamente, mas tamb\u00e9m l\u00f3gicamente. Este aspecto pode nos mostrar uma nova gama de possibilidades, como por exemplo configurar o seu sistema de acordo com varia\u00e7\u00f5es do ambiente no qual este se encontra instalado.<\/p>\n<p>Confuso? Ent\u00e3o aqui segue um exemplo: suponha que voc\u00ea desenvolva produtos, e que n\u00e3o sabe de antem\u00e3o qual a url de conex\u00e3o com o banco de dados. Nesta nossa situa\u00e7\u00e3o hipot\u00e9tica, a string de conex\u00e3o com o banco de dados poderia ser uma vari\u00e1vel de ambiente. Como voc\u00ea faria?<\/p>\n<p>Bem, aqui segue um exemplo:<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n...\r\nenvironments {\r\n        ...\r\n         production {\r\n             url = System.getProperty(&quot;url_de_conexao_com_o_banco_de_dados&quot;)\r\n         }\r\n        ...\r\n}\r\n<\/pre>\n<p>Na realidade, voc\u00ea pode incluir qualquer c\u00f3digo groovy dentro do seu arquivo de configura\u00e7\u00e3o. Sendo assim, voc\u00ea poderia ter algo como o c\u00f3digo abaixo tamb\u00e9m.<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n...\r\nenvironments {\r\n        ...\r\n         production {\r\n             def valor = null\r\n             switch (System.getProperty(&quot;propriedade_qualquer&quot;) {\r\n                  case &quot;a&quot;: valor = &quot;coisas da vida&quot;\r\n                  case &quot;b&quot;: valor = &quot;coisas da vida louca&quot;\r\n             }\r\n             url = valor\r\n             new pacote.qualquer.ClasseQualquer.executeMetodo()\r\n         }\r\n        ...\r\n}\r\n\r\n<\/pre>\n<p>Como pode ser visto no exemplo, voc\u00ea pode inclusive, apesar de n\u00e3o ser recomendado, executar c\u00f3digo de inicializa\u00e7\u00e3o presente em outras classes dentro do seu ambiente de execu\u00e7\u00e3o. De qualquer maneira, o simples fato de ser poss\u00edvel incluir l\u00f3gica em um arquivo de configura\u00e7\u00e3o j\u00e1 \u00e9 uma vantagem fascinante.<\/p>\n<p>Um aspecto interessante a ser levado em considera\u00e7\u00e3o \u00e9 que o DataSource.groovy \u00e9 executado sequencialmente. Sendo assim, em uma configura\u00e7\u00e3o padr\u00e3o, a se\u00e7\u00e3o dataSource \u00e9 executada primeiro, para logo em seguida virem hibernate e environments. Mas sabe de uma coisa? Seu script pode tamb\u00e9m ser inclu\u00eddo FORA destes blocos e, ainda mais interessante: a ordem em que s\u00e3o declarados n\u00e3o faz diferen\u00e7a alguma.<\/p>\n<h2>Como uso JNDI?<\/h2>\n<p>A melhor op\u00e7\u00e3o, ao menos na minha opini\u00e3o \u00e9, ao inv\u00e9s de incluir suas configura\u00e7\u00f5es de acesso ao BD no DataSources.groovy, usar o JNDI. Assim voc\u00ea transfere a responsabilidade pela configura\u00e7\u00e3o do pool e outros aspectos do acesso ao banco de dados para o respons\u00e1vel pela manuten\u00e7\u00e3o do seu servidor de aplica\u00e7\u00f5es. Al\u00e9m disto, tamb\u00e9m evita de ficar incluindo senhas e nomes de usu\u00e1rios em um arquivo que qualquer um possa ver. Nestes casos, usamos a propriedade jndiName, tal como no exemplo abaixo:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n...\r\n   production {\r\n          jndiName = &quot;meu_nome_jndi&quot;\r\n   }\r\n...\r\n<\/pre>\n<h2>\u00c9 poss\u00edvel ter apenas um ambiente?<\/h2>\n<p>Para finalizar este post, uma possibilidade interessante, mas que, em minha opini\u00e3o, deve ser evitada a qualquer custo. Suponha que por alguma &#8220;raz\u00e3o&#8221; sinistra, voc\u00ea n\u00e3o queira ter tr\u00eas ambientes distintos, mas apenas um. Como voc\u00ea faria?<\/p>\n<p>Simples: como mencionei anteriormente, a se\u00e7\u00e3o dataSource cont\u00e9m o c\u00f3digo que ser\u00e1 reaproveitado por todos os seus ambientes, certo? Neste caso, basta excluir a se\u00e7\u00e3o enrivonments e incluir toda a sua configura\u00e7\u00e3o de acesso nesta se\u00e7\u00e3o, tal como no exemplo abaixo:<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n\r\nhibernate {\r\n    cache.use_second_level_cache = true\r\n    cache.use_query_cache = true\r\n    cache.provider_class = 'net.sf.ehcache.hibernate.EhCacheProvider'\r\n}\r\ndataSource {\r\n    pooled = true\r\n    driverClassName = &quot;com.mysql.jdbc.Driver&quot;\r\n    url = &quot;jdbc:mysql:\/\/souLouco\/mesmo&quot;\r\n    username = &quot;maluco&quot;\r\n    password = &quot;meio_burro_tamb\u00e9m&quot;\r\n}\r\n<\/pre>\n<p>Como pode ver, \u00e9 poss\u00edvel, mas por favor, n\u00e3o fa\u00e7a isto ok?<\/p>\n<h2>Concluindo<\/h2>\n<p>Como diria o tio do Homem-Aranha, &#8220;com grandes poderes, v\u00eam grandes responsabilidades&#8221;. \u00c9 exatamente o que ocorre aqui. Apesar do framework te oferecer a possibilidade de tratar o arquivo de configura\u00e7\u00e3o de acesso ao BD como um script, e voc\u00ea poder at\u00e9 mesmo subverter o padr\u00e3o e possuir apenas um ambiente, minha sugest\u00e3o para voc\u00ea \u00e9 que evite ao m\u00e1ximo poss\u00edvel estes recursos.<\/p>\n<p>N\u00e3o porque eles podem danificar seu banco de dados ou tornar sua aplica\u00e7\u00e3o um monstro, mas sim porque dificulta o entendimento de novos membros que venham a entrar em sua equipe. Afinal de contas, 99,9% dos programadores esperam o comportamento padr\u00e3o do Grails, n\u00e3o um &#8220;arquivo de configura\u00e7\u00e3o vivo&#8221;, n\u00e3o \u00e9 mesmo? Por\u00e9m, se mesmo assim optar por usar estes recursos, fa\u00e7a o poss\u00edvel para documentar estas peculiaridades do seu sistema ok?<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Em diversas aplica\u00e7\u00f5es que trabalhei, o \u00fanico arquivo de configura\u00e7\u00e3o que precisamos alterar \u00e9 o DataSources.groovy. E sabe o que \u00e9 mais interessante neste componente do framework? \u00c9 um arquivo de configura\u00e7\u00e3o vivo! Grails sempre me surpreende, at\u00e9 em sua configura\u00e7\u00e3o b\u00e1sica. Por\u00e9m, antes de mostrar alguns aspectos pouco conhecidos deste arquivo, vou come\u00e7ar pelo [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[3,30,1],"tags":[],"class_list":["post-922","post","type-post","status-publish","format-standard","hentry","category-grails","category-grails-guia-rapido-e-indireto","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Grails: aspectos interessantes na configura\u00e7\u00e3o de acesso a dados - \/dev\/Kico<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/devkico.itexto.com.br\/?p=922\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Grails: aspectos interessantes na configura\u00e7\u00e3o de acesso a dados - \/dev\/Kico\" \/>\n<meta property=\"og:description\" content=\"Em diversas aplica\u00e7\u00f5es que trabalhei, o \u00fanico arquivo de configura\u00e7\u00e3o que precisamos alterar \u00e9 o DataSources.groovy. E sabe o que \u00e9 mais interessante neste componente do framework? \u00c9 um arquivo de configura\u00e7\u00e3o vivo! Grails sempre me surpreende, at\u00e9 em sua configura\u00e7\u00e3o b\u00e1sica. Por\u00e9m, antes de mostrar alguns aspectos pouco conhecidos deste arquivo, vou come\u00e7ar pelo [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/devkico.itexto.com.br\/?p=922\" \/>\n<meta property=\"og:site_name\" content=\"\/dev\/Kico\" \/>\n<meta property=\"article:published_time\" content=\"2011-01-22T19:55:47+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2011-01-22T19:57:06+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.itexto.net\/devkico\/wp-content\/uploads\/2010\/02\/grails_logo.png\" \/>\n<meta name=\"author\" content=\"Kico (Henrique Lobo Weissmann)\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@loboweissmann\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Kico (Henrique Lobo Weissmann)\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=922\",\"url\":\"https:\/\/devkico.itexto.com.br\/?p=922\",\"name\":\"Grails: aspectos interessantes na configura\u00e7\u00e3o de acesso a dados - \/dev\/Kico\",\"isPartOf\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=922#primaryimage\"},\"image\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=922#primaryimage\"},\"thumbnailUrl\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/02\/grails_logo.png\",\"datePublished\":\"2011-01-22T19:55:47+00:00\",\"dateModified\":\"2011-01-22T19:57:06+00:00\",\"author\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7\"},\"breadcrumb\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=922#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/devkico.itexto.com.br\/?p=922\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=922#primaryimage\",\"url\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/02\/grails_logo.png\",\"contentUrl\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/02\/grails_logo.png\",\"width\":\"163\",\"height\":\"43\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=922#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/devkico.itexto.com.br\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Grails: aspectos interessantes na configura\u00e7\u00e3o de acesso a dados\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#website\",\"url\":\"https:\/\/devkico.itexto.com.br\/\",\"name\":\"\/dev\/Kico\",\"description\":\"Desenvolvendo software\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/devkico.itexto.com.br\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7\",\"name\":\"Kico (Henrique Lobo Weissmann)\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g\",\"caption\":\"Kico (Henrique Lobo Weissmann)\"},\"sameAs\":[\"https:\/\/x.com\/loboweissmann\"],\"url\":\"https:\/\/devkico.itexto.com.br\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Grails: aspectos interessantes na configura\u00e7\u00e3o de acesso a dados - \/dev\/Kico","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/devkico.itexto.com.br\/?p=922","og_locale":"pt_BR","og_type":"article","og_title":"Grails: aspectos interessantes na configura\u00e7\u00e3o de acesso a dados - \/dev\/Kico","og_description":"Em diversas aplica\u00e7\u00f5es que trabalhei, o \u00fanico arquivo de configura\u00e7\u00e3o que precisamos alterar \u00e9 o DataSources.groovy. E sabe o que \u00e9 mais interessante neste componente do framework? \u00c9 um arquivo de configura\u00e7\u00e3o vivo! Grails sempre me surpreende, at\u00e9 em sua configura\u00e7\u00e3o b\u00e1sica. Por\u00e9m, antes de mostrar alguns aspectos pouco conhecidos deste arquivo, vou come\u00e7ar pelo [&hellip;]","og_url":"https:\/\/devkico.itexto.com.br\/?p=922","og_site_name":"\/dev\/Kico","article_published_time":"2011-01-22T19:55:47+00:00","article_modified_time":"2011-01-22T19:57:06+00:00","og_image":[{"url":"http:\/\/www.itexto.net\/devkico\/wp-content\/uploads\/2010\/02\/grails_logo.png"}],"author":"Kico (Henrique Lobo Weissmann)","twitter_card":"summary_large_image","twitter_creator":"@loboweissmann","twitter_misc":{"Escrito por":"Kico (Henrique Lobo Weissmann)","Est. tempo de leitura":"9 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/devkico.itexto.com.br\/?p=922","url":"https:\/\/devkico.itexto.com.br\/?p=922","name":"Grails: aspectos interessantes na configura\u00e7\u00e3o de acesso a dados - \/dev\/Kico","isPartOf":{"@id":"https:\/\/devkico.itexto.com.br\/#website"},"primaryImageOfPage":{"@id":"https:\/\/devkico.itexto.com.br\/?p=922#primaryimage"},"image":{"@id":"https:\/\/devkico.itexto.com.br\/?p=922#primaryimage"},"thumbnailUrl":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/02\/grails_logo.png","datePublished":"2011-01-22T19:55:47+00:00","dateModified":"2011-01-22T19:57:06+00:00","author":{"@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7"},"breadcrumb":{"@id":"https:\/\/devkico.itexto.com.br\/?p=922#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/devkico.itexto.com.br\/?p=922"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/devkico.itexto.com.br\/?p=922#primaryimage","url":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/02\/grails_logo.png","contentUrl":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2010\/02\/grails_logo.png","width":"163","height":"43"},{"@type":"BreadcrumbList","@id":"https:\/\/devkico.itexto.com.br\/?p=922#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/devkico.itexto.com.br\/"},{"@type":"ListItem","position":2,"name":"Grails: aspectos interessantes na configura\u00e7\u00e3o de acesso a dados"}]},{"@type":"WebSite","@id":"https:\/\/devkico.itexto.com.br\/#website","url":"https:\/\/devkico.itexto.com.br\/","name":"\/dev\/Kico","description":"Desenvolvendo software","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/devkico.itexto.com.br\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"pt-BR"},{"@type":"Person","@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7","name":"Kico (Henrique Lobo Weissmann)","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g","caption":"Kico (Henrique Lobo Weissmann)"},"sameAs":["https:\/\/x.com\/loboweissmann"],"url":"https:\/\/devkico.itexto.com.br\/?author=1"}]}},"jetpack_featured_media_url":"","jetpack-related-posts":[],"jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/922"}],"collection":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=922"}],"version-history":[{"count":7,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/922\/revisions"}],"predecessor-version":[{"id":932,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/922\/revisions\/932"}],"wp:attachment":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=922"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=922"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=922"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}