Δεν δίνεις αρκετά στοιχεία για να καταλάβω τί ζητάς. Το keep-alive χρειάζεται όταν έχεις web applications ή dekstop εφαρμογές οι οποίες δεν κρατάνε συνέχεια ανοικτό ένα connection στη βάση. Αν σκεφτείς μάλιστα ότι αυτό είναι απλά σωστή τακτική, θα καταλάβεις ότι κατά κανόνα ο SQL Server δεν ξέρει ποιοί χρησιμοποιούν κάθε στιγμή την υπηρεσία. Στην περίπτωση αυτή ο χρήστης μπορεί να έχει ανοικτή την εφαρμογή ή να έχει κάνει login σε ένα web site κι ας μήν υπάρχει ανοικτή σύνδεση στη βάση. Για το λόγο αυτό πρέπει περιοδικά η εφαρμογή ή κάποιο javascript να λέει στο server "είμαι ακόμα εδώ". Δεν έχει νόημα ούτε να ανανεώνει ούτε να ελέγχει ο ίδιος ο SQL Server τον πίνακα των logged-on users, απλά γιατί δεν ξέρει ποιοί είναι και ποιοί δεν είναι logged on!
Μάλιστα, δεν υπάρχει καν λόγος να αποθηκεύεις τη λίστα των online χρηστών στη βάση. Μπορείς άνετα να κρατάς ένα shared array στη μνήμη όπου θα καταγράφεις ποιοί είναι online κάθε στιγμή. Σε μία web εφαρμογή μπορείς να αποθηκεύσεις αυτά τα στοιχεία στο Application State.
Ο SQL Server 2005 και μετά πάντως μπορεί να ελέγξει και να περιορίσει πόσα ταυτόχρονα connections μπορεί να έχει ανοιγμένα ο ίδιος χρήστης, αλλά αυτό είναι χρήσιμο μόνο αν ο κάθε χρήστης κρατάει συνέχεια ανοικτά τα connections του. Ουσιαστικά σε βολεύει μόνο αν η υπηρεσία που παρέχεις είναι η πρόσβαση στη βάση. Αυτό μπορείς να το πετύχεις με ένα logon trigger. Μάλιστα, το παράδειγμα του Books Online περιγράφει ακριβώς πως να περιορίσεις τον αριθμό connection ανά χρήστη. Το trigger έχει τη μορφή:
USE master;
GO
CREATE LOGIN login_test WITH PASSWORD = '3KHJ6dhx(0xVYsdf' MUST_CHANGE, CHECK_EXPIRATION = ON;
GO
GRANT VIEW SERVER STATE TO login_test;
GO
CREATE TRIGGER connection_limit_trigger
ON ALL SERVER WITH EXECUTE AS 'login_test'
FOR LOGON
AS
BEGIN
IF ORIGINAL_LOGIN()= 'login_test'
AND (SELECT COUNT(*) FROM sys.dm_exec_sessions
WHERE is_user_process = 1 AND
original_login_name = 'login_test') > 3
ROLLBACK;
END;
Το trigger αυτό ελέγχει τα connections μόνο για το χρήστη login_test αλλά μπορείς να αλλάξεις το Where σε WHERE is_user_process = 1 AND original_login_name = ORIGINAL_LOGIN() ) > 3
Σε κάθε περίπτωση όμως θα πρέπει να εξηγήσεις τί θέλεις να κάνεις, και όχι το πως, για να μπορέσεις να βρεις την απάντηση.
Παναγιώτης Καναβός, Freelancer
Twitter: http://www.twitter.com/pkanavos