Back-End

13 mai, 2014

Groovy + Procedure = Groovedure

Publicidade

Uma das grandes justificativas que mantêm a escrita de regra de negócio na forma de procedures dentro de um SGDB é justamente o fato de poder dar manutenção nelas sem precisar reiniciar a solução, não ocasionado indisponibilidades de downtime geradas pelos redeploys. Muito bem, hoje eu vou te ensinar a usar um recurso que eu chamo de “Groovedure”, que pode ser utilizado para resolver esse cenário e assim extinguir por completo essa prática. A coisa funciona resumidamente assim:

Passo 1

Crie uma tabela no banco de dados que armazena um texto onde será dinamicamente gravado um script Groovy que será usado para escrever alguma regra de negócio. Segue um exemplo usando MySQL:

CREATE TABLE regras (

   REGID int(10) unsigned NOT NULL auto_increment, 

   REGTEXTO mediumtext NOT NULL,                   

   PRIMARY KEY  (REGID),                           

   UNIQUE KEY REGID (REGID)                      

) ENGINE=InnoDB DEFAULT CHARSET=latin1;

 

Passo 2

Escreva um script Groovy que acesse qualquer outra tabela do sistema expressando alguma regra de negócio:

import groovy.sql.Sql 

con = Sql.newInstance(“jdbc:mysql://localhost:3306/urna1″, “root”, “root”,”com.mysql.jdbc.Driver”)

lista = con.rows(“select * from votante where nm_pessoa like ‘F%’”)

con.close()

lista

 

Passo 3

Insira o script dentro da tabela regras com o ID 1:

insert into regra ( REGID , REGTEXTO ) values ( ’1′,’  con = Sql.newInstance( “jdbc:mysql://localhost:3306/urna1 “,  “root “,  “root “, “com.mysql.jdbc.Driver “)    lista = con.rows( “* from votante where nm_pessoa like ‘F% “);    con.close()    lista’)

 

Passo 4

Crie um programa Java que acesse esse registro na tabelas de regras e execute o script Groovy na solução, retornando da execução uma ArrayList<> com o resultado da execução dinâmica. No caso, eu fiz um programa desktop usando Groovy (mas que poderia ser Java):

import groovy.sql.Sql

class JavaProcedure {

  static main(args) {

     def con = Sql.newInstance(“jdbc:mysql://localhost:3306/estudo”, “root”,

     “root”,”com.mysql.jdbc.Driver”)

     def lista = con.rows(“select * from regras”)

     con.close()

     GroovyShell engine = new GroovyShell();

     lista = engine.evaluate(lista[0].regtexto)

     lista.each {linha-> println linha.nm_pessoa }

  }

}

 

O resultado disso é o mesmo que uma procedure tradicional SGDB. Veja:

FOR – J TREINAMENTOS LTDA – ME

FABIO MASSONI JUNIOR

FABIO ADALBERTO FAVARO

FABRICIO PARRA GARCIA

FABIO FERREIRA LEHMANN

FARID LIBOS JUNIOR

FERNANDA BENQUERER COSTA

FRANCISCO MOITA SOARES

FLAVIO MENDONCA DE MORAES

FERNANDO THOMAZINHO

FERNANDA AUGUSTA POLO TONSIG

FLAVIANE PEREIRA MARTINS

Conclusão

Nesse modelo, você está escrevendo uma procedure baseada em script usando do Groovy, que por sua vez usufrui de todos os poderes e recursos da GDK e JDK, e ainda sim pode ser dinamicamente compilada e executada sem gerar interrupções na disponibilidade da solução. Fácil, não? Espero que você tenha visualizado o poder arquitetural que essa simples brincadeira oferece. Até a próxima!