Microsoft Sync Framework 2.1 большие данные возвращает время ожидания соединения
Привет я пытаюсь синхронизировать 3 таблицы с 2 базами данных на разных серверах.
Таблицы довольно большие, всего 5029513 строк, размер данных 1,45 ГБ:
Когда я пытаюсь синхронизировать клиент и сервер с пустыми данными таблицы, это успешно, так что нет ничего плохого в соединении.
Я пытался оставить сценарий работающим в течение ночи с установленным временем ожидания команды 36000 секунд, но когда я проснулся, я получил исключение тайм-аута соединения.
Трассировки стека:
vid System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
vid System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
vid System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error)
vid System.Data.SqlClient.TdsParserStateObject.ReadSniSyncOverAsync()
vid System.Data.SqlClient.TdsParserStateObject.TryReadNetworkPacket()
vid System.Data.SqlClient.TdsParserStateObject.TryPrepareBuffer()
vid System.Data.SqlClient.TdsParserStateObject.TryReadByte(Byte& value)
vid System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
vid System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout, Boolean asyncWrite)
vid System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite)
vid System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
vid Microsoft.Synchronization.Data.SqlServer.SqlSyncTrackingTableHelper.PopulateFromBaseTable(SqlTransaction trans)
vid Microsoft.Synchronization.Data.SqlServer.SqlSyncTableProvisioning.Apply(SqlTransaction trans)
vid Microsoft.Synchronization.Data.SqlServer.SqlSyncScopeProvisioning.ApplyScope(SqlConnection connection)
vid Microsoft.Synchronization.Data.SqlServer.SqlSyncScopeProvisioning.ApplyInternal(SqlConnection connection)
vid Microsoft.Synchronization.Data.SqlServer.SqlSyncScopeProvisioning.Apply()
vid itsperfect.ResponseHandler.Syncronization.Program.Main() i c:\Dev\TFS\itsperfect\Web\ResponseHandler\Main\src\itsperfectResponseHandler\itsperfect.ResponseHandler.Syncronization.Test\Program.cs:rad 45
vid System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
vid System.AppDomain.nExecuteAssembly(RuntimeAssembly assembly, String[] args)
vid System.Runtime.Hosting.ManifestRunner.Run(Boolean checkAptModel)
vid System.Runtime.Hosting.ManifestRunner.ExecuteAsAssembly()
vid System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext, String[] activationCustomData)
vid System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext)
vid System.Activator.CreateInstance(ActivationContext activationContext)
vid Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone()
vid System.Threading.ThreadHelper.ThreadStart_Context(Object state)
vid System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
vid System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
vid System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
vid System.Threading.ThreadHelper.ThreadStart()
Что я могу сделать, чтобы сделать эту работу? Клиент - это "SQL Server 2008", а сервер - "SQL Server 2005 с пакетом обновления 3"
Это код, который я использую, и он останавливается на serverProvision.Apply ():
class Program
{
static void Main()
{
//setup scope name
const string scopeName = "EmailSyncDBScope";
//setup the connections
var serverConn = new SqlConnection(ConfigurationManager.ConnectionStrings["ServerConnection"].ConnectionString);
var clientConn = new SqlConnection(ConfigurationManager.ConnectionStrings["ClientConnection"].ConnectionString);
var serverProvision = new SqlSyncScopeProvisioning(serverConn);
serverProvision.CommandTimeout = int.Parse(ConfigurationManager.AppSettings.Get("SyncCommandTimeout"));
//provision server
if (!serverProvision.ScopeExists(scopeName))
{
var serverScopeDesc = new DbSyncScopeDescription(scopeName);
// add table
var emailTableDesc = SqlSyncDescriptionBuilder.GetDescriptionForTable("Email", serverConn);
var emailMessageTableDesc = SqlSyncDescriptionBuilder.GetDescriptionForTable("Email_Message", serverConn);
var emailStatusTableDesc = SqlSyncDescriptionBuilder.GetDescriptionForTable("Email_Status", serverConn);
serverScopeDesc.Tables.Add(emailTableDesc);
serverScopeDesc.Tables.Add(emailMessageTableDesc);
serverScopeDesc.Tables.Add(emailStatusTableDesc);
serverProvision.PopulateFromScopeDescription(serverScopeDesc);
//apply the scope definition
Console.WriteLine("Applying server provision.");
serverProvision.Apply();
}
//provision client
var clientProvision = new SqlSyncScopeProvisioning(clientConn);
clientProvision.CommandTimeout = int.Parse(ConfigurationManager.AppSettings.Get("SyncCommandTimeout"));
if (!clientProvision.ScopeExists(scopeName))
{
//get scope description from server
var scopeDesc = SqlSyncDescriptionBuilder.GetDescriptionForScope(scopeName, serverConn);
clientProvision.PopulateFromScopeDescription(scopeDesc);
//apply the scope definition
Console.WriteLine("Applying client provision.");
clientProvision.Apply();
}
// create the sync orchestrator
var syncOrchestrator = new SyncOrchestrator();
//setup providers
var localProvider = new SqlSyncProvider(scopeName, clientConn);
var remoteProvider = new SqlSyncProvider(scopeName, serverConn);
syncOrchestrator.LocalProvider = localProvider;
syncOrchestrator.RemoteProvider = remoteProvider;
Console.WriteLine("Getting sync direction order settings.");
var syncDirectionOrder = GetSyncDirectionOrder(ConfigurationManager.AppSettings.Get("SyncDirectionOrder"));
// set sync direction
syncOrchestrator.Direction = syncDirectionOrder;
// execute the synchronization process
SyncAndEmail(syncOrchestrator, bool.Parse(ConfigurationManager.AppSettings.Get("SendMail")));
}
private static SyncDirectionOrder GetSyncDirectionOrder(string syncDirectionOrder)
{
SyncDirectionOrder returnValue;
switch (syncDirectionOrder)
{
case "Upload" :
returnValue = SyncDirectionOrder.Upload;
break;
case "Download" :
returnValue = SyncDirectionOrder.Download;
break;
case "UploadAndDownload" :
returnValue = SyncDirectionOrder.UploadAndDownload;
break;
case "DownloadAndUpload" :
returnValue = SyncDirectionOrder.DownloadAndUpload;
break;
default:
returnValue = SyncDirectionOrder.Upload;
break;
}
return returnValue;
}
private static void SyncAndEmail(SyncOrchestrator syncOrchestrator, bool sendEmail)
{
Console.WriteLine("Syncronizing.");
var syncStats = syncOrchestrator.Synchronize();
var content = new StringBuilder();
content.Append("<p><h2>Syncronization report:</h2></p>");
content.Append("<strong>Start Time:</strong> " + syncStats.SyncStartTime + "</br>");
content.Append("<strong>Total Changes Uploaded:</strong> " + syncStats.UploadChangesTotal + "</br>");
content.Append("<strong>Total Changes Uploaded and Applied:</strong> " + syncStats.UploadChangesApplied + "</br>");
content.Append("<strong>Total Changes Uploaded and Failed:</strong> " + syncStats.UploadChangesFailed + "</br>");
content.Append("<strong>Total Changes Downloaded:</strong> " + syncStats.DownloadChangesTotal + "</br>");
content.Append("<strong>Total Changes Downloaded and Applied:</strong> " + syncStats.DownloadChangesApplied + "</br>");
content.Append("<strong>Total Changes Downloaded and Failed:</strong> " + syncStats.DownloadChangesFailed + "</br>");
content.Append("<strong>Complete Time:</strong> " + syncStats.SyncEndTime);
if (sendEmail)
{
var emailModel = new EmailModel
{
MailTo = ConfigurationManager.AppSettings.Get("MailTo").ToLower(),
MailFrom = ConfigurationManager.AppSettings.Get("MailFrom").ToLower(),
Subject = ConfigurationManager.AppSettings.Get("MailSubject"),
Content = content.ToString()
};
var mailClient = new MailServiceClient();
Console.WriteLine("Sending email.");
mailClient.SendFromExtreme(emailModel.MailFrom, new[] { emailModel.MailTo }, emailModel.Subject, emailModel.Content, "", new[] { "Syncronization" }, EmailType.ControlTask, 0, false);
}
}
}
1 ответ
Вы можете установить CommandTimeout на SqlCommand напрямую.
Подробнее читайте здесь, Sync framework TimeOut