Páginas

quarta-feira, 18 de abril de 2012

DBAs vs Developers vs Clients


Esta semana vou comentar sobre 2 artigos que eu recomendo. Quando li eles tive aquela sensação de "eu sempre quis dizer isto".

Os artigos não são muito técnicos, aconselho tanto para DBAs, quanto para desenvolvedores, programadores, arquitetos de sistemas, gerentes/coordenadores de TI, etc.

Trata-se do artigo "Crossing the Chasm Between Developers and DBAs", escrito por Mike Cuppett, (em português: Cruzando o abismo entre Desenvolvedores e DBAs).

Ele aborda o quão problemática a visão estreita do problema e a guerra de egos pode se tornar do ponto de vista de quem realmente importa, que é o cliente.

E o fundador do Pythian Group, Paul Vallée, cita esta questão de egos em seu artigo "The seven deadly habits of a DBA... and how to cure them" (em português: Os sete hábitos mortais de um DBA... e como curá-los). Que é uma leitura recomendadíssima para DBAs e gerentes de times de DBAs. Ele explica muito bem a questão do artigo anterior e como o ponto de vista mais aberto é importante neste caso. Faço aqui uma tradução do hábito 5:

"Habit #5. O JOGO DA CULPA: Não olhe para mim, é culpa do desenvolvedor que este SQL esteja em produção
Alguns DBAs tem uma real mentalidade de 'nós contra eles' quando se trata de desenvolvedores e suas organizações. Eles não se veem como facilitadores ajudando os desenvolvedores a desenvolverem código de qualidade, do ponto de vista de banco de dados, mas se veem como guardiões que previnem que código de baixa qualidade entre em produção. Isto pode parecer como uma questão de semântica, mas um relacionamento conflituoso entre desenvolvedores e DBAs resulta em uma falta de iniciativa do desenvolvedor e uma lentidão significativa nos ciclos de release"

Já presenciei colegas DBAs sendo solicitados para atividades de análise de performance e para que ajudassem na melhoria do tempo de resposta de algumas consultas, e estes prontamente responderam "nós não fazemos isto, esta fora do nosso escopo". Deixando as questões de 'custo vs escopo' de lado, eu até acho que em muitos casos este tipo de atitude seja devido a falta de conhecimento sobre performance e até mesmo o medo de aprender, mas estas também são barreiras que devem ser vencidas por qualquer técnico.

E eu diria que este hábito de "nós contra eles" é terrível para qualquer profissional, seja DBA ou análista de sistemas, ou storage, ou backup, ou network, etc.

E para casos de empresas que trabalham com "Outsourcing Services"? As coisas se complicam ainda mais quando temos diversos fornecedores. A muito tempo já venho me perguntando como resolver a situação neste ultimo caso? Como coordenar os trabalhos, e conflitos, das diferentes empresas suportando um mesmo ambiente? 


É claro que é fator chave todos os envolvidos serem dotados de muita paciência e habilitade de comunicação. Mas nada supera a necessidade de haver uma curiosidade natural por resolução de problemas, que é o que nos motiva e cria esta ânsia de não descansar enquanto o problema estiver resolvido.



Concluíndo, acho que estes dois artigos são do tipo que deveriamos ler periódicamente, para nos políciar contra os vícios sociais no trabalho.

quarta-feira, 4 de abril de 2012

JPA/Hibernate e Sequences: script para associar sequences e colunas

Você sabe como os sitemas de bancos de dados Oracle fazem para associar sequences e colunas?
Bom, infelizmente ele não faz.

O Oracle Database ainda não possui a propriedade de coluna "AUTO_INCREMENT" tal como do MySQL ou SERIAL do PostreSQL.

Uma opção seria fazer uso de triggers, para colocar o valor crescente nas tabelas de identificadores tal como exemplificado pelo Tim Hall em seu blog.

Mas e se o projeto já esta em andamento a alguns anos?
E se ele for construido em Java com uso de algum framework de persistência, tais como JPA e Hibernate (xodó dos programadores)?

Bom, depois de me debater durante umas 2 a 3 horas procurando por um parser de anotações Java/JPA especifico para sequences resolvi escrever meu próprio parser para tornar a minha vida mais fácil, e talvez a sua também.

O script "HbtParse_SeqToDB.pl" foi escrito em Perl e esta disponível no Google code, no projeto que criei recentemente chamado DB-Handy-Code.


Descrição: O script primeiramente se conecta ao banco de dados e cria no esquema do usuário fornecido uma tabela auxiliar chamada AUX_SEQUENCE_TAB_COL (caso ela não exista). Esta tabela possui 3 colunas (sequence_name, table_name e column_name) onde o nome da sequencia é uma chave primária e não pode ser repetida.
Após isto ela efetua uma varredura (do tipo 'find') de toda a árvore de diretórios a partir do <source directory> especificado buscando por arquivos ".java". Em cada arquivo ele efetua um parse por anotações específicas e caso cosiga efetuar a associação entre "Sequencia, Tabela e Coluna" ele insere esta associação na tabela auxiliar AUX_SEQUENCE_TAB_COL. Caso a sequence já exista na tabela auxiliar ele apenas imprime um "warning" na saída padrão, informando o nome do arquivo.

Após ter os dados das associações na tabela auxiliar é possível efetuar atividades de manutenção, tais como o reset dos valores das sequences para o valor máximo das colunas. Escrevi a algum tempo o código de uma stored procedure para tal, disponível aqui.


Limitações da versão 0.1a do HbtParse_SeqToDB.pl:

  1. Ela atualmente só reconhece anotações JPA em código fonte ".java", mas tenho intenção de extende-lo para elementos de XML no futuro
  2. É necessário que a anotação  @Column  esteja após a anotação @Id  e antes da declaração do atributo/método da entidade, para que seja possível fazer a associação
  3. Atualmente  só reconhece 1 sequence em cada arquivo fonte, e este arquivo pode conter apenas 1 entidade e 1 atributo identificador (o que não deixa de ser uma boa prática de programação Java)
  4. Atualmente suporta apenas banco de dados Oracle
  5. É necessário Perl v5.10 ou superior
  6. São necessários os seguintes módulos Perl
    • File::Find::Rule
    • Getopt::Long
    • DBI
    • DBD::Oracle
Como usar:
HbtParse_SeqToDB.pl -d <src dir> -B <src db> -U <db user> [-P <db pwd> -t <parser type> -h]
O script possui uma opção "-h" que exibe um help com a sintaxe.
Exemplo de uso:
[henchen@obelix ~]$ perl HbtParse_SeqToDB.pl -d /src-java -B dbi:Oracle://localhost:1521/ORCL -U scott -P tiger