3
我有一个对象图,我需要序列化到xml并保存到Sql Server行。我有一个XML数据类型的表,我一直在使用SqlXml数据类型,为它提供一个内存流。如何高效地将xml对象图流式传输到sql server
这在大部分情况下效果很好。但是,如果我的对象图形特别大(〜200兆大小),则会出现OutOfMemoryException。将对象图序列化为xml并将其流式传输到Sql Server最有效的方法是什么?这里是我的代码现在:
using (MemoryStream ms = new MemoryStream())
{
using (SqlConnection connection = new SqlConnection(this.Settings.GetConnectionString()))
{
connection.Open();
SqlCommand command = connection.CreateCommand();
command.CommandText = "INSERT_MESSAGE";
command.CommandType = System.Data.CommandType.StoredProcedure;
SqlParameter param = command.CreateParameter();
param.ParameterName = "@PARTITION_ID";
param.Direction = System.Data.ParameterDirection.Input;
param.DbType = System.Data.DbType.Int32;
param.Value = this.PartitionId;
command.Parameters.Add(param);
param = command.CreateParameter();
param.ParameterName = "@MESSAGE";
param.Direction = System.Data.ParameterDirection.Input;
param.DbType = System.Data.DbType.Xml;
XmlSerializer xs = new XmlSerializer(typeof(MessageContext));
xs.Serialize(ms, message);
param.Value = new System.Data.SqlTypes.SqlXml(ms);
command.Parameters.Add(param);
param = command.CreateParameter();
param.ParameterName = "@RETURN_VALUE";
param.Direction = System.Data.ParameterDirection.ReturnValue;
param.DbType = System.Data.DbType.Int32;
command.Parameters.Add(param);
command.ExecuteNonQuery();
if ((int)command.Parameters["@RETURN_VALUE"].Value == 1)
throw new IntegrationSystemException("Unknown error encountered while selecting the record count");
else
{
if (log.IsInfoEnabled)
log.InfoFormat("Saved message [{0}]", message.MessageId);
}
}
}
我使用的是“hybridstream”考虑像在这里找到:HybridStream。这基本上分配一个MemoryStream的一些任意限制,当这个限制被击中时,它为剩余创建一个FileStream。
优化帮助将不胜感激。
我将采用HybridStream方法 - 我认为它提供了两全其美的优点 - 为小文件(所有事务的90%)提供高性能内存流,但为那些大文件提供FileStream安全性。 – Gavin 2009-12-13 21:35:52