【问题标题】:How to efficiently stream an object graph as xml to sql server如何有效地将对象图作为 xml 流式传输到 sql server
【发布时间】:2009-12-13 16:23:54
【问题描述】:

我有一个需要序列化为 xml 并保存到 Sql Server 行的对象图。我有一个 xml 数据类型的表,我一直在使用 SqlXml 数据类型,为它提供了一个内存流。

这在大多数情况下都很好用。但是,如果我的对象图特别大(大小约为 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。这基本上将 MemoryStream 分配给某个任意限制,当达到该限制时,它会为剩余部分创建一个 FileStream。

我们将不胜感激优化帮助。

【问题讨论】:

    标签: c# sql xml-serialization


    【解决方案1】:

    对于大型对象图,首先尝试序列化为磁盘上的文件,然后将 FileStream 传递给 SqlXmL。

    【讨论】:

    • 我将采用 HybridStream 方法 - 我认为它提供了两全其美的优势 - 小文件的高性能内存流(占所有事务的 90%),但 FileStream 的安全性对于大文件那些。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-12
    • 2013-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-16
    相关资源
    最近更新 更多