SqlBulkCopy.BulkCopyTimeout свойство

Я использую VSTS 2008 + C # + .Net 3.5 + ADO.Net для разработки консольного приложения для копирования с массовой вставкой.

Я хочу использовать как пакетную массовую вставку, так и свойство тайм-аута массовой вставки. Что касается свойства BulkCopyTimeout, я сбит с толку и хочу знать, применяется ли оно ко всей массе или только к каждой партии массы?

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.bulkcopytimeout.aspx

заранее спасибо, Джордж


person George2    schedule 27.09.2009    source источник


Ответы (4)


Поиск и чтение некоторых сообщений в блогах и форумах в Интернете, похоже, указывает на то, что SqlBulkCopyTimeout действительно применяется не ко всей операции, а к каждому пакету в операции.

Документы MSDN не совсем ясны по этому поводу, но большинство сообщений, похоже, указывают на то, что тайм-аут применяется к пакету. Уменьшение размера пакета и / или увеличение SqlBulkCopyTimeout в большинстве случаев кажется решением проблемы тайм-аута.

См. В качестве примера сообщение на форуме .

Марк

person marc_s    schedule 27.09.2009
comment
Я установил таймаут на 120 секунд. Вся моя массовая операция продлится 1 час, а каждая массовая партия занимает около 20 секунд. Я никогда не сталкивался с проблемой тайм-аута. В ваших комментариях у меня должен быть тайм-аут, потому что 1 час ›120 секунд? - person George2; 27.09.2009
comment
Спасибо за сообщение, Марк! Моя дальнейшая путаница заключается в том, что массовое копирование имеет две связанные фазы для каждого пакета - (1) чтение из источника и (2) запись по назначению. Как вы думаете, означает ли это, что значения (1) и (2) каждой партии не могут превышать BulkCopyTimeout? Или это означает, что сумма (1) и (2) каждой партии не может превышать BulkCopyTimeout? - person George2; 27.09.2009
comment
@ George2: честно говоря: я не знаю. Извини, документы не совсем однозначные. - person marc_s; 27.09.2009
comment
Однако обычно, если вы не можете установить тайм-аут для части чтения и записи отдельно, то тайм-аут применяется ко всей операции (чтение + запись). - person marc_s; 27.09.2009
comment
Спасибо, Марк, меня тоже интересует тайм-аут соединения. Влияет ли время ожидания подключения после начала массового копирования? Я думаю, что тайм-аут соединения имеет значение только тогда, когда мы открываем соединение с базой данных в первый раз, после того, как мы установили соединение, тайм-аут соединения не влияет на массовое копирование (чтение + запись). Кстати: тайм-аут соединения, я имею в виду msdn.microsoft. ru / en-us / library / - person George2; 27.09.2009
comment
Тайм-аут подключения применяется только ко времени, необходимому для установления соединения с SQL Server. После подключения это больше не актуально. - person marc_s; 27.09.2009
comment
Спасибо, Марк, в ADO.Net нет настройки тайм-аута простоя соединения (простоя, я имею в виду, что если с соединением не выполняется никаких операций, соединение будет тайм-аутом)? - person George2; 27.09.2009
comment
@ George2: нет, когда соединение открыто, оно остается открытым, пока вы его специально не закроете. - person marc_s; 27.09.2009
comment
Спасибо, Марк, на вопрос дан ответ! - person George2; 27.09.2009

BulkCopyTimeout: по умолчанию 30 секунд.

sqlBulkCopy.BulkCopyTimeout = {time in seconds for one batch}

BatchSize: по умолчанию весь источник данных - это один пакет

sqlBulkCopy.BatchSize  = {no of rows you want to insert at once}

Для получения дополнительных сведений см. Эту ссылку: Истекло время ожидания с SqlBulkCopy

Мы получаем это исключение «Истекло время ожидания». если приложению не удалось вставить источник данных в течение 30 секунд.

person Abdul Saboor    schedule 21.11.2012

Это касается всей операции для одной партии. Вы также должны убедиться, что тайм-аут для ваших подключений установлен. Раньше я использовал тайм-аут, установил его для массового копирования и на собственном опыте выяснил, что тайм-аут соединения тоже имеет значение.

Кажется, забавная концепция всей операции. Если в любой момент он будет ждать больше тайм-аута, он завершится ошибкой. Другими словами, если чтение пакета занимает больше тайм-аута, оно завершится ошибкой, но если сумма всех чтений> тайм-аута, все в порядке. Если запись пакета занимает слишком много времени, она также завершится ошибкой.

Но кажется, что это партия за партией, а не целиком.

person Mike Two    schedule 27.09.2009
comment
Я установил таймаут на 120 секунд. Вся моя массовая операция продлится 1 час, а каждая массовая партия занимает около 20 секунд. Я никогда не сталкивался с проблемой тайм-аута. В ваших комментариях у меня должен быть тайм-аут, потому что 1 час ›120 секунд? - person George2; 27.09.2009
comment
Майк, есть ли какие-либо официальные документы, в которых упоминается, что значение BulkCopyTimeout применяется как к каждому пакетному чтению, так и к каждой пакетной записи? Буду признателен, если вы предоставите ссылку. Спасибо! - person George2; 27.09.2009
comment
@ George2, насколько мне известно. Я основываю это на эмпирических доказательствах, полученных при превышении тайм-аута. Извините, что мой первый ответ был неверным. - person Mike Two; 27.09.2009
comment
Спасибо! Мне также интересны ваши комментарии - вы должны убедиться, что тайм-аут соединения также установлен. Не могли бы вы объяснить, как тайм-аут соединения влияет на массовое копирование? Меня беспокоит то, что как только мы подключаемся к исходной / целевой базе данных, тайм-аут подключения никогда не будет иметь никакого эффекта. Тайм-аут соединения взимается только за то время, в течение которого мы можем установить соединение. Пожалуйста, поправьте меня, если я ошибаюсь. - person George2; 27.09.2009
comment
@ George2 - ты прав, тайм-аут соединения ведет себя так, как ты говоришь. Я просто вспоминал все, что пробовал, и не думал о том, что действительно помогло. - person Mike Two; 13.10.2009

Нелегко найти идеальный тайм-аут для массового копирования; если вы выберете небольшой тайм-аут, вам не следует выбирать большой размер пакета, поскольку могут возникнуть ошибки тайм-аута. С другой стороны, если вы решите выбрать небольшой размер пакета, у вас меньше шансов получить ошибку тайм-аута с сервера; однако вы не в безопасности.

Я рекомендую установить неограниченное время ожидания, а именно (sqlBulkCopy.BulkCopyTimeout = 0), и попытаться выбрать значительный размер пакета для массового копирования. По крайней мере, у вас не может быть исключения тайм-аута.

person Samuel L    schedule 04.03.2014