Automatisches Schließen von SQL-Connections

Osiris1

Lt. Junior Grade
Registriert
Feb. 2008
Beiträge
351
Hi,

gibt es eine Möglichkeit SQL-Serverseitig alte Connections automatisch zu schließen?

Der Hintergrund ist der, dass der Applikationsdienst ein Problem hat und im Sekundentakt neue Connections zum DB-Server öffnet aber nicht mehr schließt. Nach ein paar Stunden bis Tagen steigt dann der SQL Server aus weil er keinen neuen Connections mehr annimmt. Das ist ein Problem des Dienstes. Aber auf den hab ich leider keinen Einfluss. Daher würde ich gerne, bis der Applikationsdienst repariert ist, diese Connections nach ein paar Stunden automatisch schließen.

Es geht um einen Microsoft SQL Server 2016. (Auto Close = True)
TCPView zeigt mir die Connections als "Established" an

Gibt es da eine Möglichkeit? Google hat da leider wenig geholfen - evtl gibt es keine Möglichkeit die Verbindungen datenbankseitig zu schließen.

danke und lg
 
Ich kann da keinen direkten Zusammenhang zu meinem Problem sehen.
Auto Close = false ändert doch nichts daran, dass die Verbindungen offen bleiben?
 
Der Applikationsdienst wird doch sicher einen bestimmten Account verwenden, um Verbindungen zu öffnen? Im ersten Schritt könnte man dort schon mal die maximale Anzahl paralleler Verbindungen für den Account einschränken.

Wenn du einfach nur alle Connections abschießen willst, kann man das mit einem sehr unschönen kill-Script machen:

https://stackoverflow.com/questions...than-restricted-user-rollback/7201350#7201350
 
Der Applikationsdienst läuft unter einem Service-Account (Active Directory). Ist das eine Accounteintellung? Oder limitiere ich die Verbindungen am SQL-Server?
Außerdem: Würde das mein Problem wirklich beheben? Wenn der SQL-Server dem Applikationsdienst/Account weitere Verbindungen verweigert, hängt die Applikation doch erst wieder?

@aLca: Auto Close ist bereits true. Das steht in meinem ersten Posting.
 
Dann bleibt wohl nichts außer regelmäßig die Verbindungen abzuschießen, bis der Applikationsdienst ordentlich mit der Datenbank interagiert.

Die AUTO_CLOSE Option ist für das Szenario aber eigentlich auch nicht die richtige Option. Diese bewirkt eigentlich nur, dass Datenbanken (also die Dateien die zu einer Datenbank gehören) freigegeben und geschlossen werden, wenn keine aktive Verbindung mehr besteht. Diese schließt aber nicht automatisch bestehende Verbindungen zu einer Datenbank.

https://support.microsoft.com/de-de...lines-for-setting-the-auto-close-database-opt
 
Danke!

Hm... Dann sieht es wohl nach Kill Script aus. Da muss ich aber erst testen wie die Applikation reagiert. Wenn ich nicht nach Alter der Connections filtern kann (das muss ich mir erst ansehen), werden zwangsläufig auch aktive Verbindungen geschlossen. Das könnte ein Problem darstellen.

Zu den maximalen Verbindungen: Ist das eine Accounteinstellung? Oder eine Einstellung am SQL Server? (Evtl verwende ich eine Kombinationslösung...)
Ergänzung ()

Ich hab mal folgendes aus dem Stackoverflow kopiert:

USE [master];

DECLARE @kill varchar(8000) = '';
SELECT @kill = @kill + 'kill ' + CONVERT(varchar(5), session_id) + ';'
FROM sys.dm_exec_sessions
WHERE database_id = db_id('MyDB')

EXEC(@kill);

So wie ich das interpretiere geht es hier um die "session_id" die aus der Tabelle "sys.dm_exec_sessions" ausgelesen und nach "db_id" gefiltert wird.

In der Tabelle gibt es aber noch noch einige andere Spalten:
host_name
login_time
cpu_time
last_request_start_time
open_transaction_count

Ich glaube da kann ich sehr gut filtern welche verbindungen ich schließen will:
cpu_time = 0
open_transaction_count = 0
login_time < t + 6 Stunden
last_request_start_time < t + 4 Stunden

last_request_ende_time bringt mich nicht wirklich weiter, da dieser Zeitpunkt bei allen Verbindungen nur ein paar Minuten zurück liegt...
 
Noch eine Ergänzung:
Ja nach Anzahl der Verbindungen reicht die Länge 8000 für varchar nicht aus und es kommt zu Fehlern.

Daher:
Code:
DECLARE @kill varchar(8000) = '';
besser ersetzen durch
Code:
DECLARE @kill varchar(max) = '';
 
Zurück
Oben