[英]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.