He tenido un problema con un servidor Windows 2008 y SQL Server 2012, el problema es que las aplicaciones que se conectan no cierran las conexiones y el servidor se acaba saturando, después de un uso intensivo el servicio SQL Server dejó de responder y devolvía este mensaje:

Microsoft OLE DB Provider for OCBC Drivers error ‘80004005’

[Microsoft][SQL Server Native Client 11.0]Client unable to entablish connection because an error was encountered during handshakes before login. Common causes include client attempting to connect to an unsupported version of SQL Server, server too busy to accept new connections or a resource limitation (memory or maximun allowed connections) on the server.

SQL server nos provee de muchisima información a través de consultas con Transact-SQL, por ejemplo a veces podemos tener un exceso de conexiones llegado a saturar el servidor «too busy» y para saber cuales son y poder determinar el problema necesitamos saber cuales existen actualmente, para ello podemos utilizar la sigueinte consulta (query):

SELECT status, memory_usage, 
cpu_time, last_request_start_time, last_request_end_time
FROM  
sys.dm_exec_sessions 
GO

Si queremos podemos filtrar por el usuario «SA» que se está conectando y por el estado de las conexiones, en este caso status =’sleeping’

SELECT status, memory_usage, cpu_time, 
last_request_start_time, last_request_end_time

FROM  
sys.dm_exec_sessions 

WHERE ((login_name = 'sa') and (status = 'sleeping'))

Ahora vamos a añadir un dato más a la consulta, el tiempo entre el comienzo de su última petición y el final de su última petición y lo ordenaremos por ese dato, aqui está la consulta, vamos a mostrarlo en segundos.

SELECT status, memory_usage, cpu_time, 
last_request_start_time,last_request_end_time, 
(datediff(SECOND,last_request_start_time,  last_request_end_time)) as duracion

FROM sys.dm_exec_sessions 

ORDER BY duracion DESC

Y ahora combinamos todas, vamos a mostrar las conexiones de «sa» en estado «sleeping» cuanto tiempo han tardado desde la ultima petición y ordenado por ese campo, aquí la tenéis:

SELECT status, memory_usage, cpu_time, 
last_request_start_time,last_request_end_time, 
(datediff(SECOND,last_request_start_time,  last_request_end_time)) as duracion

FROM sys.dm_exec_sessions 

WHERE ((login_name = 'sa') and (status = 'sleeping'))

ORDER BY duracion DESC

RESULTADO:

sql_server_sesions

Con estas consultas podremos determinar desde que aplicación o sitio web provienen las conexiones excesivas y revisar su programación para solucionarlo.