sexta-feira, 13 de maio de 2011

Qual é o melhor banco de dados: Oracle, Mysql, MSAccess, ...

Comum seria dizer que não existe banco de dados melhor ou pior que o outro.

Os anos de convívio com estes verdadeiros mastondontes, repletos de configurações, lentos e tinhosos mostraram-nos algo inegável:

Fuja de bancos de dados caros e complexos.

Um dos que atende completamente a este axioma é o banco Oracle. Mesmo com uma equipe treinada, com constante monitoramento, o mesmo pode amanhecer em "halt". Sai do ar. A arquitetura de volumes físicos e virtuais é tão flexível, que ele "estica" e rompe. Um banco que movimenta um grande número de transações precisa, como todos os outros com menos transações de capacidade, manter parâmetros na memória do servidor. Não existe processamento sem memória, e não existe memória saudável sem um fornecimento constante de energia dentro de picos razoáveis de voltagem e de corrente elétrica.

Se entre estes picos de corrente houver uma grande frequência de transações, a chance de uma perda é muito grande, como a prática confirma em nossa instalações. E não adianta reduzir a carga do banco, pois o Oracle "gosta" de trabalhar é com carga pesada.

Bancos grandes estão sendo superados por novas técnicas e pelo hardware que já vem com funções embutidas que atendem muito bem às exigências de robustez e velocidade.

Um dos bancos recentes, que aguenta, em volume menor de transações, o "tranco" é o Mysql. Em 7 anos de operação de um banco de CMS (Gerenciadores de conteúdo para Web) reparamos o banco apenas 2 vezes. E olha que ele sofre 12 mil atualizações, pelo menos, ao dia de cada requisição registrada de clientes.

E para bancos menores, em Intranet, o Microsoft Access se sai muito bem. Alguns técnicos incautos, acostumados a ouvir opiniões de outros de capacidade duvidosa e pouca experiência, falam que este banco não se presta a centenas de milhares de registros. Evidentemente se esquecem, ou nunca se deram conta, de que no servidor Web o banco de dados utilizado se comporta como se servisse a uma aplicação monousuário. Neste contexto, o usuário anônimo do servidor é o único autorizado a ler e a gravar no banco.

Já manipulamos bancos Access, via Web, com 4 milhões de registros, numa média de 8000 transações só de entrada em Intranet, e o banco não apresentou defeito em Servidor Microsoft Windows 2003.

Utilizando corretamente um banco de dados

Todo banco de dados dá uma boa resposta, se bem utilizado. Em primeiro lugar, é preciso uma boa modelagem das tabelas SEM UMA NORMALIZAÇÃO EXCESSIVA pois a recuperação dos dados fica extremamente trabalhosa para o banco. Não use excesso de códigos que precisam de tabelas de apoio para serem traduzidos. Depois, faça as suas sentenças SQL de forma a recuperar somente o que for preciso. Utilize a ordenação em suas SQLs só quando for ABSOLUTAMENTE NECESSÁRIO. A ordenação pode ficar a cargo do javascript, muito mais eficiente, e feita no lado cliente. Pense duas vezes antes de utilizar os "famintos" campos BLOB. Uma boa Gestão de Conhecimento vai possibilitar a tipificação de eventos e situações de forma a evitar o preenchimento "aberto" demais dos campos, com frases despadronizadas e cujo conteúdo talvez não seja achado em uma busca.

Um bom lembrete:

Se você não está a par do que é Gestão de Conhecimento, nem comece a definir o esquema das tabelas de seu banco de dados.

Conclusão

Para Intranets, use bancos pouco pretensiosos, programas com cache e bem feitos. Para Internet, use Mysql. Para aplicações pesadas em redes dispersas em áreas geográficas, empresas com muitas filiais e escritórios de apoio, além de centros de desenvolvimento, use Oracle, mas contrate uma boa equipe de analistas de suporte 24 horas por 7 dias na semana.

sexta-feira, 6 de maio de 2011

Controle do time out

Para o correto gerenciamento dos recursos de um servidor Web (ISP), é preciso dimensionar com muita lógica e estudo o tempo de "time out" das aplicações.

O que é "time out" ?

Time out é o tempo após o qual a sessão na qual o usuário está, dentro de uma aplicação do servidor Web (IIS, Apache, Quick'n'easy, Chitami) expira, ou seja, ela cai e perde referências internas que sustentam a digitação ou operação do usuário.

Exemplo:

Você está preenchendo um formulário com informações para a a compra de um produto e demora demais. Quando vai olhar de novo para a tela do computador, ele exibe uma mensagem em inglês, ou informa de maneira clara que a página "expirou" e portanto você deve fazer tudo de novo.

Por que é preciso fazer isto ?

Se este controle de tempo não fosse feito, o servidor não suportaria tantas pessoas abrindo telas na Internet e deixando as mesmas abertas sem estar fazendo nada. Este tempo orça entre 10 e 20 minutos. Se uma pessoa não utiliza uma tela (não digita nada ou não mexe com o mouse) por 10 minutos, é porque a tela não lhe interessa mais. No caso do preenchimento de formulários, provavelmente a pessoa desistiu da compra ou de um cadastramento.

Controle pelo ASP

O controle pelo ASP é feito por intermédio das variáveis de Sessão (Session). O local predileto e adequado para iniciar a colocação de variáveis de sessão é a script chamada pela tela de login do sistema ou aplicação. Esta script recebe os dados do formulário de login (usuário e senha) e as trata:

<%

vUsuario = Request("Usuario") 
vSenha = Request("Senha")
Session("Usuario") = vUsuario      
%>

Os nomes dentro dos parênteses são os correspondentes "names" das tags de INPUT HTML da tela de login:

<FORM method="post" action="script de destino onde estará o código ASP">
Usuário:<INPUT type="text" name="Usuario">
Senha:<INPUT type="text" name="Senha">
</FORM>

A partir do processamento da script ASP, uma variável interna, invisível para todos os outros usuários que estiverem utilizando este sistema, armazenará o nome do usuário, e estará disponível para TODAS as páginas e scripts  chamadas por esta script.

Como testar se ocorreu o time out ?

No início das scripts chamadas por esta script e pelas demais, coloque o trecho:

<%
if Session("User") = "" then
Response.redirect "nome da script ou página HTML que corresponde à tela de login"
end if

%>

Desta forma, toda vez que uma script for chamada, vai ser feita a conferência da existência desta variável de Sessão (Session("Usuario")). Se ela estiver vazia, é porque perdeu o valor. E se perdeu o valor, é porque a sessão do usuário expirou.