LeKuchen: MS SQL auf Cluster, Probleme mit DB

Hallo zusammen,

ich habe hier Probleme mit dem Zugriff auf einen MS SQL Server.

Der SQL-Server läuft auf einem Cluster (zwei Rechner, ein gemeinsames Raidsystem), OS: Winows 2000 Adv Server. Zwei Webserver im Loadbalancingbetrieb greifen auf die Datenbanken zu, OS: Windows 2003 Server.

Problem: Der SQL-Server ist über Ping erreichbar, und über den Enterprise Manager zugreifbar, aber die Webserver geben als Meldung an, dass Sie den SQL-Server nicht finden können:

Fehler bei 'Database handling':
System.InvalidOperationException: Timeout abgelaufen. Der Timeout ist vor dem Anfordern einer Verbindung aus dem Pool abgelaufen. Möglicherweise werden alle Verbindungen im Pool bereits verwendet und die maximale Poolgröße wurde erreicht. at System.Data.SqlClient.SqlConnectionPoolManager.GetPooledConnection(SqlConnectionString options, Boolean& isInTransaction) at System.Data.SqlClient.SqlConnection.Open() at Content.Components.LayoutTemplate.genObject(XmlNode& pnd, XmlDocument& xmlDoc, XmlNode& xmlRoot)

Der SQL-Server sieht in der Aktuellen Aktivität ganz normal aus (Prozessinfo). Firewall ist auch nicht das Problem.

Sonst sind im Netz noch zwei DNS-Server (Primary und Secondary).

Die Ereignisprotokolle der Server geben auch keinen Aufschluss über den Fehler.

Ich weiss, dass die Informationen sehr dürftig sind, aber mehr weiss ich momentan auch nicht - unser Netzwerkadmin ist tollerweise krank...

Wäre für _jede_ Idee dankbar!

Gruss
LeKuchen

  1. Hi,

    Wäre für _jede_ Idee dankbar!

    schau Dir mal die aufgebauten, aktuellen Verbindungen an im SQLEM.

    Gruss,
    Ludger

  2. Hallo,

    Fehler bei 'Database handling':
    System.InvalidOperationException: Timeout abgelaufen. Der Timeout ist vor dem Anfordern einer Verbindung aus dem Pool abgelaufen. Möglicherweise werden alle Verbindungen im Pool bereits verwendet und die maximale Poolgröße wurde erreicht. at System.Data.SqlClient.SqlConnectionPoolManager.GetPooledConnection(SqlConnectionString options, Boolean& isInTransaction) at System.Data.SqlClient.SqlConnection.Open() at Content.Components.LayoutTemplate.genObject(XmlNode& pnd, XmlDocument& xmlDoc, XmlNode& xmlRoot)

    Diese Meldung sagt ja eigentlich nur, dass es dem SqlClient keine neue Verbindung mehr aufmachen darf bzw. keine bestehende zur Verfügung steht, weil sie anderweitig in Verwendung sind.
    Die Datenprovider benutzen ja einen Connection-Pool, für den man u.a. einstellen kann, wie viele Connections maximal gleichzeitig benutzt werden dürfen.
    folgende Gründe könnten imho zu disem Problem führen:

    • im Connection-String ist ein zu kleiner Connection-Pool eingetragen. Überprüfe das Vorhandensein des Parameters 'Max Pool Size' in Connection-String. Wenn nicht ist die max. Anzahl von gleichzeitigen auf 100 begrenzt.

    • 'Ungünstige' Programmierung. Instanzen werden nicht korrekt aufgelöst bzw. die Db-Connections werden eventuell in einem Singelton verwaltet.

    • Connections werden nicht ordnungsgemäß mit Close() an den Pool zurückgegeben. Ich kenne ja die Anwendung nicht, aber es könnte ja sein, dass sie zuerst einigen Datenbankverbindungen öffnet um beispielsweise Stammdaten zu laden ohne die Verbindungen wieder zurückzugeben und für die eigentliche Abfrage kann dann keine Verbindung mehr benutzt werden. Das passiert gerne, wenn man eine extreme Kapselung für die verschiedenen Objekte in der Applikation durchgeführt hat.

    • Begrenzung der maximalen anzahl von Verbindungen durch dne SQL-Server selbst. Bedenke, dass sich zwei Webserver um die Datenbankverbindungen 'raufen'. Unter Last werden also bis zu 'Max Pool Size'-Verbindungen pro Webserver benötigt.

    Grüße
      Klaus

    1. Hallo Klaus,

      • im Connection-String ist ein zu kleiner Connection-Pool eingetragen.

      Werde ich nochmal überprüfen.

      • 'Ungünstige' Programmierung. Instanzen werden nicht korrekt aufgelöst bzw. die Db-Connections werden eventuell in einem Singelton verwaltet.

      Nö, das System mit der Webanwendung in der vorhandenen Konfiguration lief ja auch 2 Jahre einwandfrei...

      • Connections werden nicht ordnungsgemäß mit Close() an den Pool zurückgegeben. Ich kenne ja die Anwendung nicht, aber es könnte ja sein, dass sie zuerst einigen Datenbankverbindungen öffnet um beispielsweise Stammdaten zu laden ohne die Verbindungen wieder zurückzugeben und für die eigentliche Abfrage kann dann keine Verbindung mehr benutzt werden. Das passiert gerne, wenn man eine extreme Kapselung für die verschiedenen Objekte in der Applikation durchgeführt hat.

      Nö, Anwendung hat einen DataAccessLayer der das alles richtig regelt.

      • Begrenzung der maximalen anzahl von Verbindungen durch dne SQL-Server selbst. Bedenke, dass sich zwei Webserver um die Datenbankverbindungen 'raufen'. Unter Last werden also bis zu 'Max Pool Size'-Verbindungen pro Webserver benötigt.

      Das werde ich auch nochmal checken...

      Das Problem hat sich aber inzwischen erledigt: Kaum ist der Netzwerkspezialist krank, muss der Webfrickler (me) ran und feststellen, das die Server nicht ordentlich gepatcht waren und der SQL sich scheinbar einen Slammer eingefangen hat! (Wäre eine Erklärung für belegte Verbindungen). Tsts...ich muss ja wohl nicht sagen, mit welchem SP das behoben wurde....Naja, nach SP-Installation, Virenscans und Passwortänderungen läuft das System wieder.

      Wird endlich Zeit, die Server zu outsourcen *stolper*...

      Trotzdem vielen Dank für Eure (Klaus & Ludger) Hilfe!
      Gruss
      LeKuchen

      1. Hi,

        Wird endlich Zeit, die Server zu outsourcen *stolper*...

        oder das Personal.   ;-)

        Gruss,
        Ludger