2008-09-17 7 views
3

Mein Arbeitsplatz hat Verkäufer, die eine Desktop-Anwendung eines Drittanbieters verwenden, die direkt einen Sql-Server verbindet, und die Software hinterlässt Hunderte von Schlafverbindungen für jeden Benutzer. Gibt es trotzdem diese Verbindung programmatisch zu löschen?So löschen Sie Verbindungen in Sql Server 2005

Antwort

2

Welche Version von SQL Server führen Sie aus? Sie können dazu eine gespeicherte Prozedur schreiben, die Daten von sp_who betrachten und dann die letzte Aktivität abschätzen. Es gibt eine "LastBatch" -Spalte, in der das letzte Mal etwas von diesem Benutzer gesendet wurde. Ich würde sagen, wenn das über eine Stunde alt ist (oder welches Intervall auch immer), führe einen KILL für diesen SPID aus.

Sie könnten dies tun in SQL 2005 wie folgt aus:

declare @spid int 
    , @cmd varchar(200) 
declare Mycurs cursor for 
select spid 
from master..sysprocesses 
where status = 'sleeping' 
and last_batch > dateadd(s, -1, getdate()) 
open mycurs 
fetch next from mycurs into @spid 
while @@fetch_status = 0 
begin 
    select @cmd = 'kill ' + cast(@spid as varchar) 
    exec(@cmd) 
    fetch next from mycurs into @spid 
end 
deallocate MyCurs 
1

Aber anstatt diese Prozesse manuell zu töten, sollte es nicht eine Möglichkeit, diese zu vermeiden? Ich habe das gleiche Problem in einem Projekt

In unserer Web-Anwendung führen wir einige Updates mit einem Web-Service (dh ein Programm ruft eine Webservice-Methode. Die Methode öffnet eine Verbindung, führt ein Update, commits und schließt die Verbindung using connection.close())

Im sqlserver mgmt Studio, wenn ich ein sp_who2 mache, sehe ich, dass die Verbindungen zunehmen, während die App läuft - tatsächlich mit der Rate von 1 Verbindung pro Updateausführung. UND der betroffene Teil ist, dass es die 100 kreuzt und dann nicht mehr Verbindungen in die db erlaubt. Benutzer können sich nicht anmelden, da die Programme fehlschlagen, da sie keine neuen Verbindungen mehr erhalten können.

So stellen Sie sicher, dass die Verbindungen wiederverwendet werden - Wir haben keinen Verbindungs-Pooling-Code geschrieben, der das standardmäßige Verbindungs-Pooling von ASP.net und Sqlserver verwendet. Warum werden die Verbindungen nicht wiederverwendet und warum verschwinden sie nicht, nachdem sie "geschlossen" sind? Kommt es darauf an, dass ein Webservice die Transaktion abwickelt?

Vielen Dank