sexta-feira, 7 de dezembro de 2012

Query simulada

Query simulada é uma técnica parecida com o cache de queries. A diferença é que o servidor de aplicação não armazenará em memória o resultado da query por muito tempo. Apenas no momento em que for requisitada. Além disso, com esta técnica o servidor de aplicação literalmente não vai ao banco de dados, nem na primeira vez. Na verdade estamos programando um recordset hard-coded, isto é, "na unha".
 
As vantagens não poderiam ser outras: velocidade, estabilidade, confiabilidade.
 
É uma técnica polêmica (os ortodoxos torcerão o nariz), mas eficaz. Tem seu momento de uso. É uma forma de otimizar a técnica de cache de query. Deve-se escolher com muito critério as queries que são elegíveis para query simulada. Serão poucas.

<!--- Query simulada --->
<cfset retornarTipoResp = QueryNew("id, descricao")>
<cfset newRow=QueryAddRow(retornarTipoResp , 1)>
<cfset temp=QuerySetCell(retornarTipoResp , "id", "88", 1)> 

<cfset temp=QuerySetCell(retornarTipoResp , "descricao", "Pai", 1)>
<cfset temp=QuerySetCell(retornarTipoResp , "id", "89", 2)>
<cfset temp=QuerySetCell(retornarTipoResp , "descricao", "Mãe", 2)>
<cfset temp=QuerySetCell(retornarTipoResp , "id", "90", 3)>
<cfset temp=QuerySetCell(retornarTipoResp , "descricao", "Familiar", 3)>
<cfset temp=QuerySetCell(retornarTipoResp , "id", "91", 4)>
<cfset temp=QuerySetCell(retornarTipoResp , "descricao", "Tutor", 4)>

<!--- Query simulada --->

Mais uma carta na manga no rol de possibilidades de tornar um sistema mais rápido.

Stay tuned!Tem muito mais pela frente!

quarta-feira, 5 de dezembro de 2012

Timeout de query


Prezados leitores, mostrarei aqui com o mesmo exemplo anterior, como se faz "timeout de query", uma técnica indispensável para um alto uptime de um sistema web feito em Coldfusion.

O timeout de query nada mais é do que um tempo especificado em segundos, após o qual o servidor de aplicação interromperá a execução por uma exceção.


 O erro gerado deve ser tratado pela aplicação e informado ao usuário: "não houve uma resposta à sua requisição dentro do tempo limite esperado". Isso evita gargalos por enfileiramento e garante a aplicação no ar e respondendo.

<cfset result="true">

<cftry>
   <cfquery datasource="bdProd" name="retornaCidades" timeout="10">

       select cod_cidade, dsc_cidade
       from esc.cidade
       where cod_uf = <cfqueryparam value="#arguments.uf#"

                       cfsqltype="CF_SQL_VARCHAR" maxlength="2">
       order by decode(dsc_cidade,'Rio De Janeiro','A',dsc_cidade)


   </cfquery>
 

<cfcatch type="Any" >
   <cfif #FindNoCase("timeout", cfcatch.Detail)# GT 0>
      <cfset result = "Não houve resposta dentro do tempo disponível!">
   <cfelse>
      <cfset result = "Ocorreu um erro durante a pesquisa. Tente novamente!">
   </cfif>           
</cfcatch>
</cftry>         

 

Simples assim e evita muitos problemas!

Até o próximo post!
 

domingo, 2 de dezembro de 2012

Cache de query

O cache de query é uma técnica de otimização formidável, que agiliza sobremaneira o acesso ao banco de dados, eliminando um dos principais gargalos de um sistema web. Define-se que a query será "cacheada" através do argumento cachedWithin, especificando-se também o tempo que o resultado permanecerá em memória. Isso é feito com a função CreateTimeSpan, que tem como argumentos o número de dias, horas, minutos e segundos. Veja o exemplo abaixo:
  
<cfquery datasource="bdProd" name="retornaCidades"
         cachedwithin="#CreateTimeSpan(0,1,0,0)#">

   select cod_cidade, dsc_cidade
   from esc.cidade
   where cod_uf = <cfqueryparam value="#arguments.uf#"

                   cfsqltype="CF_SQL_VARCHAR" maxlength="2">
   order by decode(dsc_cidade,'Rio De Janeiro','A',dsc_cidade)


</cfquery>

Na primeira vez que a query é executada, o servidor de aplicação vai ao banco de dados e aguarda a resposta, que vai levar alguma coisa perto de 30 milissegundos.

Mas, a partir da segunda vez que essa mesma query for requisitada ao servidor de aplicação, ele não vai mais incomodar o banco de dados, pois a query já se encontra "cacheada". O tempo necessário para retornar os dados será de ZERO milissegundos. Na verdade, por estar em memória real, o processo é tão rápido que não pode ser medido em milissegundos.

Analise as queries de seus sistemas e vejam quais são elegíveis para o uso desta técnica. A elegibilidade deve ser estudada caso a caso porque queries de pesquisa em tabelas que estão sendo constantemente atualizadas não poderão ser "cacheadas", sob pena de o retorno da pesquisa não representar a realidade - pode ficar algum dado de fora.

Cache de queries é um verdadeiro divisor de águas em sistemas web. Recomendo veementemente sua utilização.