【问题标题】:How to cache XmlTextWriter data?如何缓存 XmlTextWriter 数据?
【发布时间】:2010-12-22 19:20:48
【问题描述】:

我有一个页面,我只是将一堆 XML 数据写入屏幕。它正在调用多个数据库来获取所有数据:

XmlTextWriter writer = new XmlTextWriter(Response.OutputStream, Encoding.UTF8);
writer.WriteStartDocument();

writer.WriteStartElement("rss");
writer.WriteAttributeString("version", "2.0");

writer.WriteStartElement("channel");
writer.WriteElementString("title", "MyTitle");
writer.WriteElementString("link", "http://www.mysite.com/");

using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
{
    SqlCommand cmd = new SqlCommand("SELECT * FROM vwXMLFeedData", conn);

    conn.Open();

    using (SqlDataReader rdr = cmd.ExecuteReader())
    {
        while (rdr.Read())
        {
            writer.WriteStartElement("item");
            writer.WriteElementString("title", rdr["Title"].ToString());
            writer.WriteElementString("link", rdr["URL"].ToString());
            writer.WriteEndElement();
        }
    }
}

writer.WriteEndElement();
writer.WriteEndElement();
writer.WriteEndDocument();
writer.Close();  

我想缓存所有 XML 数据,这样我就不需要每次都进行数据库调用,但我不确定如何使用 XmlTextWriter 进行操作。这里最好的策略是什么?

【问题讨论】:

  • 仅供参考,您不应该使用new XmlTextWriter()。自 .NET 2.0 以来,它已被弃用。请改用XmlWriter.Create()

标签: c# .net asp.net xml


【解决方案1】:

如果你想把它缓存在内存中,那么创建一个MemoryStream 并写入它。因此,您初始化编写器的代码将变为:

MemoryStream CacheStream = new MemoryStream();
XmlTextWriter writer = new XmlTextWriter(CacheStream, Encoding.UTF8);

填充流的代码保持不变,除了在关闭编写器之前,您需要保存流的缓冲区和大小:

writer.Flush();
long CachedDataSize = CacheStream.Position;
byte[] CachedData = CacheStream.Buffer;
writer.Close();

或者,如果您想缓存到文件,只需创建一个FileStream 并将 XML 写入其中。

无论哪种情况,只要您想向用户发送信息,您就可以从缓存数据中读取。

【讨论】:

    【解决方案2】:

    我建议不要试图弄清楚如何缓存 XmlTextWriter,而是以另一种方式看待它。

    例如,您可以写入临时位置,然后从该位置处理后续请求。

    您需要弄清楚如何检测缓存数据是否旧。

    【讨论】:

      【解决方案3】:

      不要写到Response.OutputStream,而是使用MemoryStream - 您可以将其转换为缓存字符串,然后将其输出到OutputStream

      【讨论】:

        【解决方案4】:

        您所要求的 - 一种避免进行数据库调用的方法 - 主要意味着缓存 数据库结果,而不是 XmlTextWriter 输出。

        如何缓存这些结果取决于您。如果这些 db 查询结果真的只有一次呈现——也就是说,如果你只使用结果来发出 XML,然后对这些结果不做任何事情——那么缓存 XML 输出就相当于缓存数据库查询直接出结果。

        仅缓存结果的一种方法是执行以下操作:

        private Dictionary<String,String> cache;
        private void FillCache()
        {
            using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
            {
                SqlCommand cmd = new SqlCommand("SELECT * FROM vwXMLFeedData", conn);
        
                conn.Open();
                cache = new Dictionary<String,String>();
                using (SqlDataReader rdr = cmd.ExecuteReader())
                {
                    while (rdr.Read())
                    {
                        cache.Add(rdr["Title"].ToString(), rdr["URL"].ToString());
                    }
                }
            }
        }
        

        然后,在渲染 XML 时:

        XmlTextWriter writer = new XmlTextWriter(Response.OutputStream, Encoding.UTF8);
        writer.WriteStartDocument();
        
        writer.WriteStartElement("rss");
        writer.WriteAttributeString("version", "2.0");
        
        writer.WriteStartElement("channel");
        writer.WriteElementString("title", "MyTitle");
        writer.WriteElementString("link", "http://www.mysite.com/");
        if (cache==null)
            FillCache();
        
        foreach (var kvp in  cache)
        {
            writer.WriteStartElement("item");
            writer.WriteElementString("title", kvp.Key);
            writer.WriteElementString("link", kvp.Value);
            writer.WriteEndElement();
        }
        
        writer.WriteEndElement();
        writer.WriteEndElement();
        writer.WriteEndDocument();
        writer.Close();  
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-07-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多