簡體   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