当SQL Server数据库中有3亿行时,使用SqlBulkCopy超时已过期
在数据库中现有183M行的特定条件下使用SQLBulkCopy时,在SQL Server数据库中插入约15000行并没有任何问题 但当数据库中存在3亿行时,我遇到了一个例外: 超时已过期。操作完成前已过超时时间,或者服务器没有响应 请注意,没有约束或任何东西,它只是一个非规范化的表当SQL Server数据库中有3亿行时,使用SqlBulkCopy超时已过期,sql,timeout,sqlbulkcopy,Sql,Timeout,Sqlbulkcopy,在数据库中现有183M行的特定条件下使用SQLBulkCopy时,在SQL Server数据库中插入约15000行并没有任何问题 但当数据库中存在3亿行时,我遇到了一个例外: 超时已过期。操作完成前已过超时时间,或者服务器没有响应 请注意,没有约束或任何东西,它只是一个非规范化的表 using (var sqlBulkCopy = new SqlBulkCopy(sqlConn, SqlBulkCopyOptions.TableLock, null)) {
using (var sqlBulkCopy = new SqlBulkCopy(sqlConn, SqlBulkCopyOptions.TableLock, null))
{
sqlBulkCopy.ColumnMappings.Add(SqlServerDatabaseStrings.SQL_FIELD_HISTORY_PARMETER_ID,
SqlServerDatabaseStrings.SQL_FIELD_HISTORY_PARMETER_ID);
sqlBulkCopy.ColumnMappings.Add(SqlServerDatabaseStrings.SQL_FIELD_SOURCE_TIMESTAMP,
SqlServerDatabaseStrings.SQL_FIELD_SOURCE_TIMESTAMP);
sqlBulkCopy.ColumnMappings.Add(SqlServerDatabaseStrings.SQL_FIELD_VALUE_STATUS,
SqlServerDatabaseStrings.SQL_FIELD_VALUE_STATUS);
sqlBulkCopy.ColumnMappings.Add(SqlServerDatabaseStrings.SQL_FIELD_ARCHIVE_STATUS,
SqlServerDatabaseStrings.SQL_FIELD_ARCHIVE_STATUS);
sqlBulkCopy.ColumnMappings.Add(SqlServerDatabaseStrings.SQL_FIELD_INTEGER_VALUE,
SqlServerDatabaseStrings.SQL_FIELD_INTEGER_VALUE);
sqlBulkCopy.ColumnMappings.Add(SqlServerDatabaseStrings.SQL_FIELD_DOUBLE_VALUE,
SqlServerDatabaseStrings.SQL_FIELD_DOUBLE_VALUE);
sqlBulkCopy.ColumnMappings.Add(SqlServerDatabaseStrings.SQL_FIELD_STRING_VALUE,
SqlServerDatabaseStrings.SQL_FIELD_STRING_VALUE);
sqlBulkCopy.ColumnMappings.Add(SqlServerDatabaseStrings.SQL_FIELD_ENUM_NAMEDSET_NAME,
SqlServerDatabaseStrings.SQL_FIELD_ENUM_NAMEDSET_NAME);
sqlBulkCopy.ColumnMappings.Add(SqlServerDatabaseStrings.SQL_FIELD_ENUM_NUMERIC_VALUE,
SqlServerDatabaseStrings.SQL_FIELD_ENUM_NUMERIC_VALUE);
sqlBulkCopy.ColumnMappings.Add(SqlServerDatabaseStrings.SQL_FIELD_ENUM_TEXTUAL_VALUE,
SqlServerDatabaseStrings.SQL_FIELD_ENUM_TEXTUAL_VALUE);
sqlBulkCopy.DestinationTableName =
SqlServerDatabaseStrings.SQL_TABLE_HISTORYSAMPLEVALUES;
sqlBulkCopy.WriteToServer(historySampleValuesDataRow);
sqlBulkCopy.Close();
}
对正在发生的事情有什么想法吗?顺便说一句,SQL Server标准是我正在使用的您的sqlBulkCopy对象上有两个属性可以帮助您
- BulkCopyTimeout:这是超时值,默认为30秒。将此值设置为0以完全禁用超时
- BatchSize:不是直接在表中插入300MM,而是以成批大小插入记录,可能是1MM/次,以防止超时问题(并稍微减轻加载)