由于用户查询数据库比较多,我想当一个查询文件从客户端发出查询请求时,先在服务器端读出数据,接着把数据生成一个XML文件,文件里记录了查询出来的数据和查询的条件,当下一个用户再用这个查询时,先看当前的XML文件查询条件是否包了现在用户的查询,如果XLM的数据能够满足则不需要记取数据库,直接从XML文件中返回数据。不知道这种设计合不合理,实现有没有难度?

解决方案 »

  1.   

    完全没有必要,SQL Server自己就有这样的缓存机制
    自己在本地再实现一次缓存可以减少网络流量,但是缓存过期的问题会极其麻烦
      

  2.   

    内存文件的映射的速度> 数据库速度> > xml文件速度
    你不是反而把速度搞慢了
      

  3.   

    我说的生成XML是在服务器端生成,每个查询对应一个XML文件,如果设定缓存的话会占内存啊,我这样处理是把数据存在真实的文件放在服务器端啊。还有,XML怎么写在客户端,有权限吗,这个我不懂.
      

  4.   

    说得直接点,如果为了减少数据库交互或者网络流量这样做是多此一举。:-)不要生气呦!你这样写文件要增加IO线程的负担,要知道IO线程比工作线程更繁忙数量更少,并且这个效率不一定比数据库快,数据库可是优化过的。你可以使用Cache来缓存这些数据,Cache里面可以放所有的托管对象,用在这里非常合适,有关Cache的使用方法请参考:
    ms-help://MS.MSDNQTR.2005JAN.1033/cpref/html/frlrfsystemwebcachingcacheclasstopic.htm
      

  5.   

    我也建议你用 Cache——以下摘录 MSDN 2003对于每个应用程序域均创建该类的一个实例,并且只要对应的应用程序域保持活动,该实例便保持有效。有关此类实例的信息通过 HttpContext 对象的 Cache 属性或 Page 对象的 Cache 属性来提供。
    示例
    [Visual Basic, C#, JScript] 下面的示例页向用户显示为缓存中的项所分配的值,并在将该项从缓存中移除时通知用户。它创建一个 RemovedCallback 方法(该方法使用 CacheItemRemovedCallback 委托的签名)在移除缓存项时通知用户,并使用 CacheItemRemovedReason 枚举向用户说明移除的原因。此外,它还使用 Cache.Item 属性向缓存中添加对象,并检索那些对象的值。在 AddItemToCache 方法中,它使用 Cache.Add 方法向缓存中添加项。若要使用 CacheItemRemovedCallback 委托,您必须用此方法或 Cache.Insert 方法向缓存中添加项,以便 ASP.NET 在该项被移除后可以自动调用适当的方法。自定义 RemoveItemFromCache 方法使用 Cache.Remove 方法从缓存中显式删除此项,从而导致 RemovedCallback 方法被调用。
    [Visual Basic] 
    <%@ Page Language="VB" %>
    <%@ Import Namespace="System.IO"%> <html>
     <Script runat=server>
        Shared itemRemoved As boolean = false
        Shared reason As CacheItemRemovedReason
        Dim onRemove As CacheItemRemovedCallback    Public Sub RemovedCallback(k As String, v As Object, r As CacheItemRemovedReason)
          itemRemoved = true
          reason = r
        End Sub    Public Sub AddItemToCache(sender As Object, e As EventArgs)
            itemRemoved = false        onRemove = New CacheItemRemovedCallback(AddressOf Me.RemovedCallback)        If (IsNothing(Cache("Key1"))) Then
              Cache.Add("Key1", "Value 1", Nothing, DateTime.Now.AddSeconds(60), TimeSpan.Zero, CacheItemPriority.High, onRemove)
            End If
        End Sub    Public Sub RemoveItemFromCache(sender As Object, e As EventArgs)
            If (Not IsNothing(Cache("Key1"))) Then
              Cache.Remove("Key1")
            End If
        End Sub
     </Script> <body>
      <Form runat="server">
        <input type=submit OnServerClick="AddItemToCache" value="Add Item To Cache" runat="server"/>
        <input type=submit OnServerClick="RemoveItemFromCache" value="Remove Item From Cache" runat="server"/>
      </Form>
    <%
    If (itemRemoved) Then
        Response.Write("RemovedCallback event raised.")
        Response.Write("<BR>")
        Response.Write("Reason: <B>" + reason.ToString() + "</B>")
    Else
        Response.Write("Value of cache key: <B>" + Cache("Key1") + "</B>")
    End If
    %>
     </body>
    </html>
    [C#] 
    <%@ Import Namespace="System.IO"%> 
    <html>
     <Script runat=server language="C#">
        static bool itemRemoved = false;
        static CacheItemRemovedReason reason;
        CacheItemRemovedCallback onRemove = null;    public void RemovedCallback(String k, Object v, CacheItemRemovedReason r){
          itemRemoved = true;
          reason = r;
        }    public void AddItemToCache(Object sender, EventArgs e) {
            itemRemoved = false;        onRemove = new CacheItemRemovedCallback(this.RemovedCallback);        if (Cache["Key1"] == null)
              Cache.Add("Key1", "Value 1", null, DateTime.Now.AddSeconds(60), TimeSpan.Zero, CacheItemPriority.High, onRemove);
        }    public void RemoveItemFromCache(Object sender, EventArgs e) {
            if(Cache["Key1"] != null)
              Cache.Remove("Key1");
        }
     </Script>
     <body>
      <Form runat="server">
       <input type=submit OnServerClick="AddItemToCache" value="Add Item To Cache" runat="server"/>
       <input type=submit OnServerClick="RemoveItemFromCache" value="Remove Item From Cache" runat="server"/>
      </Form>
      <% if (itemRemoved) {
            Response.Write("RemovedCallback event raised.");
            Response.Write("<BR>");
            Response.Write("Reason: <B>" + reason.ToString() + "</B>");
         }
         else {
            Response.Write("Value of cache key: <B>" + Cache["Key1"] + "</B>");
         }
      %>
     </body>
    </html>