繁体   English   中英

如何缓存XmlTextWriter数据?

[英]How to cache XmlTextWriter data?

我有一个页面,我只是在屏幕上写一堆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进行处理。 最好的策略是什么?

如果要在内存中缓存它,则创建一个MemoryStream并将其写入。 因此,用于初始化writer的代码将变为:

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写入其中。

在任何一种情况下,只要要将信息发送给用户,就可以从缓存的数据中读取信息。

我建议您不要尝试找出如何缓存XmlTextWriter的方法,而应该用另一种方式查看它。

例如,您可以写入一个临时位置,然后为该位置提供后续请求。

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

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

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

如何缓存这些结果取决于您。 如果确实只有这些数据库查询结果的一个呈现-也就是说,如果仅使用结果来发出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();  

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM