Announcement

Collapse
No announcement yet.

Permanente DB-Verbindung bei IIS-Webservices

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Permanente DB-Verbindung bei IIS-Webservices

    Hallo,

    ich fange gerade an, mehrschichtige Anwendungen zu entickeln und habe das Problem dass ich nicht weiß, wie ich innerhalb eines IIS gehosteteten Webservices (*.asmx) eine permanente Datenbank-Verbindung zu einer Oracle-Datenbank aufrecht erhalten kann, sodass nicht jedes mal ein Open(); aufgerufen werden muß, sowald eine Webservice-Methode angesprochen wird. Der Konstruktor des Webservices wird jedesmal aufgerufen, wenn im Browser die URL eingegeben wird, also für jeden Seitenaufruf, sodass dieser Weg nicht hilft ...

    Ich möchte also eine ständige Verbindung zur Datenbank mit einer globalen "OLE DB Connection" Komponente. Wie geht das?

    Grüße,
    Patrick

  • #2
    Hallo,

    permanente Datenbankverbindungen sind nur bei C/S üblich. Eine Three-Tier-Anwendungen nutzt in der Regel einen Datenbankverbindungs-Pool. Sowohl OLE DB als auch die Sql-/OleDb-Verbindungsklassen aus dem .NET Framework bringen einen automatischen Datenbankverbindungs-Pool mit. Somit verursacht das ständigen Öffnen und Schließen keine zusätzliche Zeit (da die Datenbank immer nur die "ständig aktiven" Verbindungen des Pools sieht, aber niemals die tatsächlich verwendeten Verbindungen der jeweiligen Objektinstanzen). Es macht daher <b>keinen Sinn</b>, den Standardweg zu verlassen :-

    Comment


    • #3
      Hallo Anreas,

      ich konnte folgendes Verhalten feststellen:

      Jeder Aufruf von WebMethoden eines Webservices bewirkt den Aufruf des Webservices-Konstruktors, also die erneute Instanziierung. Auch wenn ich zwei mal hintereinander die gleiche WebMethode aufrufe, geschieht das. Logisch, denn ein Webservice ist ja zustandslos. Nun ist beim zweiten Aufruf die OLE DB Connection auf Oracle geschlossen und muß mit Open(); erst wieder geöffnet werden. Das Öffnen dauert bei mir 2 bis 3 Sekunden (Pentium 2, 333Mhz, MS Oracle OLE DB Provider auf eine Oracle 8 Datenbank). Jedes mal! Meine Anwendung benötigt also bei JEDEM Methoden-Aufruf der Businesslogik erst mal 2 bis 3 Sekunden, bis die DB Verbindung überhaupt aufgebaut wurde und die eigentlichen SQL-Statements durchgeführt werden können. Das ist nicht gerade performant.

      Deshalb würde ich lieber die DB-Verbindung beim Programmstart/Webservicestart nur einmal öffnen und den DatenAdaptern dann immer die bereits geöffnete globale Connection übergeben.

      Grüße,
      Patric

      Comment


      • #4
        Anmerkung:

        Bislang habe ich die OLE DB-Komponenten direkt auf das Webservice-Form gelegt. Vielleicht wäre es besser das auszulagern, so wie Visual Studio das auch anbietet: "Neues Datenbank-Projekt". Da gibt es dann einen Datenbankverweis, der ziemlich global aussieht

        Comment


        • #5
          Hallo,

          du solltest auf jedenfall mit dem Pool arbeiten. Ich würde mal versuchen rauszufinden warum der anscheinend bei deinen Oraclen Providern nicht geht! Wenn du mit einer "globalen" immer offenen Verbindung arbeitest, bekommst du sehr schnell Engpässe, schliesslich arbeiten alle DB Requests dann nur mit "einer" Verbindung

          Comment


          • #6
            Hallo Patrick,

            beim Microsoft SQL Server 2000 und beim Zugriff über SqlConnection kann man die Wirksamkeit des Pools auf 2 Wegen nachprüfen:

            1. Zeit messen (in einer Schleifen Open/Close aufrufen) <br>
            2. Die Kommunikation mit dem SQL Server über das Tool Profiler überwachen.

            Über beide Wege lässt sich nachweisen, dass die Datenbank immer nur eine ständig geöffnete Verbindung sieht. Erst dann, wenn alle Verbindungen aus dem Pool belegt sind und ein erneutes Open aufgerufen wird, kommt eine neue Datenbankverbindung in den Pool.

            Wenn das bei der ORACLE-Datenbank so nicht funktioniert, würde ich nach "Schaltern" suchen, die man in der Verbindungszeichenfolge aktivieren kann.

            Wenn es keinen Weg zum Datenbankverbindungs-Pool gibt, könnte man zu .NET Enterprise Services greifen, um die Verbindungsschicht in ein COM+ Objekt auszulagern. Dieses kann dann als gepooltes COM+ Objekt konfiguriert (Attribute der .NET-Klasse) werden. Der Web Service greift dann nur auf das COM+ Objekt zu - dieses ist als gepooltes COM+ Objekt ständig aktiv. Die COM+ Poolgröße lässt sich ebenfalls über die Attribute festlegen, so dass ständig x-Datenbankverbindungen zum sofortigen Gebrauch aktiv sind.

            &#10

            Comment


            • #7
              Ich glaube ich habe es hinbekommen. Hatte damals nicht explizit das Close() der Connection aufgerufen. Nun ist nur noch die erste Verbindung lang andauernd. Jede weitere geht dann blitz-schnell, ADO.NET scheint nun selbständig die eine Oracle-Verbindung aufrecht zu erhalten und zu poolen, allerdings nur eine begrenzte Zeit: nach Inaktivität wird diese Hauptverbindung dann recht bald autom. geschlossen und ein erneuter Aufruf führt wieder zu der besagten langen Anmeldung an Oracle. Dabei dauert Oracle 7 bedeutend länger (5-20 Sek) als Oracle 8 (max 2 Sek).

              Für den SQL-Server gibt es ein Zeitintervall, wie lange der die Verbindung aufrecht erhalten soll bei Inaktivität. Ich denke dass das auch bei Oracle funktioniert und werde das gleich ausprobieren.

              Vielen Dank für die Antworten jedenfals erst einmal

              Comment

              Working...
              X