none
Guardar DataSet em Cache RRS feed

  • Pergunta

  • Oi pessoal,

    Estou com uma dificuldade e gostaria de uma ajuda.

    Tenho algumas tabelas que possuem dados que sempre são pesquisados. São dados simples, mas que sempre preciso fazer um acesso ao banco.

    A minha intenção é fazer o seguinte:

    - Criar um DataSet com as tabelas que preciso.

    - Guardar esse DataSet em cache para buscar dele e não do banco.

    - Quando algum usuário atualizar algo no banco, atualizar o DataSet do cache.

    Estava pesquisando como fazer cache de dados, mas infelizmente ainda não consegui desenvolver nada funcional.

    Eu quero saber como posso guardar um DataSet em cache (se isso for realmente possível) para que eu possa manipulá-lo de acordo com a minha vontade.

    Obrigado, Israel.

    terça-feira, 13 de março de 2007 13:28

Respostas

Todas as Respostas

  • Leonardo,

    Agradeço o link, mas não entendi muito bem.

    Veja aqui:


    Sub CarregaDados()

    Dim startTime As DateTime = Now

    Dim ds As DataSet

    'busca o dataset no cache

    ds = Me.Cache("LivrosDS")

    'se nao tenho esse dataset no cache,

    'carrego do arquivo XML e coloco no cache

    If ds Is Nothing Then

    ds = New DataSet

    ds.ReadXml(Server.MapPath("dados.xml"), _

    XmlReadMode.InferSchema)

    Me.Cache.Insert("LivrosDS", ds)

    lblFonte.Text = "Arquivo XML"

    Else

    lblFonte.Text = "Cache"

    End If

    'liga os dados ao datagrid

    DataGrid1.DataSource = ds

    DataGrid1.DataBind()

    'mostra o tempo gasto

    lblTempoGasto.Text = Now.Millisecond - startTime.Millisecond & " msec"

    End Sub


    Não entendi o "Cache", neste contexto. Se eu digitar Cache, simplesmente o Visual Studio me sugere o tipo Cache. Logo, não consigo fazer o Insert. Solução: criei um atributo cache do tipo Cache e fiz cache.Insert(...). Até aí nada brilhante (lembrando que estou usando C#).

    O problema é quando tentei fazer o ds = Me.Cache("LivrosDS").

    Se eu fizer direto com Cache, o erro é que não posso usar um tipo como uma variável. Se uso cache, o erro é que não posso usar um atributo como método.

    Pelo que entendi, preciso inserir algo no cache, dando-lhe um nome. Para recuperar o que inseri, basta fazer referência ao nome que eu dei a ele. Certo? Segundo o exemplo na matéria eu recupero através de Cache("<<nome>>"), que não funcionou comigo.

    Ah, outra coisa... Procurei outra referência e vi que o outro autor fazia uso destes using. Na falta de um desses não foi possível usar Cache (System.Web.Caching).

    using System.Web.Caching;

    using System.Data.SqlClient;

    using System.Collections.Generic;

    Vou colocar o trecho do meu código. Ressaltando que criei uma nova classe para manipular cache, e o DataSet que uso está em outra classe que manipula persistência. Tudo para teste.


    public class ControleCache

    {

    // Outra classe que contém o DataSet

    private TesteDA ex;

    // Atributo do tipo Cache

    private Cache cache;

    public ControleCache()

    {

    cache = new Cache();

    ex = new TesteDA();

    // ERRO AQUI: 'ControleCache.cache' é um 'campo', mas é usado como 'método'

    ex.ds = cache("MC");

    if (ex.ds == null)

    {

    ex.Consultar();

    this.cache.Insert("MC", ex.ds);

    }

    }

    }


    Se você puder me explicar melhor, eu agradeço.

    Abraço, Israel.

    terça-feira, 13 de março de 2007 16:36
  • Que tipo de aplicação é essa?
    terça-feira, 13 de março de 2007 17:00
  • Estou fazendo esta aplicação de teste, para que possa saber como funciona o Cache, de forma correta. Assim posso aplicar a solução do teste na solução do meu problema.

    Preciso guardar um DataSet com algumas tabelas, para que não seja necessário fazer excessivas conexões ao banco de dados. São tabelas que contém dados que não mudam muito, enumerations... Deixando-as no cache, não preciso sobrecarregar o servidor de banco, já que preciso carregar algumas combos.

    Imagina uma conexão a cada PostBack por causa de algumas combos para milhares de usuários...

    O primeiro trecho de código é o exemplo da matéria que você me passou naquele link. O resto são as minhas tentativas.

    Entendeu?

    Valeu, Israel.

    terça-feira, 13 de março de 2007 17:08
  • Crie uma aplicação web simples, e coloque o código no evento Load para simular o PostBack. Não consegui simular o problema que você teve, nem com Vb.net nem com C#, até por que isso não é um recurso da linguagem.
    terça-feira, 13 de março de 2007 17:26
  • Acho que esse artigo aqui vai te dar exemplos mais próximos do que você está querendo:

     

    http://msdn2.microsoft.com/en-us/library/ms379559(VS.80).aspx

     

    terça-feira, 13 de março de 2007 23:16
  • Mateus,

    Esse exemplo é legal... Mas ele está mesmo acessando o banco de dentro da página aspx?


    <asp:SqlDataSource
       ID="SqlDataSource1"
       EnableCaching="true"
       CacheDuration="600"
       ConnectionString="Server=localhost;database=Pubs"
       SelectCommand="SELECT Title FROM Titles"
       Runat="server" />


    Aqui eu vejo que ele "declarou" um SqlDataSource.

    Além do mais, o cache que eu irei criar mais para frente fica onde? No servidor? A idéia é que os usuários façam acesso a um cache comum.

    Valeu.

    quarta-feira, 14 de março de 2007 14:32
  • A propósito, gostaria de colocar um link com uma matéria que ajudou.

    http://www.juliobattisti.com.br/tutoriais/mauricioborges/cache002.asp

    Valeu.

    quarta-feira, 14 de março de 2007 14:40
  • Sem, nesse exemplo em particular ele declarou na página, mas veja que tem outras maneiras.

    Agora, o objeto cache fica no servidor, sempre. Então isso não tem nada de relação com o cache que o browser faz. Esse dataset nao vai para o browser nao.

    quinta-feira, 15 de março de 2007 01:27