Controle Transaciona Programatico

OO no mundo real: evite vazamento de conexões com controle transacional programático

No último Javou (evento da JavaCE) o prof. Alexandre Martins comentou na sua palestra que um dev junior conseguiu derrubar por alguns minutos o sistema de previdência social da Dataprev. Estou falando do principal sistema da empresa… muito louco não?

Sabe como? Ele esqueceu de colocar essa linha de código aqui:

conexao.close();  // fecha conexão com o banco

Simmm! Ele esqueceu de fechar uma conexão com o banco de dados! Se você não sabe, uma conexão é um recurso muito caro e, para piorar, é muito limitado; todo banco tem um limite de conexões que podem ser abertas, se esse limite estourar já era, a aplicação não consegue mais conversar com o banco!

(Eu nem culpo esse dev junior, até porque eu já fiz algo parecido em alguns sistemas… mas não conta pra ninguém, tá?)

Mas como ele poderia ter evitado?

A boa prática diz que todo recurso caro que for aberto deve sempre ser fechado quando não for mais utilizado. Uma boa maneira de fazer isso é através do bloco try-catch-finally do Java:

Connection conexao = null;
try {
    conexao = ConnectionFactory.getConnection();
    // logica de negócio

} catch (SQLException e) {
    // trata erro
} finally {
    conexao.close(); // fecha conexão com o banco
}

O problema é que repetir esse código em todo o sistema é muito frágil, cedo ou tarde alguém esquece e termina com o sistema fora do ar. Aí já viu né, é justa causa…

E se eu te dissesse que tem uma maneira mais elegante de resolver isso usando OO? É o que chamamos de controle transacional programático e traz diversos benefícios para qualquer sistema, entre eles a garantia que toda conexão com o banco é fechada!

Pra te ajudar a entender do que estou falando, eu bloguei sobre o assunto:

[Post] Controle Transacional Programático em Sistemas Legados

Após ler esse artigo eu te garanto que você vai levar o controle de conexões e transações na sua aplicação mais a sério, seja seu sistema legado ou mais moderno com JPA e Hibernate.

TriadWorks: Deploy Automatizado

Aprenda como Automatizar seu Deploy em 15min…

Você faz deploy da sua aplicação manualmente? Em produção? Não cara, não faz isso.

Você sabe que esse processo manual cedo ou tarde vai te trazer uma grande dor de cabeça, né? Qualquer tarefa manual, repetitiva e feita por um ser humano tende a não dar certo.

A melhor forma de resolver isso é automatizando: desde build até o processo de deploy. Automatizar o deploy não precisa ser algo difícil nem sofisticado, você consegue resolver isso com 2 passos simples:

  1. liste todos os passos do deploy num arquivo TXT;
  2. transforme essa lista num script executável;

Pronto! A partir de agora você tem um processo de deploy automatizado sem firulas! Não sabe escrever o script? Não te preocupas, eu te ensino como fazer nesse novo post no blog:

[Post] Deploy Automatizado: feito é melhor que perfeito

Deploy deve ser simples e executado com frequência, dessa forma você diminui os riscos a cada nova versão da sua aplicação.

E aí, o que achou? Será que você consegue aplicar o script do post no seu trabalho? Comenta lá, deixa eu saber!

2o Mau Habito Dos Desenvolvedores JSF

Método getter invocado múltiplas vezes?

Você sabia que uma simples consulta ao banco de dados colocada no método errado do seu managed bean pode tornar suas páginas 10x mais lentas?

Entre 2008 e 2014 eu palestrei em diversos lugares do Brasil sobre os 10 maus hábitos dos desenvolvedores JSF, e sem dúvida um dos problemas mais comuns que encontrei durante estas palestras conversando com profissionais, em consultorias e treinamentos foi o 2o mau hábito: colocar lógica cara em métodos getters.

Provavelmente você já caiu neste 2o mau hábito ou conhece alguém que tenha caído, de qualquer forma, podemos simplificá-lo com um simples trecho de código. Por exemplo, um problema grave pode estar num simples método getter:

public List<Produto> getProdutos() {
    return this.dao.lista(); // lista produtos do banco
}

Apesar deste método parecer inofensivo ele pode tornar sua página até 10x mais lenta para abrir no navegador! Caso duvide ou queira entender por que ele pode ser tão perigoso para sua aplicação, eu recomendo a leitura do meu novo post:

>> JSF: Não coloque processamento caro em métodos getters

Colocar consultas dentro de getters é tão perigoso que, na maioria dos casos, além de impactar diretamente na aplicação Java ele impacta no banco de dados pois este é bombardeado com inúmeras consultas.

E aí, o que achou da dica?

Deixe seu comentário, e se tiver algum amigo que curte meter consultas em getters por comodidade, eis a chance de convence-lo do contrário.