Lost in Space Druckversion
Recordsets
auf Abwegen
Seite
[<] [1] [2] (3) [4] [>
Sa, 06.04.2002
Autor: Olaf Lüder

Der klassische Weg

Zu Beginn dieses Artikels haben wir Ihnen einen Performancegewinn versprochen,. Um diesen messen zu können, müssen wir natürlich erstmal den herkömmlichen Weg beschreiten und die Daten ganz konventionell aus der Datenbank lesen.
Wir schreiben uns zwei Funktionen für den Datenzugriff, eine liefert zu einer Plz den Namen des zugehörigen Gebietes, die andere liefert zu einer Gebiets-ID ein Array mit allen zugehörigen Postleitzahlen zurück:

function GetAreaByZipCode(intZipCode){
  var strCon, strSql, obCommand, objRSArea;
  try {
    strCon = 'Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=' + Server.MapPath('./Gebiete.mdb');
    strSql = 'SELECT Gebiete.Name FROM Plz, Gebiete WHERE (PLZ.Gebiet = Gebiete.ID) AND (PLZ.PLZ = ' + intZipCode + ')';
    objCommand = Server.CreateObject('ADODB.Command');
    objCommand.ActiveConnection = strCon;
    objCommand.CommandText = strSql;
    objCommand.CommandType = adCmdText;
    objRSArea = objCommand.Execute();
    try {
      if (!objRSArea.Eof)
        return objRSArea('Name').Value;
      else
        return ''
    } finally {
      objRSArea.Close();
    }
  } finally {
    objCommand = null;
  }
}

function GetZipCodesByAreaCode(intAreaCode){
  var strCon, strSql, objRSZipCodes;
  try {
    strCon = 'Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=' + Server.MapPath('./Gebiete.mdb');
    strSql = 'SELECT PLZ FROM Plz WHERE Gebiet = ' + intAreaCode;
    objRSZipCodes = Server.CreateObject('ADODB.Recordset');
    objRSZipCodes.CursorType = adUseClient;
    objRSZipCodes.Open(strSql, strCon);
    try {
      if (!objRSZipCodes.Eof)
        return new VBArray(objRSZipCodes.GetRows(adGetRowsRest, adBookmarkFirst, 'PLZ')).toArray();
      else
        return new Array();
    } finally {
      objRSZipCodes.Close();
    }
  } finally {
    objCommand = null;
  }
}

Und nun die gleichen Funktionen unter Verwendung unserer im Application-Objekt gespeicherten Datensets:

function GetAreaByZipCode(intZipCode){
  Application.Lock();
  try {
    rsPlz.MoveFirst();
    rsPlz.Find('Plz = ' + intZipCode);
    if (!rsPlz.Eof){
      rsGebiete.MoveFirst();
      rsGebiete.Find('ID = ' + rsPlz('Gebiet').Value);
      if (!rsGebiete.Eof)
        return rsGebiete('Name').Value;
      else
        return ''
    } else
      return '';
  } finally {
    Application.UnLock();
  }
}

function GetZipCodesByAreaCode(intAreaCode){
  Application.Lock();
  try {
    rsPlz.Filter = 'Gebiet = ' + intAreaCode;
    if (!rsPlz.Eof)
      return new VBArray(rsPlz.GetRows(adGetRowsRest, adBookmarkFirst, 'PLZ')).toArray();
    else
      return new Array();
  } finally {
    rsPlz.Filter = adFilterNone;
    Application.UnLock();
  }
}

Da wir uns den Aufbau der Datenbankverbindung sparen, fallen diese Funktionen ganz nebenbei auch deutlich kürzer aus.

Für unsere Tests benötigen wir schließlich noch ein kleines Codestück, das unsere Funktionen aufruft und die benötigte Zeit mißt. Wir erzeugen uns jeweils ein Array mit 10 gültigen Postleitzahlen sowie Gebiets-ID's - diese sind rein zufällig gewählt und sollen nur sicherstellen, dass keine Werte gewählt werden, die nicht in der Datenbank vorgenommen.
Anschließend wird jede Funktion in einer Schleife x-mal aufgerufen, dabei wird als Funktionsparameter jeweils zufällig ein Wert aus den o.g. Feldern ausgewählt. Die Testumgebung ist natürlich für beide Fälle identisch:

var ZipCodes = new Array(24582, 6548, 93453, 34289, 49577, 74838, 54344, 18059, 66540, 89150),
    AreaCodes = new Array(901010000, 1303030000, 702030000, 203210000, 1004040000, 1500140000, 1600200000, 1302060000, 201020000, 205080000),
    Repeats = 1;

now1 = new Date();

for (var i = 0; i < Repeats; i++)
  Response.Write(GetAreaByZipCode(ZipCodes[Math.round((ZipCodes.length - 1) * Math.random())]) + '<br>');

for (var i = 0; i < Repeats; i++)
  Response.Write(GetZipCodesByAreaCode(AreaCodes[Math.round((AreaCodes.length - 1) * Math.random())]) + '<br>');

now2 = new Date();
Response.Write('<br><br>Dauer: ' + (now2.getTime()-now1.getTime()) + ' ms');

Sie finden diese Dateien unter TestAccess.asp und TestDisconnected.asp im Download-Archiv. Im nächsten Abschnitt werden wir dann endlich feststellen, ob sich der ganze Aufwand überhaupt gelohnt hat.

© 2001, 2002 NOGETEC GmbH - Alle Rechte vorbehalten. - Impressum
Der Inhalt dieser Seiten ist urheberrechtlich geschützt. Texte, Grafiken und Dateien dürfen ohne unsere schriftliche Genehmigung - auch auszugsweise - nicht kopiert, vervielfätigt oder vertrieben werden.
Übersicht
13 Beiträge
in 11 Kategorien

ASP classic (7)
ASP.NET (0)
Komponenten (2)
ISAPI-Filter (4)
Konfiguration (0)
No more Cookies
ASP Sessions
ohne Sitzungscookies

Sie nutzen das integrierte Session-Objekt?
Ihre Kunden akzeptieren aber keine Cookies?

Wir haben die Lösung...
Load me up
ASP Fileupload
ohne Komponenten

Sie möchten Dateien auf den Server heraufladen,
ohne Komponenten zu installieren?

Gar kein Problem...
Little Secrets
Dateinamen & Parameter
im URL verbergen

Verschiedene Pfade auf eine Datei abbilden...?
Skriptnamen weglassen, Parameter verstecken...?

So funktioniert's ...
Lost in Space
Recordsets
auf Abwegen

Sie nutzen Datenbanken & ADO-Recordsets...?
Die Performance ist aber nicht befriedigend...?

Dann lesen Sie weiter...
Subdomains
Subdomains einrichten
ohne viel Aufwand

Sie möchten Subdomains verwenden, mit eigenen Verzeichnissen aber ohne extra Host-Header oder Web-Sites einzurichten?

Wir zeigen Ihnen wie...