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!