connexion ouverte avant chaque non-requête ou une seule connexion pour l’ensemble?

Si j’ai environ 2000 record et que je fais une insertion multiple. Quelle méthode a une meilleure performance que l’autre?

  • connexion avec chaque insertion individuelle .et ferme après l’insertion.
  • une connexion pour l’ensemble et fermez la connexion à la fin. et que dire du délai de connexion dans ce cas.

Notes :

Le regroupement de connexions d’application rendra en grande partie cette question inutile, car les pools d’applications c # sont optimisés pour plusieurs appels à la même firebase database.

Cela dit, ce que je fais est conforme à la règle suivante:

Si vous pouvez ouvrir une connexion puis effectuer plusieurs opérations en utilisant la syntaxe “using”:

 using (SqlConnection connection = new SqlConnection(connectionSsortingng)) { connection.Open(); // Do work here; connection closed on following line. } 

Ensuite, maintenez la connexion ouverte et effectuez toutes vos opérations.

Cependant, si chaque enregistrement est manipulé puis sauvegardé de manière à ce que vous deviez ouvrir une nouvelle connexion à chaque point, ne vous inquiétez pas trop. Vous réaliserez tout de même d’excellents résultats avec le regroupement de connexions.

De MSDN:

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

Pour déployer des applications hautes performances, vous devez utiliser le regroupement de connexions. Lorsque vous utilisez le fournisseur de données .NET Framework pour SQL Server, vous n’avez pas besoin d’activer le regroupement de connexions car le fournisseur le gère automatiquement, bien que vous puissiez modifier certains parameters. Pour plus d’informations, consultez Regroupement des connexions SQL Server (ADO.NET).

Même si votre connexion n’est pas SQL, les fournisseurs de connexion intégrés aux autres sources se comportent de la même manière.

J’ai récemment fait un peu de bricolage avec une situation très similaire. J’avais une application qui insérait de 1 à quelques milliers d’enregistrements dans une firebase database MySQL.

Pour démontrer (à vous-même), le comportement du pool de connexions décrit par Magnus dans sa réponse, vous pouvez créer une application rapide. Avec un bouton et sur l’événement click, ouvrez (puis .close ()) une connexion à votre firebase database, puis cliquez sur le bouton pour “rouvrir” la connexion plusieurs fois par la suite. (Assurez-vous de vous donner quelques informations afin de savoir quand (et si) .open () a réussi.) Vous remarquerez que la connexion initiale prend quelques secondes, mais les tentatives suivantes sont très rapides lorsque la connexion est extraite du pool.

Sur la base de mes souhaits, nous avons fini par créer une insertion “en bloc” en générant une grande instruction d’insertion de manière dynamic, pour une approche “tout ou rien” plutôt qu’une instruction d’insertion individuelle. À un moment donné, j’avais deux versions de notre programme utilisant des inserts individuels, ainsi que l’approche en vrac. Dans notre cas , je n’ai pas vraiment vu de différence de performances notable. (Pour être juste, il n’y avait pas une tonne de travail fait soit)

Le comportement par défaut d’une connexion est qu’il est ajouté à un pool. Ainsi, lorsque Close() appelé, il n’est pas vraiment fermé, mais vient d’être publié dans le pool. Lorsque Open() est appelé sur une nouvelle connexion, une connexion ouverte existante est sélectionnée dans le pool.
Si le regroupement est désactivé, il est préférable d’avoir une connexion ouverte pendant l’insertion complète plutôt que de la fermer après chaque insertion.