로깅 데이터베이스에 많은 수의 항목을 삽입하기 위해 SqlBulkCopier를 사용합니다.SQLBulkCopy를 사용하여 데이터베이스에 쓰려고하기 전에 데이터 테이블의 데이터 유효성 확인
프로그램의 레이아웃은 : 그것은 네트워크 (다른 서버)로부터 데이터 스트림을 수신
그러므로 스트림을 파싱 Log
오브젝트를 만든다. (200 - 400) 초. 그런 다음 각 로그를 Sql DataTable 개체에 추가합니다.
다음으로 카운터를 증가시킵니다. 일단 10000 개의 로그가 있으면 sqlBulkInsert를 수행합니다.
이제 문제는 행 중 하나가 SQL 유효성 검사에 맞지 않으면 하나의 필드가 길어서 나머지 모든 로그가 느슨해 진 경우입니다.
내가 추가하는 각 로그 항목에 대해 데이터 테이블에서 유효성 검사를 호출 할 방법이 없으므로 유효하지 않은 항목을 건너 뛰고 유효한 모든 항목을 안전하게 유지할 수 있습니다.
현재 한 항목을 시간에 삽입하고 있는데 실패하면 무시하고 다음 항목을 계속 수행합니다. 그러나 이것은 분명히 SqlBulk Copy의 장점과 성능상의 이점을 상쇄합니다.
일부 코드 :
private DataTable _logTable;
public void AddLog(Log log)
{
if (log.serverId != null || log.serverId > 1)
{
try
{
_logTable.Rows.Add(log.logId, log.messageId, log.serverId, log.time, log.direction, log.hasRouting,
log.selfRouting, log.deviceType, log.unitId, log.accountCode, log.clientId, log.data);
if (_logBufferCounter++ > BufferValue)
{
_logBufferCounter = 0;
using (var sbc = new SqlBulkCopy(_connectionString, SqlBulkCopyOptions.TableLock))
{
sbc.DestinationTableName = "dbo.Logs";
sbc.BulkCopyTimeout = 0;
sbc.WriteToServer(_logTable);
_logTable.Clear();
sbc.Close();
}
}
}
catch (Exception e)
{
Log.Error("Failed to write bulk insert for LOG Table", e);
_logTable.Clear();
}
}
else
{
Log.Error("Server Id is null for LOG: " + LogToString(log));
}
}
Log 개체를 만드는 동안 필드의 유효성을 검사하지 않는 이유는 무엇입니까? ? SqlBulkCopy에있을 때까지 정확해야합니다. – slugster