2009-12-13 46 views
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。

優化幫助將不勝感激。

回答

0

對於大對象圖,請先嚐試序列化到磁盤上的文件,然後將FileStream傳遞到SqlXmL。

+0

我將採用HybridStream方法 - 我認爲它提供了兩全其美的優點 - 爲小文件(所有事務的90%)提供高性能內存流,但爲那些大文件提供FileStream安全性。 – Gavin 2009-12-13 21:35:52

相關問題