8

Tenemos un servicio web codificado en C# que hace muchas llamadas a la base de datos MS SQL Server 2005. El código usa el uso de bloques combinados con la agrupación de conexiones de C#.¿Por qué tantas sp_resetconnections para la agrupación de conexiones C#?

Durante una traza de SQL, vimos muchas, muchas llamadas a "sp_resetconnection". La mayoría de estos son cortos < 0.5 segundos, sin embargo, a veces recibimos llamadas que duran hasta 9 segundos.

Según lo que he leído sp_resetconnection está relacionado con la agrupación de conexiones y restablece básicamente el estado de una conexión abierta. Mis preguntas:

  • ¿Por qué una conexión abierta necesita su restablecimiento de estado?
  • ¿Por qué tantas de estas llamadas?
  • Lo que podría causar que una llamada a la conexión sp_reset tome un tiempo no trivial.

Esto es todo un misterio para mí, y agradezco cualquier y toda ayuda!

+0

Si tiene un seguimiento del generador de perfiles que muestra que sp_reset_connetion lleva mucho tiempo, ¿por qué no mira qué trabajo hizo ese cliente antes de la llamada? Eso debería darte una idea de qué estado se está derribando durante la llamada. – ahains

+0

posible duplicado de [¿Qué hace sp \ _reset \ _connection do?] (Http://stackoverflow.com/questions/596365/what-does-sp-reset-connection-do) –

Respuesta

12

El restablecimiento simplemente reinicia las cosas para que no tenga que volver a conectar para restablecerlas. Limpia la conexión de cosas como SET o USE, por lo que cada consulta tiene una pizarra borrosa.

La conexión aún se está reutilizando.He aquí un extensive list:

sp_reset_connection restablece los siguientes aspectos de una conexión:

  • Se restablece todos los estados de error y números (como @@ error)
  • que se detenga (contextos de ejecución) todos de la CE que son subprocesos hijo de un padre EC que ejecuta una consulta paralela
  • Esperará las operaciones de E/S pendientes que sobresalgan
  • Liberará los almacenamientos intermedios retenidos en el servidor b y la conexión
  • Será desbloquear todos los recursos de amortiguación que son utilizados por la conexión
  • Se liberará toda la memoria asignada propiedad de la conexión
  • Se borrará cualquier mesas de trabajo o temporales que se crean por la conexión
  • se matan todos los cursores globales propiedad de la conexión
  • se cerrará ningún mangos SQL-XML abiertos que están abiertos
  • se eliminará ninguna mesa de trabajo relacionados con SQL XML abiertos
  • se cerrará todos los sistemas de ta bles
  • Se cerrará todas las tablas de usuario
  • dejará caer todos los objetos temporales
  • Se abortará transacciones abiertas
  • Será desertar de una transacción distribuida cuando se alistaron
  • Será disminuir el recuento de referencia para los usuarios en la base de datos actual; que liberan compartida bloquear la base de datos
  • Se va a liberar bloqueos adquiridos
  • Será libera los mangos que pueden haber sido adquiridos
  • se restablecerá todas las opciones con sus valores por defecto
  • se restablecerá el valor de @@ recuento de filas
  • se restablecerá el valor de @@ identidad
  • se restablecerá las opciones de rastreo a nivel de sesión utilizando dbcc traceon()

sp_reset_connection no reajustará:

  • contexto de seguridad, por lo que las conexiones de los partidos conexión de la puesta en común sobre la base de la cadena de conexión exacta
  • Si ha introducido una función de aplicación usando sp_setapprole, ya que las funciones de aplicación no pueden ser revertidos
  • el nivel de aislamiento de transacción (!)
1

He aquí una explicación de What does sp_reset_connection do? que dice, en parte, "capas acceso a los datos de la API como ODBC, OLE-DB y SqlClient llamar al (interna) st ored procedure sp_reset_connection al reutilizar una conexión de un grupo de conexiones. Hace esto para restablecer el estado de la conexión antes de que se vuelva a utilizar. "Luego da algunos detalles de lo que hace el sproc del sistema. Es algo bueno.

1

Se llamará a sp_resetconnection cada vez que solicite una nueva conexión desde un grupo. Tiene que hacer esto ya que el grupo no puede garantizar al usuario (usted, el programador probablemente :) ha dejado la conexión en un estado apropiado. p.ej. Devolver una conexión anterior con transacciones sin compromiso sería ... malo.

El número de llamadas debe estar relacionado con el número de veces que recupera una nueva conexión.

En cuanto a algunas llamadas que requieren una cantidad de tiempo no trivial, no estoy seguro. Podría ser que el servidor está muy ocupado procesando otras cosas en ese momento. Podría haber retrasos en la red.

1

Básicamente las llamadas son la información de estado de limpieza. Si tiene CUALQUIER lector de datos abierto, tardará MUCHO más en aparecer. Esto se debe a que sus DataReaders solo tienen una fila, pero podrían extraer más filas. También deben borrarse cada uno antes de que pueda procederse al reinicio. Así que asegúrese de tener todo en el uso de las declaraciones() y no deje las cosas abiertas en algunas de sus declaraciones.

¿Cuántas conexiones totales tiene funcionando cuando esto sucede?

Si tiene un máximo de 5 y alcanza los 5, llamar a un restablecimiento se bloqueará y parecerá que lleva mucho tiempo. Realmente no lo es, solo está bloqueado esperando a que una conexión mancomunada esté disponible.

Además, si está ejecutando en SQL Express, puede bloquearse debido a requisitos de subprocesamiento muy fácilmente (también podría suceder en SQL Server completo, pero es mucho menos probable).

¿Qué sucede si desactiva la agrupación de conexiones?

Cuestiones relacionadas