2009-09-27 6 views
4

J'utilise VSTS 2008 + C# .Net + 3.5 + ADO.Net pour développer une application de la console pour faire une copie d'insertion en bloc.propriété SqlBulkCopy.BulkCopyTimeout

Je veux utiliser les deux lots d'insertion en bloc et la propriété en vrac de délai d'attente d'insertion. Pour la propriété BulkCopyTimeout, je suis confus et je veux savoir si elle s'applique à l'ensemble de la masse ou s'applique uniquement à chaque lot de la masse?

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

merci à l'avance, George

Répondre

7

Recherche et lecture des messages de blog et les messages du forum sur le Web semble indiquer l'SqlBulkCopyTimeout ne fait applique pas à l'opération, mais à chaque lot dans l'opération.

Les docs MSDN n'est pas tout à fait clair sur ce point, mais la plupart des postes semblent indiquer que le délai d'attente applicable au lot. Diminuer la taille du lot et/ou augmenter le SqlBulkCopyTimeout semble être la solution aux problèmes de timeout dans la plupart des cas.

Voir cette forum post as an example.

Marc

+0

Je définis le délai d'expiration à 120 secondes. Toute mon opération en vrac durera 1 heure et chaque lot en vrac prendra environ 20 secondes. Je n'ai jamais eu de problème de timeout. Dans vos commentaires, je devrais expérimenter le délai d'attente, car 1 heure> 120 secondes? – George2

+0

Merci pour votre mise à jour, Marc! Mon autre confusion est, la copie en bloc a deux phases liées pour chaque lot - (1) lire à partir de la source et (2) écrire à la desination. Pensez-vous que cela signifie que les deux (1) et (2) de chaque lot ne peuvent pas dépasser BulkCopyTimeout? Ou cela signifie que la somme de (1) et (2) de chaque lot ne peut pas dépasser BulkCopyTimeout? – George2

+1

@ George2: très honnêtement: je ne sais pas. Les docs ne sont pas très concluants sur celui-ci, désolé. –

2

Il applique à l'opération pour un lot. Vous devez également vous assurer que le délai d'expiration de vos connexions est également défini. J'ai déjà atteint le délai d'expiration, je l'ai défini sur la copie en bloc et j'ai découvert à la dure que le délai d'expiration de la connexion est également important.

Il semble que le concept de l'opération entière est drôle. S'il finit par attendre plus que le délai d'attente, il échouera à tout moment. En d'autres termes, si la lecture d'un lot prend plus de temps que le délai, il échouera, mais si la somme de toutes les lectures est> timeout vous êtes d'accord. Si l'écriture d'un lot prend trop de temps, elle échouera également.

Mais il semble lot par lot, pas la chose.

+1

Je définis le délai d'attente à 120 secondes. Toute mon opération en vrac durera 1 heure et chaque lot en vrac prendra environ 20 secondes. Je n'ai jamais eu de problème de timeout. Dans vos commentaires, je devrais expérimenter le délai d'attente, car 1 heure> 120 secondes? – George2

+0

Mike, existe-t-il des documents officiels mentionnant la signification de BulkCopyTimeout qui s'applique à la fois à chaque lot lu et à chaque lot écrit? Appréciez si vous pouviez fournir un lien. Merci! – George2

+1

@ George2 pas que je sache. Je me base sur des preuves empiriques apprises en frappant le temps mort. Désolé que mon premier passage à la réponse était trompeur. –

2

BulkCopyTimeout: Par défaut, il est 30 secondes

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

BatchSize: Par source de données entière par défaut est un lot

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

Pour plus de détails, voir ce lien: Timeout expired with SqlBulkCopy

Nous obtenons cette exception "Timeout expired." si l'application ne peut pas insérer la source de données en 30 secondes.

0

Il n'est pas facile de trouver le délai d'attente idéal pour le bulkcopy; Si vous choisissez un délai d'attente trop court, vous ne devez pas sélectionner une taille de lot importante car des erreurs de dépassement de délai peuvent se produire. D'un autre côté, si vous décidez de choisir une petite taille de lot, vous avez moins de chance d'avoir une erreur de timeout du serveur; Cependant, vous n'êtes pas sécurisé.

Ma recommandation est de définir le délai d'attente à illimité, à savoir (sqlBulkCopy.BulkCopyTimeout = 0), et essayez de choisir une taille de lot considérable pour votre copie en vrac. Au moins, vous ne pouvez pas avoir d'exception de timeout.