我有一个页面,我只是在屏幕上写了一堆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进行数据库调用。什么是最好的策略?
答案 0 :(得分:4)
如果要将其缓存在内存中,请创建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写入其中。
在任何一种情况下,只要您想向用户发送信息,就可以从缓存的数据中读取。
答案 1 :(得分:0)
我建议不要试图弄清楚如何缓存XmlTextWriter,而是用另一种方式来看待它。
例如,您可以写入临时位置,然后从该位置提供后续请求。
您需要弄清楚如何检测缓存数据是否过旧。
答案 2 :(得分:0)
您可以将其转换为缓存字符串,然后将其输出到Response.OutputStream
,而不是写出OutputStream
,而不是{{1}}。
答案 3 :(得分:0)
您要求的是一种避免进行数据库调用的方法 - 主要意味着缓存数据库结果,而不是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();