| 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. |