2010-08-13 14 views
3

Je viens d'essayer de faire une simple modification de schéma à une table dans une base de données SQL Server (en utilisant l'outil de conception dans SMSS). Chaque fois que j'essayais de sauvegarder le changement, cela arrivait toujours. Je me demandais si cela était dû aux connexions existantes qui «bloquaient» la table. J'ai décidé de tuer les connexions en tant qu'expérience. J'ai interrogé master..sysprocesses pour obtenir les spids actuels pour cette base de données, et les ai détruits un par un jusqu'à ce que je puisse sauvegarder mon changement de schéma. (Pas très scientifique, mais je suis loin d'être un expert avec SQL Server). Effectivement, quand j'avais tué tous les spids (sauf celui qui était moi utilisant SMSS), j'étais capable d'enregistrer le changement de schéma.Quelle est la relation entre SqlConnections ouvertes dans l'application cliente et les processus dans SQL Server?

Je voudrais poser une question sur la relation entre ADO.NET SqlConnections et spids. Par exemple, si l'application client appelle Open() sur un objet SqlConnection, devrais-je voir un autre spid dans master..sysprocesses? Qu'en est-il si j'appelle Close() sur cette SqlConnection? Le spid devrait-il disparaître?

Je suis sûr que ce n'est pas aussi simple, étant donné que je comprends qu'il existe une notion de regroupement de connexions, mais quelqu'un peut-il nous éclairer sur la façon dont cette relation fonctionne?

Merci

David

Répondre

1

Si la mise en commun = false dans la chaîne de connexion

SqlConnection.Open() et Close() va correspondre exactement à celles spids créé et détruit. Cela se traduit par des performances très lent :)

Si la mise en commun = true dans la chaîne de connexion

Appel SqlConnection.Open() utilisera soit une connexion physique existante de la piscine, ou en créer un nouveau si aucun sont disponibles dans le bassin.

La création d'une nouvelle connexion physique va créer un nouveau SPID, qui apparaîtra sous la forme d'une nouvelle ligne dans sys.sysprocesses et sys.dm_exec_connections. La réutilisation d'une connexion physique existante réutilisera simplement un SPID existant de sorte que SqlConnection.Open() n'apportera aucune modification visible dans ces tables côté serveur. Cependant, il peut être détecté en utilisant SQL Profiler ou XEvent en recherchant sp_reset_connection, qui est une procédure stockée appelée par SqlClient qui indique au serveur d'effacer l'état de connexion (par exemple, assurez-vous qu'il n'y a pas de transaction, etc.).

SqlConnection.Close() retournera généralement la connexion physique au pool, afin qu'il ne disparaisse pas du serveur. Les connexions physiques sont effectivement fermées de différentes manières sous le capot, comme en étant tué par le serveur tel que kill @spid et SqlConnection.ClearAllPools().

Espérons que ce soit assez de détails, y a-t-il autre chose que vous aimeriez savoir?

+0

Non, c'est exactement ce que je demandais. Je vous remercie! – David