Announcement

Collapse
No announcement yet.

WCF: Client - Best practise

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

  • WCF: Client - Best practise

    [edit=gfoidl] Titel umbenannt. Ursprünglich: WCF RequestTimeout [/edit]


    Hallo ,

    ich habe eine Frage zu WCF. Ich arbeite an einer Application die Services auf einem Server benutzt. Datenbank abfragen und updates macht.
    Meine Frage bezieht sich auf die RequestTimeout. Ist es sinnvoll, fuer jede Abfrage/Update auf dem Server eine neue Verbindung zu generieren oder besser wenn die Application gestartet wird den Service zu oeffnen und wieder zu schliessen wenn die Application geschlossen wird.
    Gibt es Standarts oder Vorgaben von Microsoft?

    Danke Lomeco
    Zuletzt editiert von gfoidl; 09.09.2009, 12:39. Reason: Moderation

  • #2
    Gibt es Standarts oder Vorgaben von Microsoft?
    Für WCF ist mir keiner bekannt aber für Datenbanken sehr wohl:
    Ja - öffnen und so schnell wie möglich schließen.
    Dies gilt deshalb weil beim Client ein Connectin-Pool verwendet der Verbindungen vorhältt und wenn eine geöffnet werden soll so wird vom Pool eine bereits geöffnete Verbindung verwendet und beim Schließen der Verdindung dies einfach in den Pool (zur späteren Wiederverwendung) zurückgegeben.

    Ist es sinnvoll, fuer jede Abfrage/Update auf dem Server eine neue Verbindung zu generieren oder besser wenn die Application gestartet wird den Service zu oeffnen und wieder zu schliessen wenn die Application geschlossen wird.
    Das erstellen einer Verbindung ist sehr zeitaufwändig:
    1. ChannelFactory Creation
    2. Contract Description Creation
    3. Type loading and operation reflection
    4. Channel stack building and configuration
    5. Channel Creation

    Um dies einfacher handzuhaben wird ein Proxy erstellt welcher die Aufrufe weiterdelegiert und beim Aufruf von Open (sollte explizit erfolgen anstatt automatisch) die Verbindung erstellt.

    Folglich ist dies aufwändig und daher die (logische) Konsequenz nicht für jeden Aufruf einen neuen Proxy zu erstellen.

    Welche Möglichkeiten gibt es?
    • einmaliges erstellen des Proxy und diesen cachen um ihn dann wiederverwenden zu können
    • mehrere Proxies in einem Pool erstellen und die Proxies aus dem Pool vewenden


    Caching oder Pooling?
    In den meisten Fällen reicht Caching aus.
    Pooling kann verwendet werden falls es nicht gewünscht dass mehrere Threads den selben Proxy verwenden. Die kann folgende Gründe haben:
    • Der Kontext der Verbindung erlaubt keinen Zugriff von mehreren Threads.
    • Die Leistung hat einbußen wenn mehrere Threads den selben Proxy verwenden (kann nur eine Aufgabe gleichzeitig verarbeiten).


    Weitere wichtige Hinweise:
    • Verwende für den Proxy kein using denn im automatischen Dispose könnte ein Fehler auftreten. Daher try-catch wobei am Ende des try die Verbindung geschlossen werden soll und im catch Abort aufgerufen wird um die Ressourcen frei zugeben.



    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Proxy cachen

      Hallo,
      Was versteht man unter cachen oder poolen von PROXY? Und wie wird es bewerkstelligt?
      Gibt es ein Beispiel?
      Danke
      Lomaco

      Comment


      • #4
        Was versteht man unter cachen oder poolen von PROXY?
        Ein Cache ist ein Speicher der sich einmal verwendete Objekte merkt und beim nächsten Zugriff wird kein neues Objekt erstellt sondern das gemerkte Objekt vom Cache verwendet.

        Ein (Objekt-) Pool ist eine Menge von bereits erstellten Objekten und wenn ein Objekt benötigt wird so wird dieses (fertige/bereits erstellte) Objekt vom Pool genommen und nach Erledigung der Arbeit wieder dem Pool zugeführt.

        Beide sind in der Art gleich dass die (aufwändige) Objekterzeugung vermieden wird bzw. nur einmal beim Erstellen des Pools/Cache auftritt. Sie unterscheiden sich jedoch im Einsatz. Ein Cache besitzt nur ein Objket während im Pool eine Menge von Objekten ist.

        Und wie wird es bewerkstelligt?
        Ein Cache ist einfach. Es reicht ein Variable auf Klasseneben der das Objekt zugewiesen wird.
        Für den Pool gibt es genügend Beispiele -> Suche nach "Object Pool". Es gibt auch vorgerfertige Lösungen wie zB im Namespace System.ServicedKomponent.

        Edit: Nach kurzer Suche bei Google mit "wcf connection pooling" findet man: http://code.msdn.microsoft.com/WCFConnectionPooling


        mfG Gü
        "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

        Comment

        Working...
        X