Announcement

Collapse
No announcement yet.

Brauche dringend eine Rat ... Seite laden dauert teilweise sehr lange

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

  • Brauche dringend eine Rat ... Seite laden dauert teilweise sehr lange

    Hallo zusammen,

    ich bin gerade dabei eine relativ komplxe ASP-NET 2.0 Anwendungung mit VS2005 zu schreiben.
    Die Daten kommen aus einer Oracle Datenbank. Es sind recht viele Daten und auch sehr komplexe
    Abfragen, die teilweise über 4 oder mehr Tabellen gehen. Ich nutze nicht die typische Art der Datenselektion,
    die mir das VS2005 bietet, sondern filter meine Daten über den DataReader.
    Da eine Page Zustandlos ist, muss ich natürlich jedesmal einen CONNECT, Daten lesen und eine
    DISCONNECT durchführen. Nebenbei schreiben ich bei Fehler noch eine LOG Datei. Die Seite ist auch mehrsrachig,
    wobei auch hier die ganzen Texte aus der Datenbank gelesen werden.

    Jetzt habe ich das Problem, dass das Laden einiger Seiten sehr langsam geht. Das wäre nicht so schlimm, aber ...
    Mal lässt sich eine Seite mit großen und komplexen SELECT Statement schnell laden, mal langsam.
    Außerdem muss ich bei einem POSTBACK (z.B. click auf einen BUtton meine Daten neu laden (incl.
    CONNECT, Daten lesen, DISCONNECT usw.).

    Jetzt meine Frage kann man gezielt den POSTBACK in der Seite selber steuern und wie kann ich das Lesen der
    Daten aus der Datenbank effizienter steuern, damit die Seiten schneller laden.

    hier zum Beispiel mal eine Seite von mir:

    Die POSTBACK Abfrage sieht ziemlich komisch aus, aber bis jetzt habe ich keine andere Möglichkeit
    gefunden. Auch wenn ich auf eine Button drück rufe ich die Funktion "PreparePostbacks();" auf.

    Als bitte nicht lachen, aber irgenwie raffe ich das mit dem "Zustandslos" nicht richtig.

    Wer kann mir helfen !!!

    <pre>

    public _Default()
    {
    Load += new EventHandler(Page_Load);
    Unload += new EventHandler(Page_Unload);
    }

    protected void Page_Load(object sender, EventArgs e)
    {
    try
    {
    fGlobal = new pa775.ClassLibrary.pcc.TGlobal(Request, Server, "./../config/pcc.xml");
    this.Title = fGlobal.ApplicationTitle;
    }
    catch (Exception aExp)
    {
    SetMessage(aExp.Message.Trim());
    if (fGlobal != null) { fGlobal.Dispose(); fGlobal = null; }
    }

    if (fGlobal != null)
    {
    ReadSessionValues();
    ReadRequestValues();

    if (fGlobal.CheckSession(GetRequestValue("SID"),
    GetRequestValue("UID"), GetRequestValue("MID"), IsPostBack))
    {

    fGlobal.Language = GetSessionValue("LANGID");

    SetFrontend(sender, e);
    if (!IsPostBack)
    {
    PreparePostbacks();
    }
    else
    {
    PreparePostbacks();
    }
    }
    else
    {
    MakeRedirect(fGlobal.RedirectPath + "?sid=" +
    GetRequestValue("SID") + "&uid=" +
    GetRequestValue("UID") + "&lid=" +
    GetRequestValue("LID") + "&mid=" +
    GetRequestValue("MID"));
    }
    }
    }

    protected void Page_Unload(object sender, EventArgs e)
    {
    if (fGlobal != null) { fGlobal.Dispose(); fGlobal = null; }
    if (fLanguages != null) { fLanguages.Clear(); fLanguages = null; }
    if (fRequestValues != null) { fRequestValues.Clear(); fRequestValues = null; }
    if (fSessionValues != null) { fSessionValues.Clear(); fSessionValues = null; }
    }

    </pre

    Gruß

    Sascha

  • #2
    Hallo,

    &gt;Da eine Page Zustandlos ist, muss ich natürlich jedesmal
    &gt;einen CONNECT, Daten lesen und eine DISCONNECT durchführen.

    nicht unbedingt. Denn ASP.NET sieht ja mehrere Optionen vor, um die Daten temporär auf dem Server zwischenzuspeichern. Je nach der Datenmenge kann das Ergebnis der SELECT-Abfragen (als gefüllte DataSet-Instanz) zum Beispiel entweder im <b>Session</b>-Objekt (kleine Datenmengen) oder im <b>Cache</b>-Objekt (große Datenmengen) gepuffert werden. Bei einem Postback kann die zustandlose Anwendung das DataSet mit der Ergebnismenge dann direkt aus dem Cache öffnen, ohne dass eine erneute SQL-Abfrage abgeschickt werden muss. Das Cache-Objekt wird bei Speichermangel automatisch zerstört, daher muss vor jedem Zugriff geprüft werden, ob der Cache noch gültig ist (d.h. die SQL-Abfrage muss nur bei Bedarf erneut ausgeführt werden).

    <div style="font-family: Courier New; font-size: 10pt; color: black; background: white; border-top: windowtext 1pt solid; padding-top: 0pt; border-left: windowtext 1pt solid; padding-left: 0pt; border-right: windowtext 1pt solid; padding-right: 0pt; border-bottom: windowtext 1pt solid; padding-bottom: 0pt;"><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">void</span> Page_Load (<span style="color: teal;">Object</span> sender, <span style="color: teal;">EventArgs</span> e)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; DataSet ds = (DataSet) Cache[<span style="color: maroon;">"Quotes"</span>];</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">if</span> (ds != <span style="color: blue;">null</span>) </p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; DataTable table = ds.Tables[<span style="color: maroon;">"Quotations"</span>];</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ...</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">else</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ... (DataSet-Instanz neu füllen)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Context.Cache.Insert(...);</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; }</p></div>

    Die Klasse <b>SqlDataSource</b> (ASP.NET 2.0) stellt die automatische Caching-Funktion über die <b>EnableCaching</b>-Eigenschaft zur Verfügung. Dabei legt die Eigenschaft <b>CacheDuration</b> die Gültigkeitszeitdauer fest.

    Eine andere Alternative besteht darin, das Verhalten des <b>View State</b> auszunutzen. Wird die Eigenschaft <B>EnableViewState</b> für die betroffenen Controls auf True gesetzt, speichert der View State die Ergebnismenge, so dass bei einem Postback (Eigenschaft <b>IsPostBack</b> ist dann True) die Datenmenge nicht neu von der Datenbank abgefordert werden muss und auch die erneute Datenbindung <b>nicht</b> mehr notwendig ist. Der Haken an der Sache ist nur der, dass in der Voreinstellung der aktivierte View State den generierten HTML-Output drastisch erhöht.
    &#10

    Comment

    Working...
    X