ORDIX News

Werbung
ORDIX News
Das IT-Magazin der ORDIX AG
Ausgabe 1/2002
Java Servlets
- noch ein weiteres Konzept?
Die vereinfachte Entwicklung von Web-Anwendungen
Service Reporting:
Selbstdarstellung der IT-Abteilung
Dynamische PDF-Dateien
mit PHP erstellen
Oracle Tuning mit Statspack
Der Nachfolger von utlbstat/utlestat
EDITORIAL
• ORDIX NEWS •
Paderborn, März 2002
€: Jetzt ist er da
Alle haben auf ihn gewartet. Wirklich alle? Jetzt ist
er jedenfalls da, der EURO. Und, obwohl der Umtausch und die Gewöhnung an das neue Geld
schneller gingen, als viele erwartet haben: glücklich ist Otto-Normalverbraucher nicht so richtig. Das
„EURO-Glättungsgesetz“ haben so einige anscheinend missverstanden bzw. sehr zu ihren Gunsten
ausgelegt.
Nachdem die ersten Münzen auseinandergefallen waren und man herausgefunden hatte,
dass die Preise zwar meistens niedriger waren als bisher, aber selten nur halb so hoch,
fühlen sich heute viele betrogen. Ein paar Chefökonomen von Banken laufen deshalb
auch schon herum und rufen zum Boykott einiger Branchen auf. Dabei vergessen sie,
dass ein Boykott zu Zeiten einer Rezession - oder vorsichtiger ausgedrückt: einer rückläufigen Konjunktur - sicherlich nicht sinnvoll ist. Ganz zu schweigen davon, dass gerade
auch die Banken ihre Preise im Zuge des „EURO-Glättungsgesetzes“ kräftig nach oben
bewegt haben, nur eben rechtzeitig - nämlich weit vor dem 1.1.2002.
Da kommt einem Normalbürger doch glattweg in den Sinn: Wenn die EU unseren Finanzminister rügt, weil er zu wenig spart, bekommen wir dann die D-Mark zurück? Wenn das
aber noch nicht ausreicht, sollten wir unbedingt unseren Möchtegern-Bundeskanzler aus
dem schönen Amigo- ... Entschuldigung Bayernland wählen, denn der will ja noch mehr
Schulden machen. Dann klappt es vielleicht ganz sicher mit der D-Mark?!?
Im Zuge der Maßnahme, wieder mehr Schulden zu machen, ergeben sich gegebenenfalls
noch mehr Vorteile. Mehr Schulden bedeuten ja, dass mehr Zinsen gezahlt werden müssen. Vielleicht lassen sich dann auch die Banken erweichen und senken ihre Gebühren
wieder.
Das mit der D-Mark und den Gebühren sind aber nur Träume. Das mit dem neuen Bundeskanzler eher weniger.
Vor uns braucht sich keiner zu fürchten: Weder unsere Dienstleistungspreise noch andere Leistungen wurden weder frühzeitig noch jetzt zur Umstellung erhöht. Die ORDIX News
ist für Sie auch weiterhin kostenlos und beinhaltet auch dieses Mal wieder einige interessante Themen aus den Bereichen Java, Oracle (u. a. Tuning), Informix (weniger technisch
- eher zukunftsorientiert), SAN und System Management.
Sollte das nicht ausreichend für Sie sein, stehen wir Ihnen gerne mit Rede und Antwort
auf der CeBit, die uns auch zu unserem Titelbild animiert hat, zur Verfügung.
Viel Spaß beim Lesen wünscht
Ausgabe 1/2002
3
• ORDIX NEWS •
STANDARDS
Inhalt
Ausgabe 1/2002
Standards
0 3 ....Editorial
0 4 ....Inhalt
1 7 ....Impressum
Java
0 5 ....Java Servlets - noch ein weiteres Konzept?
Die Entwicklung einer Web-Anwendung kann sehr aufwändig sein. Mit
Java Servlets geht es auch einfacher.
Systeme & Datenbanken
0 8 ....Tuning mit Statspack
Mit Statspack bietet Oracle ab der Version 8.1.6
ein Werkzeug zur detaillierten Performanceanalyse einer Oracle-Datenbank. Als Nachfolger von
utlbstat/utlestat bietet Statspack zahlreiche Vorteile.
3 0 ....Oracle Packages Teil VII:
Debugging von PL/SQL mit DBMS_DEBUG
Hilfreich beim Entwickeln von Stored
Procedures: Die Palette an nützlichen Packages scheint kein Ende
zu nehmen ...
1 8 ....¿Habla usted español?
Immer häufiger müssen Anwendungen für den internationalen Einsatz vorbereitet werden. Java unterstützt den Prozess mit einem umfangreichen Funktionspaket.
4 1.... Informix: Fragen an die Zukunft
Was tun, wenn man Informix als Datenbanksystem nutzt? Wichtige Fragen, bevor Sie sich entscheiden, zu
migrieren.
3 8 ....Entwurfsmuster Teil II: Implementierung von Entwurfsmustern
Wie und wann lassen sich Entwurfsmuster in der Praxis einsetzen? Codefragmente, Strukturdiagramme und Beschreibungen bringen „Licht ins Dunkel“.
Systeme & Netze
System Management
1 6 ....Neue Funktionen in DashBoard 6.4
Wir beschreiben die neuen Funktionen zur Messung des Antwortzeitverhaltens.
2 6 ....Service Reporting:
Selbstdarstellung der IT-Abteilung
Projekterfahrungen mit den Einsatzmöglichkeiten
und nötigen Voraussetzungen.
Aktuell
1 5 ....Gute Resonanz auf der
Product- & Trend Show 2002
Highlights und News von der diesjährigen Fujitsu
Siemens Computers Messe in Paderborn.
2 5 ....ORDIX auf der CeBIT in Hannover
Besuchen Sie uns auf dem BMC-Stand in Halle 3
Stand C45 oder auf dem Oracle-Partnerstand der
DOAG in Halle 4 Stand A58. Wir stellen verschiedenes zu BMC PATROL sowie zu den Themen
"Performanceanalysen und Tuning von OracleDatenbanken" und "Informix/Oracle Migration" vor.
4
2 2.... Dynamische PDF-Dateien mit PHP
erstellen
Statische PDF-Dokumente waren
gestern: Heute gibt es dynamische
PDFs - doch zu welchem Preis? PHP
- inzwischen ein häufig genutztes Werkzeug zur
Programmierung von Web-Applikationen - bietet
diese Möglichkeit.
2 8 ....Management von Mailinglisten mit Majordomo
E-Mail-Adresslisten ermöglichen Mailingaktionen
und Datenpflege ohne großen Zeit- und Administrations-Aufwand.
3 4 ....SAN-Technik
Die wichtigsten Begriffe für Einsteiger und Fortgeschrittene zusammengefasst: Grundlagen-Wissen
zur „Fibre Channel“-Technik.
Systeme & Applikationen
2 1 ....Neues von der R/3-Überwachung
Die neue Version der PATROL for R/3 Suite bietet
jetzt u. a. eine erleichterte Anbindung an die
PATROL Konsole und erweiterte Möglichkeiten der
Reporterstellung.
Aus- & Weiterbildung
4 2 ....Seminarübersicht
Preise, Termine ... bis Juni 2002.
Ausgabe 1/2002
• ORDIX NEWS •
JAVA
Java Servlets noch ein weiteres Konzept?
Möchte man eine Web-Anwendung implementieren, so stehen einem mittlerweile
diverse Konzepte und Techniken zur Verfügung. Bei näherem Hinsehen entdeckt
man aber, dass es sich dabei oft um zwar mächtige, jedoch proprietäre Lösungen handelt, die z. B. nur unter Verwendung eines bestimmten Web- oder
Applikationsservers nutzbar sind. Greift man dagegen auf altbewährte Konzepte
wie z. B. das CGI zurück, so bleiben eventuell neue Techniken und deren Vorteile auf der Strecke. Die Folge ist nicht selten ein höherer Implementierungsaufwand, um den heutigen Anforderungen gerecht zu werden.
Genau hier setzt der von Sun ins
Leben gerufene Java Community
Process (JCP) mit seiner ServletSpezifikation an. Servlets sind serverseitige Komponenten, die in Java
geschrieben sind und den Kern einer Web-Anwendung bilden. Im einfachsten Fall besteht eine WebAnwendung aus einem einzigen
Servlet, welches mit einer URL assoziiert ist und auf Anforderung eine
Web-Seite dynamisch generiert. Im
Normalfall besteht eine Web-Anwendung dann eher aus einer Menge
von Servlets, statischen Web-Seiten und weiteren Ressourcen
(z. B. einer Datenbank), die in einem gemeinsamen Kontext stehen.
Um die Implementierung von Servlets zu vereinfachen und dem Entwickler die Möglichkeit zu geben,
sich nur auf das Wesentliche zu
konzentrieren, hat JCP einen bestimmten Weg beschritten. Wie im
Java-Umfeld üblich, gibt es ein Application Programming Interface
(API). Im Servlet API spiegeln sich
die Anforderungen an eine moderne Web-Anwendung wider. Ein Teil
des API ist generisch, d. h. unabhängig von einem bestimmten Protokoll, implementiert.
So gibt es beispielsweise die Klasse javax.servlet.GenericServlet, die
ein protokollunabhängiges Servlet
definiert. Solche Klassen können
Ausgabe 1/2002
zur Implementierung eigener protokollabhängiger
Klassen und Interfaces benutzt werden. Das Hypertext Transfer Protocoll (HTTP) wird von der API als
einziges Protokoll in Form von fertig implementierten Klassen und Interfaces unterstützt.
Um ein HTTP-Servlet zu schreiben, muss der Entwickler nicht mehr tun, als die abstrakte Klasse
javax.servlet.http.HttpServlet abzuleiten und die gewünschten Methoden zu überschreiben. Auch die
üblichen Aufgaben, wie z. B. die Dekodierung von
Übergabeparametern, werden von der API übernommen. Abb. 1 zeigt den Sourcecode eines einfachen
package
de.ordix.servlet;
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class DateServlet extends HttpServlet{
public void doGet( HttpServletRequest request,
HttpServletResponse response )
throws ServletException, IOExeption{
String title=“Datumsservlet“;
// MIME-Typ setzen
response.setContentType(„text/html“);
// HTML-Seite dynamisch schreiben
PrintWriter out=response.getWriter();
out.println(„<HTML><HEAD><TITLE>“);
out.println(title);
out.println(„</TITLE></HEAD><BODY>“);
out.println(„<H1>“ + title + „</H1>“);
out.println(„<P>Heute ist der „+(new Date()).toString());
out.println(„</BODY></HTML>“);
out.close();
}
}
Abb. 1: Sourcecode des Beispiel-Servlets.
5
• ORDIX NEWS •
Servlets, das eine HTML-Seite mit dem aktuellen
Datum generiert.
Ist das Alles?
Die Sourcecodelänge lässt vermuten, dass viele elementare Aktionen (Instanziierung und Aufruf des
Servlets, Übermittlung der Anfrage und der Antwort,
zur Verfügungstellung von Laufzeitinformationen usw.)
nicht von dem Servlet selbst durchgeführt werden.
Dafür ist, wie es die Spezifikation verlangt, ein Servlet-Container verantwortlich. Dieser stellt für ein
Servlet die Laufzeitumgebung dar. Ein Servlet-Container bietet Kommunikationsdienste an, über die
Anfragen und Antworten übermittelt werden, dekodiert MIME-basierte Anfragen und kodiert MIMEbasierte Antworten.
Zusätzlich beinhaltet und verwaltet er Servlets während ihrer Lebensspanne. Technisch gesehen kann
ein Servlet-Container eine eigenständige Anwendung, ein Teil eines Web- oder Applikationsservers
oder ein Add-on sein. Die Realisierung überlässt Sun
den Drittherstellern.
Der Vorteil für den Entwickler ist die Unabhängigkeit
von einem bestimmten Servlet-Container. Solange
sich ein Servlet-Container an die Spezifikation hält,
kann er jedes Servlet aufnehmen und ausführen. Die
Anzahl der Servlet-Container, die übrigens selbst nicht
in Java implementiert sein müssen, wächst ständig.
Hier hat man inzwischen eine recht große Auswahl.
In der Entwicklungs- und Testphase lassen sich deshalb z. B. kleine, lokal laufende und eventuell kostenlose Servlet-Container verwenden. Im Wirkbetrieb
sollte man dagegen auf einen großen und performanten Servlet-Container setzen.
Servlet Kontext
Ein Servlet läuft immer in einem Servlet-Kontext ab.
Dieser Kontext definiert die Sichtweise eines
Servlets auf die Web-Anwendung, innerhalb der es
ausgeführt wird. Über diesen Kontext kann das
Servlet auf Ressourcen, wie z. B. andere Servlets
zugreifen oder Parameter setzen, auf die andere
Servlets im gleichen Kontext zugreifen können.
Session Kontext
Neben einem Servlet-Kontext definiert die Spezifikation auch einen Session-Kontext. Über diesen Kon-
6
JAVA
text lassen sich mehrere Anfragen
eines Clients logisch einer Session zuordnen. Im Falle des zustandslosen HTTP ist das wichtig,
da es ansonsten keine Möglichkeit
gibt, zwei aufeinanderfolgende Anfragen eines Clients als „zusammengehörig“ zu erkennen. Anwendungszustände wie „Benutzer authentifiziert“ oder „drei Bücher vom
Kunden xyz im Warenkorb“ könnten deshalb nicht realisiert werden.
Aus diesem Grund definiert die
Spezifikation das Interface HttpSession. Dieses erlaubt dem Servlet-Container, diverse Möglichkeiten zur Verfolgung einer Session
zu implementieren, ohne dass sich
der Entwickler mit unterschiedlichen Implementierungsdetails auseinandersetzen muss. Die zugrundeliegenden Techniken können auf
Cookies, URL Rewriting oder SSL
Sessions beruhen. Darüber hinaus
können Attribute an eine Session
gekoppelt werden, die für alle in
demselben Servlet-Kontext laufenden Servlets sichtbar sind. Einige
der weiteren Möglichkeiten sind
das Setzen eines Session Timeouts oder die Abfrage des Zeitpunktes des letzten Clientzugriffs.
Deployment Descriptors
Um eine aus Servlets aufgebaute
Web-Anwendung in einem ServletContainer zu installieren, muss
eine Art „Ausführanweisung“ i n
XML erstellt werden. Dieser Deployment Descriptor teilt dem Servlet-Container mit, aus welchen Servlets die Web-Anwendung besteht,
welche Initialisierungsparameter
verwendet werden sollen oder welche Sicherheitseinstellungen zu
benutzen sind.
Ein wichtiger Bestandteil des Deployment Descriptors ist auch die
Assoziation einer URL mit der
Web-Anwendung oder einer stati-
Ausgabe 1/2002
• ORDIX NEWS •
JAVA
<!DOCTYPE web-app PUBLIC „-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN“
„http://java.sun.com/j2ee/dtds/web-app_2_2.dtd“>
<web-app>
<!— General description of your web application —>
<display-name>Datumsanwendung</display-name>
<description>
Diese Anwendung generiert eine HTML-Seite mit dem aktuellen Datum als Inhalt.
</description>
<servlet>
<servlet-name>DateServlet</servlet-name>
<servlet-class>
de.ordix.servlet.DateServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DateServlet</servlet-name>
<url-pattern>/Date</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>15</session-timeout>
</session-config>
</web-app>
Abb. 2: Deployment Descriptor des Beispiel-Servlets.
schen HTML-Startseite. Abb. 2
zeigt einen sehr einfachen Deployment Descriptor für das in Abb. 1
vorgestellte Servlet.
Der Deployment Descriptor, der in
einer Datei mit dem Namen web.xml
gespeichert wird, muss an einer bestimmten Stelle in einer von der Spezifikation festgelegten Verzeichnisstruk tur abgelegt werden. Diese
beinhaltet auch das Verzeichnis lib,
in das Bibliotheken und Java-Klassen abgelegt werden müssen, auf
die ein Servlet zur Laufzeit zugreifen will. Ein Beispiel hierfür sind
JDBC-Treiber. Der CLASSPATH
wird von dem Servlet-Container automatisch um Einträge aus diesem
Verzeichnis erweitert.
Und was bringt’s?
Welche Vorteile hat nun der Einsatz von Servlets gegenüber dem
Ausgabe 1/2002
Einsatz von CGI-Skripten? Zum einen wird Java als
moderne, objektorientierte und plattformunabhängige Programmiersprache eingesetzt. Damit hat der
Entwickler auch Zugriff auf das vollständige Java
API. Zum anderen sind Servlets im Durchschnitt
schneller als CGI-Skripte, da sie ein anderes Prozessmodell einsetzen und nicht für jede Anfrage neu
gestartet werden müssen. Das FastCGI bleibt bei
dieser Betrachtung außen vor.
Weitere Vorteile ergeben sich aus den Konzepten,
die der Servlet-Spezifikation zugrunde liegen. Diese greift dieser Artikel jedoch aus Platzgründen nicht
weiter auf.
Auf jeden Fall lohnt sich für den Entwickler von WebAnwendungen ein detaillierter Blick auf das Thema
„Java Servlets“. Nicht ohne Grund wächst die Anzahl servletbasierter Web-Anwendungen ständig.
Auch ORDIX beschäftigt sich mit diesem Thema in
diversen Projekten und vermittelt das Know-how u.
a. in dem Seminar “JSP und Servlet Programmierung mit Tomcat“.
Christoph Borowski ([email protected]).
7
• ORDIX NEWS •
SYSTEME & DATENBANKEN
Tuning mit Statspack
Mit Statspack liefert Oracle ein Werkzeug zur detaillierten Analyse von Datenbanken. Im Gegensatz zu klassischen Werkzeugen wie dem Tuning Pack des
Enterprise Managers, dem BMC SQL-Explorer oder den Quest Werkzeugen liefert Statspack große Mengen an Messpunkten, die vom Datenbankadministrator
selbst analysiert und interpretiert werden müssen. Das klassische SQL-Tuning
wird mit Statspack nicht betrieben.
Wie lassen sich in einer großen Datenbank, auf der
zahlreiche Benutzer arbeiten und auf der nachts eine
Stapelverarbeitung stattfindet, Schwachstellen aufdecken? Wie können aus den gesammelten Werten Zeitreihenanalysen bereitgestellt werden? Wie
können diese Daten für Managementpräsentationen
aufbereitet werden? Diese Fragen beantwortet Statspack mit seiner detaillierten Serveranalyse.
Am Beispiel von heißen Datenbankblöcken wird
aufgezeigt, wie die Performance von Datenbanken
massiv verbessert werden kann. Stellen wir uns eine
einfache Tabelle vor, in die sehr viele Transaktionen
parallel Datensätze einfügen. Nach der Optimierung
des INSERT-Befehls (Array Verarbeitung) und der
Allokation von ausreichend Speicherplatz, sollte der
Server eigentlich effizient arbeiten.
Storage Parameter
Transaktionen
pro Sekunde
Faktor
243
1522
100%
626%
Standard Tabelle
Freelists + Freelist Groups
Abb. 1: Auswirkungen von heißen DB-Blöcken.
Aufgrund von massiven Wartezuständen lässt sich
die Datenbank aber nur sehr schlecht auslasten.
Es ist trotz oder gerade wegen der einfachen Verarbeitungslogik nicht skalierbar. Abb. 1 zeigt, wie
mit Hilfe der Storage Parameter Freelists und
Freelist Groups eine Verbesserung der Performance auf über 600 Prozent erreicht wird. Wie solche Verbesserungen mit Statspack zu erreichen
sind, werden wir im Folgenden erläutern.
Heiße Datenbankblöcke
Greift eine Transaktion verändernd auf einen Datenbankblock zu, so muss dieser für die Dauer der Verarbeitung geschützt sein. Dieser Schutz ist notwendig bei einem INSERT, einem DELETE oder einem
UPDATE. Neben der Veränderung der eigentlichen
Daten kann es zu einer Blockreorganisation, einer
Veränderung der Freispeicherlisten oder dem Hinzu-
8
fügen eines Slots in der Interested
Transaction List kommen. Diese
Veränderungen verzögern die Freigabe des Blockes dann zusätzlich.
Falls nun eine Transaktion T1 eine
Veränderung des Blocks 4711 vornimmt und einen kurzen Augenblick später eine Transaktion T2
auf diesen Block ebenfalls zugreifen möchte, muss die Transaktion
T2 warten, bis die Transaktion T1
diesen Block wieder freigibt.
Die Transaktion T2 löst nach dem
missglückten Zugriffsversuch das
Ereignis buffer busy waits aus.
Auf einer Mehr-CPU-Maschine beginnt die Transaktion mit dem sogenannten „Spinning“, auf einer EinCPU-Maschine legt sich die Transaktion sofort schlafen. Im ersten Fall
wird so aktiv CPU-Zeit verbraucht.
Auch im zweiten Fall erzeugt das
Auslagern des Prozesses eine höhere Systemlast. In beiden Fällen
erhöht sich die Ausführungszeit der
zweiten Transaktion.
Fügen fünf Transaktionen parallel
Datensätze am „Ende“ einer Tabelle ein, so kommt es zu den in
Abb. 2 dargestellten Wartezuständen. Eine Transaktion nach der
anderen muss auf die Freigabe
des gewünschten Blockes warten.
Dabei ist die Einhaltung einer Reihenfolge nicht gewährleistet.
Bei einer solchen Konstellation gibt
es drei Hinweise, die in den Serverstatistiken dieses Problem aufzeigen:
Ausgabe 1/2002
SYSTEME & DATENBANKEN
• ORDIX NEWS •
dann mit sehr großer Wahrscheinlichkeit die heißen Blöcke. Eine detaillierte Beschreibung dieses Vorgehens würde
allerdings den Rahmen dieses
Artikels sprengen, kann man
aber beispielsweise beim Besuch unseres Seminars „Oracle
Tuning und Monitoring“ erfahren.
Nachdem die Tabelle, aus der
die heißen Blöcke stammen,
identifiziert wurde, müssen Gegenmaßnahmen ergriffen werden. Diese sind abhängig vom
Typ der Transaktion:
Abb. 2: Buffer Busy Waits.
1.
2.
3.
Das Ereignis buffer busy
waits nimmt einen signifikanten Wert in der Spalte waits
an. Bei Problemen ist dieses
Ereignis im Statspack Report
in der Regel unter den Top 5
Ereignissen zu finden.
In den Latch Statistiken hat
der Latch cache buffers
chains in der Spalte Misses
eine hohe Anzahl.
In dem Block Wartestatistiken
gibt es eine hohe Anzahl in
der Spalte waits beim Blocktyp data block.
Diese einzelnen Bereiche im Statspack Report werden im weiteren Verlauf des Artikels ausführlich dargestellt.
Wenn anhand der Serverstatistiken
festgestellt wird, dass in der SGA
heiße Datenbankblöcke vorhanden
sind, müssen diese im nächsten
Schritt identifiziert werden. Hierzu
muss der Latch ausfindig gemacht
werden, bei dem die Anzahl in der
Spalte sleeps innerhalb eines
kurzen Zeitraums steigt. Weiterhin
müssen die Blöcke selektiert werden, die zu Beginn und am Ende
des kurzen Zeitraums von diesem
Latch abgedeckt werden. Dies sind
Ausgabe 1/2002
- Paralleles Einfügen: Erhöhen der Freispeicherlisten und der Freispeicherlisten-Gruppen. Freispeicherlisten-Gruppen können auch auf nicht
OPS Systemen sinnvoll verwendet werden. Eine
Erhöhung des INITRANS-Wertes kann eine weitere Verbesserung ergeben.
- Paralleles Ändern: Folgt die Änderung unmittelbar nach dem Einfügen von Datensätzen, sind
die zuvor genannten Maßnahmen durchzuführen.
Sonst muss der Wert PCTFREE erhöht werden.
Bei kleinen Tabellen kann es unter Umständen
Sinn machen, den Wert auf 99 Prozent einzustellen. Der Wert INITRANS sollte auf jeden Fall
erhöht werden.
- Durch mehr Hash Buckets oder mehr Latch Children sollte sich das Problem heißer Blöcke ebenfalls reduzieren lassen.
Diese Maßnahmen sollten allerdings
nur dann gewählt werden, wenn
alle anderen
Maßnahmen
nicht erfolgreich waren.
Durch alle Maßnahmen soll erreicht werden,
dass die Transaktionen nun
auf unterschiedliche Blöcke
Abb. 3: Beseitigung von Buffer Busy
Waits.
9
• ORDIX NEWS •
SYSTEME & DATENBANKEN
zugreifen. Gelingt dies, kann - unter den beschriebenen Umständen - die Performance der gesamten Datenbank massiv verbessert werden.
Statspack Grundlagen
Die Installation von Statspack gestaltet sich denkbar einfach. Über das Skript ./rdmbs/admin/
spcreate.sql im ORACLE_HOME Verzeichnis wird
der Benutzer perfstat, sowie das PL/SQL Paket statspack angelegt. Anschließend kann der
Benutzer sogenannte Schnappschüsse über den Aufruf von statspack.snap(i_snap_level => 0);
erzeugen. Ein Schnappschuss enthält alle wesentlichen aktuellen Werte über Statistiken, Events, I/
O-Zeiten, Parametereinstellungen und vieles mehr.
Abb. 4: Erzeugung einzelner Schnappschüsse.
Nun kommt der eigentliche Trick. Die Differenz eines Statistikwertes - oder eines beliebigen anderen
Wertes - zwischen zwei Messpunkten stellt die für
diesen Zeitraum geleistete Arbeit des Servers dar.
Da alle Schnappschüsse in der Datenbank gespeichert werden, muss der Datenbankadministrator erst
einmal nichts anderes tun, als regelmäßig Schnappschüsse zu erzeugen.
Ein Intervall von 10 Minuten ermöglicht dabei das
Auffinden von Spitzenwerten und ist gleichzeitig nicht
zu CPU-intensiv (siehe Abb. 4).
Zum Erzeugen der Messpunkte ist unter UNIX ein
Cronjob die beste Wahl. Die oft empfohlene Variante von DBMS_JOB führt zu unregelmäßigen Messintervallen.
STATSPACK report for
DB Name
DB Id
DB2
1711619
Instance
Inst Num
DB2
Abb. 5: Report Header.
10
1
Release
OPS
Host
8.1.6.3.0
NO
jupiter
Zu jedem beliebigen Zeitpunkt kann
der Administrator nun für jeden
Zeitraum in der Vergangenheit einen Statistikreport generieren. Hierzu gibt er lediglich die Schnappschuss-ID seines gewünschten
Startzeitpunktes und die Schnappschuss-ID des Endzeitpunktes an.
Die Erstellung eines Reports erfolgt
mit Hilfe des Skripts
ORACLE_HOME/rdbms/admin/
spreport.sql.
Das Ergebnis ist eine Datei mit
dem Namen sp_47_48.lst, wobei 47 und 48 hier für die IDs des
Start- und Endzeitpunktes des Reports stehen. Diese Datei enthält
den Statistikreport. Der Report ist
sehr umfangreich. Aus diesem
Grund erfolgt an dieser Stelle eine
selektierte Auswahl verschiedener
Bereiche. Der Report beginnt mit
einem Kopf, der bereits durch die
Datenbank-ID andeutet, dass Statistiken für alle Datenbanken eines
Unternehmens in einem gemeinsamen Datenpool gehalten werden
können (siehe Abb. 5).
Das Lastprofil
Das Lastprofil gibt einen Überblick
über die Datenbanklast. Sollen Reports unterschiedlicher Datenbanken oder unterschiedliche Reports
einer Datenbank verglichen werden,
so zeigt das Mengenvolumen im
Lastprofil, ob ein Vergleich sinnvoll
ist. Die Angaben erfolgen pro Sekunde und pro Transaktion. Die Anzahl der Transaktionen wird gemessen als Differenz der Anzahl der
user commits aus v$sysstat.
Beim Lastprofil handelt es sich um
Systemstatistiken aus v$system
(siehe Abb. 6).
Die Darstellung der Statistiken
hat sich gegenüber utlbstat/
utlestat nicht verändert. In
diesem Abschnitt finden sich
alle Oracle Statistiken, deren
Ausgabe 1/2002
• ORDIX NEWS •
SYSTEME & DATENBANKEN
Per Second
Per Transaction
2,310,656.32
57,151.72
12,857.09
2,858.28
6,065.74
1,939.00
182.01
188.13
2.55
435.25
40.07
57,660.70
1,426.18
320.84
71.33
151.37
48.39
4.54
4.69
0.06
10.86
dies ein nicht zu
übersehender
Hinweis auf ein
Performance Problem. Wer nun
nachrechnet und
sich wundert, sei
darauf hingewiesen, dass bei
Mehr-CPU-Maschinen die Wartezeiten durchRows per Sort: 26.28
aus größer als
Pct Blocks changed / Read: 22.50
die Messzeit
Recursive Call Pct: 96.95
sein können. Mit
Rollback / transaction Pct:
6.39
Statspack wird
Abb. 6: Lastprofil im Überblick.
der DBA bei der
Analyse der ErWerte zwischen den beiden eignisse besser unterstützt als mit der Variante
Schnappschüssen verändert wurStatistic
Total
per Second
den (Abb. 7).
Redo size:
Logical reads:
Block changes:
Physical reads direct:
Physical reads:
Physical writes:
User calls:
Parses:
Hard parses:
Sorts:
Transactions:
Statistiken sind für sich gesehen
weder gut noch schlecht. Erst der
Vergleich mit anderen Reports
zeigt, wie sich die Systemlast verändert hat. Statistiken stellen ein
wesentliches Kriterium zur Analyse des Datenbankprofils dar.
Ereignisse (Events)
Neues hingegen findet sich im Bereich Ereignisse. Jeder Wartezustand in der Datenbank wird einem
dedizierten Ereignis zugeordnet.
Mit Hilfe dieser Ereignisse ist es
möglich, genau herauszufinden,
wie lange die Datenbankprozesse
auf welche Ereignisse gewartet
haben. Vielen Datenbank-Administratoren (DBAs) fällt es schwer, zwischen sogenannten NULL oder
IDLE Ereignissen und „echten“ Ereignissen zu unterscheiden.
Wenn beispielsweise der Prozess
pmon in 10 Minuten 559 Sekunden
wartet, ist dies vollkommen unproblematisch. Wenn hingegen im
gleichen Zeitraum mehr als 1200
Sekunden für das Ereignis buffer
busy waits verbraucht wurden, ist
Ausgabe 1/2002
CPU used by this session
CPU used when call started
CR blocks created
DBWR buffers scanned
312,534
400,740
39,412
156,140
per Trans
1,041.8
1,335.8
131.4
520.5
26.0
33.3
3.3
13.0
Abb. 7: DB-Statistiken.
utlbstat/utlestat, da neben der herkömmlichen Liste aller Ereignisse zusätzlich die echten
Top 5 Ereignisse aufgeführt werden.
Top 5 Wait Events
Event
buffer busy waits
Latch Free
db file sequential read
direct path read
db file scattered read
Waits
Wait
Time (cs)
% Total
Wt Time
990,529
2,506
83,386
6,839
15,814
89,588
85,177
80,898
56,912
37,693
18.75
17.83
16.93
11.91
7.89
Abb. 8: Beispielliste der „echten“ Top 5 Ereignisse.
Die in Abb. 8 aufgeführte Liste gibt schon einen ersten Hinweis auf das Problem heißer Blöcke. Mit
18,75 Prozent der gesamten Wartezeit stehen die
buffer busy waits an oberster Stelle. Auch das
Ereignis Latch Free ist mit 17,83 Prozent durchaus
signifikant. Sollte sich weiter unten im Report herausstellen, dass dies auf den Latch cache
buffers chains zurückzuführen ist, verursachen
die heißen Blöcke über 36 Prozent der gesamten
Wartezustände.
11
• ORDIX NEWS •
SYSTEME & DATENBANKEN
Class
Waits
Tot Wait
Time (cs)
Avg
Time (cs)
data block
undo block
undo header
segment header
2,288
595
46
295
2,977
138
10
5
1
0
0
0
Abb. 9: Sichtweise aus v$waitstat.
Wartezustände nach Blocktypen
Die Statistik in Abb. 9 zeigt die Wartezustände auf
Oracle Blöcke, differenziert nach der Blockklasse.
Die Wartezustände stellen die Differenz der Werte
aus dem View v$waitstat zwischen den beiden
Schnappschüssen dar. Die Summe aller waits und
Get
Requests
Pct
Get
Miss
Avg
Sleeps
/Miss
Nowait
Requests
344,580
43,202,137
2,289,752
0.0
1.8
0.3
0.0
0.0
0.0
0
2,185,969
1,059,417
Latch Name
cache buffer handles
cache buffers chains
cache buffers lru chain
insgesamt. Eine Trefferquote unter
95 Prozent muss nicht unbedingt
tragisch sein, falls die Anzahl aller
Anforderungen insgesamt sehr niedrig ist.
Im oben aufgeführten Fall ist die
Trefferquote auf dem Latch cache
buffers chains mit 98,2 Prozent nicht besonders gut. Durch die
Anzahl aller Zugriffe ergibt sich aber
ein dramatisches Bild: Wie der
Abb. 11 zu entnehmen ist, musste
in 779.257 Fällen ein Prozess mit
dem Spinning beginnen. Weiterhin
musste in 2.960 Fällen der Prozess ausPct
Nowait
gelagert werden, da
Miss
der Zugriff am Ende
des Spinning immer
noch nicht gelang.
0.1
0.3
Die I/O Statistiken beginnen mit einer Zudie Summe der Wartezeit entsprechen in etwa den sammenfassung der Schreib- und
Wartezuständen des Ereignisses buffer busy Leselast über alle Tablespaces.
waits. Dieser Abschnitt ist also dann und nur dann Eine detaillierte Auflistung pro
interessant, wenn buffer busy waits auftreten.
Datendatei steht ebenfalls zur Verfügung. Insbesondere über lange
Typischerweise stellt die Klasse data block, die Zeiträume lassen sich schleichenKlasse mit den höchsten Wartezuständen dar.
de Verschlechterungen der Zugriffszeiten beim Vergleich mit alGet
Spin &
ten Schnappschüssen auffinRequests
Misses
Sleeps
Sleeps 1-4
den (siehe Abb. 12).
Abb. 10: Latch Statistiken prozentual.
Latch Name
cache buffers chains
redo allocation
library cache
43,202,137
1,948,006
1,629,193
779,257
50,369
16,647
2,960
85
273
776610/24...
50285/83/...
16444/150...
Abb. 11: Latch Statistiken absolut.
Latch Statistiken
Die Trefferquote auf einem Latch - so wird empfohlen - soll über 99 Prozent liegen (vgl. Abb. 10). Viel
wichtiger, neben der reinen Trefferquote, ist aber natürlich die Anzahl der Anforderungen auf einem Latch
Tablespace
INDEX_01
RBS
DATEN_01
Reads
Avg Read
(ms)
Writes
Total
Waits
Avg Wait
(ms)
29,568
28,698
20,061
12.7
4.6
13.2
347,211
111,889
53,684
13
638
294
80.8
2.3
0.2
Abb. 12: Tablespace I/O Statistiken.
12
Wie bereits angekündigt, sind
dies nur einige ausgewählte
Bereiche des Statspack Reports. Eine vollständige Betrachtung würde den Rahmen dieses Artikels sprengen. Der interessierte Leser findet im Literaturverzeichnis am Ende dieses Artikels
weitergehende Bücher und Artikel.
Statspack Erweiterungen
von ORDIX
Die ORDIX-Erweiterungen umfassen im Wesentlichen zwei
Bereiche. Dies ist zum einen
die Behebung von Fehlern im
Standardreport und dessen Erweiterung. Zum anderen wurden
Ausgabe 1/2002
• ORDIX NEWS •
SYSTEME & DATENBANKEN
STATSPACK report for
DB Name
DB Id
DB1
Snap ID
von - bis
18230
18231
18232
18233
18234
Instance
3661711619
-
18231
18232
18233
18234
18235
DB1
Zeit
von - bis
14.05
14.05
14.05
14.05
14.05
22:05-22:10
22:10-22:15
22:15-22:20
22:20-22:25
22:25-22:30
Inst Num
1
Release
OPS
Host
8.1.6.3.0
NO
saturn
Buffer
Hit
Physical
reads
Logical
reads
Physical
rds. Direct
97.43
92.58
94.33
99.51
99.21
205,550
102,738
53,691
52,824
160,930
8,001,434
1,384,547
946,742
10,820,352
20,275,698
32,851
0
0
0
0
Abb. 13: Lese-Last als Zeitreihe.
eine Menge von Skripts zur Zeitreihenanalyse entworfen.
Gerade diese zweite Erweiterung
schöpft das Potential von Statspack vollständig aus. Da die heißen Blöcke bereits ausführlich behandelt wurden, wird an dieser
Stelle Wert auf weitere, spezielle
Auswertungen gelegt.
Erweiterung des
Standardreports
Bei der Verwendung von parallelen
Abfragen verwendet Oracle sogenannte P h y s i c a l reads
Direct . Bei diesen Lesevorgängen werden die Blöcke nicht in
den DB-Block Buffer gelesen, sondern direkt in den Private Buffer
in der PGA. Im Statspack werden
Physical reads Direct nicht
überall korrekt berücksichtigt. Daraus ergibt sich eine falsche Berechnung der Buffer Hit Ratio, die
teilweise sogar negative Werte annimmt.
Zeitreihenanalysen – I/O Statistiken
Etwas genauer soll an dieser Stelle auf die Zeitreihenanalysen eingegangen werden. Beispielsweise
ist die I/O Statistik eine gute Ausgangsbasis für die
Analyse der Systemlast. Wie bereits zuvor erwähnt,
berücksichtigt dieser Report auch die Physical
reads Direct. Schneller kann der DBA keinen
Eindruck davon bekommen, wie hoch die lesende
Last seines Datenbanksystems ist und wie gut die
Trefferquote ist. Ein Beispiel finden Sie in Abb. 13.
Hilfreich ist dieser Report, weil die Buffer Hit Ratio
ohne die absolute Anzahl der Physical reads
nicht aussagekräftig ist. Selbstverständlich ist es
relativ einfach möglich, die Daten auch tabellarisch
abzuspeichern.
Buffer Hit Ratio
%
102
100
98
99,51
99,21
18233
18234
97,43
96
94,33
94
92,58
92
90
Im von ORDIX erweiterten Statspack Report wurde dieses Manko
behoben. Diese Form von I/O findet an allen Stellen eine entsprechende Berücksichtigung.
Eine sehr einfache Änderung besteht in der Erweiterung der Liste
der IDLE Events, die in der aktuellen Version von Statspack noch
nicht enthalten ist.
Ausgabe 1/2002
88
18230
18231
18232
Start ID
Abb. 14: Import der Zeitreihen in Excel.
Diese Daten können dann, wie in Abb. 14 gezeigt,
in Excel importiert und für Managemententscheidungen grafisch aufbereitet werden. Insbesondere
bei großen Projekten ist dieser Aspekt besonders
wichtig.
13
• ORDIX NEWS •
SYSTEME & DATENBANKEN
Zeitreihenanalysen – Auswertung einzelner
Statistiken
Der Statistik Report zeigt die Werte einer einzelnen
Statistik für einen Bereich von Schnappschüssen.
Nach Eingabe des Namens der Statistik
Enter statistic name: table fetch
continued row
sowie des Schnappschussbereiches erzeugt der
Report eine Liste aller Werte für diese Statistik. Abb.
15 zeigt die Statistik table fetch continued
row, also die Anzahl aller selektierten chained
und migrated rows. Dies ist z. B. sehr hilfreich,
um kritische Zeiträume zu finden.
Oft treten Probleme - wie hier die chained rows nur zu ganz bestimmten Zeiten auf. Mit der Zeitreihenanalyse kann bei einem konkreten Verdacht
schnell für eine sehr große Zeitspanne ein konkreter Statistikwert analysiert werden.
Statistic for:
table fetch continued row
SnapIDs
18230
18231
18232
18233
18234
18235
18236
18237
18238
-
Time Rage STATS_VALUE
18231
18232
18233
18234
18235
18236
18237
18238
18239
14.05
14.05
14.05
14.05
14.05
14.05
14.05
14.05
14.05
22:05-22:10
22:10-22:15
22:15-22:20
22:20-22:25
22:25-22:30
22:30-22:35
22:35-22:40
22:40-22:45
22:45-22:50
190229
133
70
104
164
63
70
70
386564
Abb. 15: Statistiken als Zeitreihe.
Fazit
Mit Statspack steht ein sehr mächtiges Werkzeug
zur Serveranalyse zur Verfügung. Folgende Vorteile
bringt das Werkzeug mit:
-
sehr leichte Bedienung
höchstmögliche Detaillierungsstufe
vergangenheitsbezogen
OPS fähig
wenig Einfluss auf Performance
geringer Speicherbedarf
Programmcode steht frei zur Verfügung
Mit den aufgezeigten Erweiterungen ist es möglich,
in sehr kurzer Zeit die kritischen Phasen eines Tages oder einer Nacht zu identifizieren. Anschließend
kann der benötigte Report über diesen Zeitraum
14
Literatur
Oracle 8i Internal Services,
O’Reilly, Steve Adams, ISBN 1-56592598-X
Bewertung: W e r w i r k l i c h w i s s e n
möchte, wie Oracle intern funktioniert. Absolut zu empfehlen.
High Performance-Tuning with
STATSPACK, Oracle Press,
Donald K. Burleson, ISBN 0-07213378-3
Bewertung: Guter Überblick, viele Skripts, auch zur Präsentation,
nicht sehr tiefgehend.
Statspack – Serie, Connie
Dialeris and Graham Wood,
ORACLE Magazine, September /
Oktober 2000 ff.
Bewertung: Sehr gute Einführung
in die Handhabung und Auswertung von Statspack.
nachträglich generiert werden.
Dies ist auch noch Wochen später möglich. Da Statspack kostenlos ausgeliefert wird, ist das Preis/
Leistungsverhältnis unschlagbar.
Wenn Statspack erst einmal im
Einsatz ist, möchte man es nicht
mehr missen.
Den genannten Vorteilen stehen
allerdings auch einige Nachteile
gegenüber. Der Anwender muss
über ein sehr umfangreiches Datenbankwissen verfügen. Hinweise
auf Probleme müssen selbst erarbeitet und analysiert werden.
ORDIX bietet die hier vorgestellten
Erweiterungen im Zuge von Beratungsleistungen an. Bei Bedarf können wir Ihnen gerne Referenz-Kunden nennen.
Die Analyse von Statistiken ist ein
großer Bestandteil unserer Oracle
Tuning Trainings. Termine zu unseren Seminaren finden Sie auf der
letzten Doppelseite dieser ORDIX
News oder im Trainings-Shop im
Internet unter http://training.ordix.de.
Martin Hoermann ([email protected]).
Ausgabe 1/2002
• ORDIX NEWS •
AKTUELL
Gute Resonanz auf der
Product- & Trend Show 2002
Einmal im Jahr wird Paderborn für drei Tage zum Zentrum der ITWelt. Sechs Wochen vor der CeBIT findet die inzwischen traditionsreiche Product- & Trend Show von Wincor Nixdorf und Fujitsu Siemens Computers statt.
Unter dem Motto „Powering the Information Age“ trafen sich vom 29.31.01.2002 mehr als 14.000 Kunden, Partner und Journalisten in
den Welle-Messehallen.
ORDIX arbeitet seit den Anfängen
des Unternehmens (1990) eng mit
beiden Datenbankprodukten und ist
seit mehr als 8 Jahren Oracle- und
Informix Partner. Gutes Datenbankund Produkt Know-how zahlt
sich insbesondere bei Umstellungen aus. Da blickt ORDIX auf
einen großen Erfahrungsschatz
an diversen Umstellungsprojekten zurück. Dies sind sowohl
Umstellungen von Informix auf
Oracle als auch umgekehrt.
Auch in diesem Jahr wurden die Besucher der Product- & Trend Show
mit „heißen“ Show-Einlagen unterhalten.
Auf der Insel „Migration2 “
stellten ORDIX und vier weitere Partnerunternehmen
ihre unterschiedlichen Beratungsleistungen rund um
das Thema Migration vor.
Dem Kunden kommt dabei insbesondere die Unabhängigkeit
in der Beratung zu gute, da das
Systemhaus im Datenbankbereich keine herstellerabhängigen
Schwerpunkte setzt
und historisch bedingt
von jeher „zwei Fraktionen“ im Unternehmen bestehen, die im
regen Austausch miteinander konkurrieren.
Unter dem Titel „Future Perspectives for Informix User“
beriet ORDIX insbesondere
Informix-Anwender zur Frage: Migration (nach Oracle/
DB2/etc.) oder Neuentwicklung? Von der Machbarkeitsanalyse über Konzeption
und Realisierung bis hin zur
Einführung wurden die strategischen Optionen der Kunden erörtert. Lesen Sie hierzu auch den Artikel „Informix: Fragen an die Zukunft“
auf Seite 41.
Zwischen den Fachgesprächen gab es
diverse Programmpunkte, wie Werksführungen, Verlosungen und stündliche
Show-Einlagen, die
immer wieder für Erholung sorgten. Angesichts der mehr als
frühlingshaften Temperaturen in der Halle
waren allerdings die
Cocktails unangefochten „der Renner“.
Zukunftsperspektiven für Informix-Anwender veranschaulichten die ORDIX
Berater ...
Ausgabe 1/2002
... während sich Zukunftsvisionen
ganz anderer Natur - wie dieser
Einkaufswagen - zum greifen nahe
nebenan präsentierten: Die WincorWorld findet parallel zur Product& Trend Show statt. Sie zeigt Neuigkeiten u. a. im Bereich Banking
und Kassensysteme.
15
• ORDIX NEWS •
SYSTEM MANAGEMENT
Neue Funktionen in
DashBoard 6.4
Seit Oktober 2001 ist die neue Version 6.4 des BMC Produktes DashBoard verfügbar. Neben einigen Verbesserungen hat DashBoard in der Version 6.4 neue Funktionen bekommen.
Im Folgenden werden die in der neuen Version zur Verfügung stehenden Funktionen zur Messung des Antwortzeitverhaltens (Applikation Response Time/ART)
vorgestellt. Diesem Thema kommt neben der Verfügbarkeit im Zusammenhang
mit den Service Vereinbarungen (SLA/SLV) eine immer größer werdende Bedeutung zu. In diesem Themengebiet ist der Unternehmensbereich System Management der ORDIX als Ergänzung zum klassischen Monitoring aktiv.
1. Messung des Antwortzeitverhaltens von einem Windows Client aus mittels PATROL EndTo-End Response Time Management (PETERT)
2. Messung des Antwortzeitverhaltens mit einer Probe (Netscout & Sniffer Pro mit ART MIB)
Auf dem Windows Client wird die Applikation PETERT
installiert, die Benutzer-Requests an den Server sendet und die gemessene Antwortzeit an die PATROL
DashBoard-Applikation weitersendet.
-
-
-
-
-
PETERT erlaubt die Aufzeichnung einer Transaktion einer IP-basierenden Client/Server Applikation von einem Windows Client aus.
Die Applikation kann diese Transaktion zu bestimmten Zeiten wiederholen, um Antwortzeitverhalten und Verfügbarkeit zu überprüfen.
Sie sendet die so gewonnenen Informationen
an die DashBoard Applikation zur Auswertung.
-
-
Nimmt das durchschnittliche
Antwortzeitverhalten (Differenz
zwischen ausgehenden und
ankommenden TCP oder UDP
Paketen) auf.
Ist verfügbar mit den Network
Associates Proben Sniffer Pro
und Netscout Proben.
Entspricht annähernd den tatsächlichen Werten, da die Probe in der Nähe des Servers angebracht werden kann.
Sämtliche ART-Funktionalitäten werden unterstützt.
Mit dieser Methode liest DashBoard
die gesammelte ART-Information
der installierten Probe und wertet
diese aus. Hierzu sind keine weiteren Agenten auf den Arbeitsstationen erforderlich.
3. Messung des Antwortzeitverhaltens mit dem Cisco Service
Assurance Agent (SAA)
-
DashBoard 6.4 Benutzerschnittstelle mit “Class of
Service”-Darstellung.
16
Misst das Antwortzeitverhalten
zum Server und gibt diese Daten an die DashBoard-Applikation weiter.
Bei Erreichen von Schwellwerten in Kooperation mit dem
Cisco-SAA-Response-Time-
Ausgabe 1/2002
• ORDIX NEWS •
SYSTEM MANAGEMENT
-
Measurement wird automatisch das Diagnostik
Modul gestartet.
Sämtliche SAA Möglichkeiten werden unterstützt.
Bei SAA-fähigen Cisco Geräten lässt sich mit DashBoard 6.4 der SAA konfigurieren und die damit gesammelten Informationen lassen sich auslesen. Die Metrics
liegen mit dieser Methode nahe an den tatsächlichen
Werten.
DashBoard Funktionalität
Mit Hilfe der neuen Funktionen kann man vielfältigen
Netzproblemen auf den Grund gehen. Die Long-TermTrend Reports und graphischen Darstellungen helfen
dabei. Insbesondere empfiehlt sich DashBoard 6.4 zur
Diagnose von
ORDIX News
Impressum:
Herausgeber:
ORDIX AG, Aktiengesellschaft für Softwareentwicklung, Beratung, Schulung und Systemintegration, Paderborn
Redaktion:
Sascia Brinkmann, Helma Jenniches
V.i.S.d.P.: Wolfgang Kögler
Autoren dieser Ausgabe:
-
Laufzeitschwankungen
nicht ausreichendem Anwortzeitverhalten
zu langen Laufzeiten und
lokalen Belastungen wie z. B.
- Rechnerlast
- Paket Input/Output und
- Protokoll-Last.
Ab Version 6.4 kann in den DashBoard-Diagrammen
auch nach „Class of Service“ (COS) unterschieden
werden. So ist z. B. folgende Aufteilung möglich:
-
COS0: SNA Verkehr
COS1: ERP
COS2: W3
COS4: Mail
COS5: FTP
usw.
Die Schwellwerte, bei deren Erreichen Aktionen ausgelöst werden, lassen sich für jede Service-Klasse separat einstellen. Auch die Trend- und Long-Term-Trend
Reports können nach COS unterteilt werden.
Das DashBoard Benutzerinterface in unserer Abbildung
zeigt die Einteilung der IP-Pakete in die COS-Klassen
udp, snmp und default.
Zusätzlich existiert nun eine manuelle und automatische Exportmöglichkeit in eine Oracle-Datenbank auf
Basis des Common Information Model (CIM). Diese
Daten können wiederum für das Service Reporting genutzt werden.
Christoph Borowski, Martin Hoermann, Helma Jenniches, Matthias Jung, Wolfgang Kögler, Ralf Korczykowski, Lars Hendrik Korte, Beate Künneke, Mario
Möllers, Christian Ramm, Uwe Rübesamen, Markus
Schreier, Ingo Vogt
Anschrift der Redaktion:
Westernmauer 12 - 16
D-33098 Paderborn
Fon: 0 52 51 / 10 63 - 0
Fax: 0 52 51 / 10 63 - 99
Druck:
Druckerei Reike GmbH, Paderborn
Gestaltung/Layout:
Sascia Brinkmann
Copyright:
ORDIX AG. Alle Rechte vorbehalten. Die Zeitschrift ORDIX News hat eine Auflage von 7.500
Exemplaren. Sie wird von der ORDIX AG an
ausgesuchte Kunden und an die Mitglieder der
GUUG kostenlos verteilt.
Außerdem finden Sie die neueste Ausgabe der
ORDIX News im Internet unter:
http://www.ordix.de
Schauen Sie mal rein.
Der Kontakt zu unseren Lesern ist uns sehr
wichtig. Für Anregungen, Kritik und Anmerkungen zu den Themen, aber auch für interessante Ideen sind wir immer offen und dankbar. Sie
erreichen die Redaktion auch per E-Mail unter
[email protected]. Wir freuen uns auf Ihr Feedback.
Ralf Korczykowski ([email protected]).
Ausgabe 1/2002
17
• ORDIX NEWS •
JAVA
¿Habla usted
español?
... Do you speak English? ... Sprechen Sie Deutsch? ... Parlez vous français? ...
Wird Ihnen die Frage im Urlaub gestellt, schütteln sie den Kopf, lächeln freundlich dazu und jeder versteht es. Im Internet oder in einer Anwendung hilft Kopfschütteln in der Regel nicht weiter. Sie müssen die Frage richtig verstehen, um
die richtige Antwort geben zu können. Dieses Problem löst der Entwickler, indem er die benötigten Übersetzungen zur Verfügung stellt. Diese Internationalisierung muss sich nahtlos in den Entwicklungsprozess integrieren. Java unterstützt dies durch eine Vielzahl von Möglichkeiten.
Übersicht
Java kategorisiert alle Sprachen anhand von drei
Identifizierungsmerkmalen:
•
Das Sprachkürzel gemäß der ISO-369, mit dem
die eigentliche Basissprache definiert wird.
Beispiele: en (englisch), de (deutsch), fr (französisch), sp (spanisch).
•
Das Länderkürzel gemäß der ISO-3166, mit
dem das Land definiert wird. Länderspezifische
Besonderheiten werden hierdurch berücksichtigt. In Amerika beginnt das Datum mit dem
Monat, während in England der Tag am Anfang
steht. Typische Länderkürzel sind: US (Amerika), GB (Großbritannien), DE (Deutschland), AU
(Österreich).
•
Das optionale Variantenkürzel, mit dem zusätzliche Unterscheidungen verarbeitet werden können. Diese sind frei definierbar und können
z. B. eingesetzt werden, um Plattformabhängigkeiten (WIN, MAC, ...) zu verarbeiten oder
regionale Besonderheiten zu integrieren. In der
Praxis wird man dieses Kürzel aber eher selten einsetzen.
Aus diesen Informationen lässt sich für jeden Anwender ein Sprach-Beschreibungs-Objekt „Locale“ erstellen. Java ermittelt hiermit die richtigen Übersetzungen und Darstellungen (Abb.1). Die Möglichkeiten, die Internationalisierung anzuwenden, gliedern
sich im Wesentlichen in zwei Funktionsgruppen:
Zahlen, Zeit- und Datumsangaben
Zur Darstellung dieser Datentypen stehen dem Entwickler verschiedene Methoden zur Verfügung. Hier-
18
bei werden verschiedene Ausgabeformate zur Verfügung gestellt.
Beispiel: Datum kurz: 10.01.2002;
Datum lang: 10. Januar 2002. Zusätzlich existieren Parser zum Konvertieren von Eingabetexten in die
entsprechenden Datentypen. Es
werden die verschiedenen Formate unterstützt.
Texte
Texte können nicht automatisch
übersetzt werden. Hier verwendet
Java das Substitutionsprinzip. Für
alle benötigten Texte wird ein eindeutiger Schlüssel definiert, dem
der richtige Text zugeordnet wird.
Alle Texte für eine Sprache werden
in einer Textdatei abgelegt. Mit einer Methode lassen sich dann die
richtigen Übersetzungen für die benötigte „Locale“ abrufen. Zusätzlich existieren Sortiermethoden, die
z. B. Umlaute, Sonderzeichen und
ähnliches berücksichtigen.
Vorgehen
Zum Projektstart sollte die Entscheidung getroffen werden, ob
mehr als eine Sprache unterstützt
werden soll oder nicht. Eine nachträgliche Entscheidung führt immer
dazu, dass alle realisierten Modu-
Ausgabe 1/2002
JAVA
• ORDIX NEWS •
le bzgl. der Ein-/Ausgaben überarbeitet werden müssen. Dies bringt
nicht nur zusätzlichen Entwicklungsaufwand mit sich, sondern
auch zusätzlichen Testaufwand.
Unabhängig von dieser Entscheidung sollte man Ein-/Ausgabetexte
grundsätzlich nicht im Sourcecode
hinterlegen.
Als nächstes wird eine Basissprache festgelegt, mit der die Entwicklung beginnt. Dies wird in der Regel Englisch sein. Zusätzliche Sprachen werden erst später eingeführt,
wenn sich die Entwicklung gefestigt hat und damit auch klar ist, welche Informationen übersetzt werden müssen.
Eine Musterimplementierung wird
erstellt, mit der die Anwendung der
Internationalisierung definiert wird.
Anhand dieser werden alle beteiligten Entwickler geschult. Anschließend beginnt die eigentliche Entwicklung.
Nachdem die ersten Masken/Funktionen fertiggestellt sind, werden
die benötigten Übersetzungen erstellt. Diese können bei den ohnehin notwendigen Tests dann direkt
mit überprüft werden.
Implementierung
Die eigentliche Implementierung
erfolgt in vier Schritten.
1. Schritt: Properties-Dateien
Für die Übersetzung von Texten
werden Wertepaare Schlüssel =
übersetzter Text benötigt. Diese werden für jede Sprache in eine
Textdatei abgelegt. Es wird eine
Basissprache benötigt, die alle verwendeten Schlüssel enthält. Diese wird in einer Datei ResourceName.properties abgelegt. Der
ResourceName ist frei wählbar.
Alle weiteren Übersetzungen werden jeweils in einer zusätzlichen
Datei gespeichert. Der Name ent-
Ausgabe 1/2002
Abb. 1: Ein Dialog in vier verschiedenen Sprachvariationen aufgerufen. Alle Felder sind sprachabhängig.
hält neben dem ResourceNamen die zusätzlich
benötigten Informationen über die Locale und lautet z. B. ResourceName_en_US.properties.
Hierbei ist _en_US die ergänzende Locale-Information. Vorteilhaft ist, dass nicht alle Texte in alle
Sprachen übersetzt werden müssen. Java ergänzt
fehlende Texte einer Locale aus der Datei für die
Sprache bzw. aus der Basissprache.
Diese Dateien lassen sich mit einem speziellen
Properties-Editor, einem Texteditor oder mit Excel
(siehe Abb. 2) erstellen. Wird zur Erstellung ein Texteditor verwendet, muss das Properties-Format berücksichtigt werden. Bei der Erstellung in Excel werden in der ersten Spalte alle Schlüssel gepflegt, in
Abb. 2: Excel-Sheet, mit dem die Texte für das Programmbeispiel in Abb. 1 erstellt wurden.
19
• ORDIX NEWS •
der 2. Spalte die Texte der Basisübersetzung. Die
weiteren Spalten enthalten die gewünschten Übersetzungen. Die Properties-Dateien lassen sich mit
Hilfe einer Visual-Basic-Routine erstellen. Der Vorteil dieses Verfahrens ist, dass die eigentlichen
Übersetzungen auch von einem Nicht-Entwickler gepflegt werden können.
ResourceBundle resourceBundle
= ResourceBundle.getBundle
(″ ResourceName″ , loc);
2. Schritt: Locale erzeugen
Damit Java erkennen kann, welche Sprachvariante
genutzt werden soll, muss eine Locale angelegt
werden. Diese kann manuell erfolgen:
Locale loc = new Locale(″ de″ , ″ DE″ );
4. Schritt: Anwendung
Nach Abschluss der Vorbereitungen werden alle Ein-/Ausgaben
unter Verwendung der Internationalisierungs-Methoden implementiert.
So lassen sich zum Beispiel landesspezifische Texte mit der Methode getString() laden; ein
Datum lässt sich mit einem DateFormatter-Objekt in das gewünschte Ausgabeformat konvertieren.
Den Sourcecode für die Internationalisierung des Demo-Dialogs finden Sie in Abb. 3.
Die aktuelle Locale kann aber auch mit einer Methode abgefragt werden. Dabei werden dann die Einstellungen des Betriebssystems berücksichtigt:
Locale loc = Locale.getLocale();
3. Schritt: ResourceBundles
Die eigentlichen Texte müssen aus den PropertiesDateien geladen und im Arbeitsspeicher abgelegt
werden. Hierzu werden ResourceBundle-Objekte verwendet:
public void initData() {
// fill fixed fields
lLblDate.setText(resourceBundle.getString(
"dlgCheckInDate"));
lLblTime.setText(resourceBundle.getString(
"dlgCheckInTime"));
lLblSurName.setText(resourceBundle.getString(
"dlgCheckInSurName"));
lLblForName.setText(resourceBundle.getString(
"dlgCheckInForName"));
lLblBaggage.setText(resourceBundle.getString(
"dlgCheckInBaggage"));
rbnYes.setText(resourceBundle.getString("YES"));
rbnNo.setText(resourceBundle.getString("NO"));
// fill variable fields
Date lActDate = new Date();
DateFormat lDateFormater = DateFormat.getDateInstance(
DateFormat.FULL,resourceBundle.getLocale());
DateFormat lTimeFormater = DateFormat.getTimeInstance(
DateFormat.MEDIUM,resourceBundle.getLocale());
txfDate.setText( lDateFormater.format(lActDate));
txfTime.setText( lTimeFormater.format(lActDate));
txfSurName.setText(resourceBundle.getString(
"dlgCheckInSurNameDefault"));
txfForName.setText(resourceBundle.getString(
"dlgCheckInForNameDefault"));
} // end initData()
Abb. 3: Source-Beispiel für die Anwendung von
Locale- und ResourceBundle-Objekten.
20
JAVA
ResourceName stellt den im ersten Schritt beschriebenen, frei wählbaren Namen dar.
Fazit
Java bietet den Entwicklern ein umfangreiches Paket, um Anwendungen für den Einsatz in der großen
weiten Welt vorzubereiten. Hierbei
beschränkt sich dies nicht nur auf
die Landessprache und Englisch.
Zusätzliche Sprachen können ohne
zusätzlichen Entwicklungsaufwand
und ohne die Entwicklung hinzugefügt werden.
Wird die Internationalisierung am
Projektstart eingeführt, so bewegt
sich der Aufwand für die Vorbereitung im Bereich von 2-5 Personentagen beim ersten Projekt. Zusätzlich muss noch der Aufwand für die
Schulung der Mitarbeiter (ca. 2-4
Stunden/Mitarbeiter) berücksichtigt
werden. Der Rest ist nur noch einfaches Anwenden und bedeutet
keinen messbaren Mehraufwand.
Alles in allem spricht nichts dagegen, mehrsprachig zu werden. Wir
helfen Ihnen gerne dabei.
Christian Ramm ([email protected]).
Ausgabe 1/2002
SYSTEME & APPLIKATIONEN
• ORDIX NEWS •
Neues von der
R/3-Überwachung
In früheren Ausgaben (01/2001 und 02/2001) wurde an dieser Stelle die Überwachung von SAP R/3-Systemen mit Hilfe der PATROL for R/3 Suite vorgestellt. Von
diesem Produkt gibt es seit Januar diesen Jahres ein neues Release, in das einige Änderungen und Erweiterungen implementiert wurden. Diese Neuheiten stellen wir Ihnen im folgenden Überblick vor.
Der grundsätzliche Aufbau und die
Funktionsweise des Produktes haben sich nicht verändert. Die Suite, die jetzt „PATROL for SAP Solution Suite Version 4.2.10“ heißt,
umfasst weiterhin die vier Produkte Trak, S.L. Reporter, DB-Maintain
und Manager. Auch die Art und der
Umfang der Installation haben sich
gegenüber älteren Releases nur
unwesentlich geändert.
Der eigene Namensraum
Eine der gravierendsten Neuerungen ist der eigene Namensraum,
den das Produkt jetzt von SAP bekommen hat. Für die Nutzung hat
das den Vorteil, dass die Möglichkeit von Konflikten mit Eigenentwicklungen auf ein Minimum reduziert wurde. Sollte bereits eine ältere Version des Produktes im Einsatz gewesen sein, besteht innerhalb des Upgrades auf die neue
Version die Möglichkeit, die zuvor
gesammelten Daten in die neuen
Tablespaces zu übernehmen, so
dass die Historiendaten auch nach
dem Wechsel zur neuen Version
zur Verfügung stehen.
Hinzugekommen ist dafür aber die Unterstützung
des Releases 4.6D.
Überwachung der “New Dimension
Produkte”
Ebenfalls neu ist die Möglichkeit der Überwachung
der sogenannten „New Dimension Produkte“ SAP
APO (Advanced Planner and Optimizer), SAP BW
(Business Information Warehouse) und SAP ITS
(Internet Transaction Server). Weitere Informationen
zum genauen Umfang der Überwachung dieser
Produkte finden Sie im Internet auf der BMC Homepage unter http://www.bmc.com/support.html.
Einfachere Anbindung und erweiterte
Reporterstellung
Mit dem neuen Release wurde die Anbindung an
die PATROL-Konsole wesentlich vereinfacht. Es
werden keine zusätzlichen Transporte o. ä. benötigt, wie das beim letzten Release der Fall war. Die
Suite ist somit jetzt voll in die PATROL-Produktpalette integriert. Zusätzlich wurde auch die Möglichkeit geschaffen, webbasierte Reports mit Hilfe
der Service Reporting Infrastruktur zu erstellen. Hier
werden die gesammelten Daten in einer externen
Datenbank (nicht im SAP) gespeichert. Dieser Mechanismus wird in Zukunft das existierende WebReporting auf Excel-Basis ersetzen. Mit der aktuellen Version stehen aber noch beide Möglichkeiten
zur Verfügung.
Unterstützte Versionen
Als weitere Neuerung unterstützt
die Suite jetzt alle SAP Releases
ab Version 4.0B, d. h. gegenüber
den Vorversionen werden keine älteren Release-Stände mehr unterstützt.
Ausgabe 1/2002
Weitere Informationen zu den Veränderungen und
Erweiterungen der einzelnen Produkte finden Sie
ebenfalls auf der oben genannten Internetseite. Diese enthält auch eine Aufstellung, welche Betriebssysteme und Datenbanken unterstützt werden.
Mario Möllers ([email protected]).
21
• ORDIX NEWS •
SYSTEME & NETZE
Dynamische PDF-Dateien
mit PHP erstellen
Das Portable Document Format, kurz PDF, kann mittlerweile sicherlich als QuasiStandard zum Austausch von elektronischen Dokumenten bezeichnet werden.
Kaum eine größere Web-Seite kommt heute noch ohne diesen Dateityp aus. Die
Gründe hierfür sind naheliegend: PDFs können auf nahezu jedem Betriebssystem
geöffnet werden. Die Dateigröße ist im Vergleich zur Originaldatei wesentlich
reduziert und das Layout entspricht 100%ig der zugrundeliegenden Vorlage unabhängig von den auf dem System installierten Schriften, Software usw.
PHP & PDF
Einen Nachteil besitzen die klassisch erstellten
PDF-Dokumente jedoch: Sie sind statisch.
2.
Man erzeugt das Dokument
im Speicher des Servers und
schickt es direkt an den Browser, der die Anfrage gestellt
hat.
Die serverseitige Skriptsprache PHP bietet hier Abhilfe. PHP beinhaltet umfangreiche Funktionen, die
es ermöglichen, PDF-Dokumente dynamisch zu generieren. Was wird hierfür benötigt? Im Wesentlichen beschränken sich die Anforderungen auf einen lauffähigen Web-Server (vorzugsweise Apache),
der in der Lage ist, PHP-Skripte zu verarbeiten. Dabei
spielt es keine Rolle, ob PHP als Web-Server-Modul oder als CGI-Programm arbeitet.
An dieser Stelle gehen wir lediglich
auf die zweite Variante ein, da sie
in der Praxis vermutlich häufiger
Anwendung finden wird. Es sei darauf hingewiesen, dass selbstverständlich nicht alle PDF-Funktionen, die unter PHP möglich sind,
hier dokumentiert werden können.
Die PDFlib
Datei anlegen
Unverzichtbar ist jedoch die PDFlib-Bibliothek, die
in das arbeitende System integriert werden muss.
(Eine Demo-Version kann unter www.pdflib.com
bezogen werden.) Die Installation der Bibliothek geht
anhand der mitgelieferten Anleitung recht einfach
von statten.
Um eine PDF-Datei anzulegen, die
nicht im Filesystem des Servers
abgelegt werden soll, genügen die
folgenden Zeilen:
Leider ist der offizielle Einsatz, d. h. alles, was über
eine Evaluierung hinausgeht, nur mit einer Lizenz
möglich. Die Kosten für die einfache PDFlib, die
zur Erzeugung von PDF-Dokumenten vollkommen
ausreicht, betragen dabei 500 US $ pro eingesetzter Web-Server-CPU.
$pdf_datei = PDF_new();
PDF_open_file($pdf_datei);
Zusätzlich hat man hier die Möglichkeit, diverse zusätzliche Dateiinformationen einzutragen, die in den
Dokumenteigenschaften (im Acrobat Reader) später wieder angezeigt
werden.
PDFs erstellen
Zur Erstellung eines PDFs gibt es generell zwei
Optionen:
1. Man erzeugt das PDF im Filesystem und stellt
es beispielsweise über einen Link zum Download bereit.
22
Beispielsweise kann sich hier der
Verfasser eines Dokumentes „verewigen“:
PDF_set_info($pdf_datei,
″ Creator″ , ″ ORDIX News″ );
Ausgabe 1/2002
• ORDIX NEWS •
SYSTEME & NETZE
Seiten definieren, Inhalte
ausgeben
Beim Anlegen eines PDF-Dokumentes ist es ungewöhnlich, dass
die Inhalte seitenweise definiert
werden. Man sollte sich also vorher
überlegen, welche Inhalte an welcher Stelle beziehungsweise auf
welcher Seite auftauchen sollen.
Der Aufruf zur Erstellung einer Seite sieht wie folgt aus:
ausgehend von der unteren linken Ecke einer Seite
(0,0). Für die obere linke Ecke, an der die meisten
Dokumente beginnen sollten, ergeben sich somit
die Werte 0,842. Unter Berücksichtigung eines
Randes ergeben sich dann beispielsweise die Werte
20,800.
Hyperlinks werden anhand von Rechtecken definiert,
deren linke untere Ecke analog zu der zuvor beschriebenen Vorgehensweise bestimmt wird. Zusätzlich wird über zwei weitere Parameter die obere rechte Ecke festgelegt:
PDF_begin_page($pdf_datei,
595, 842);
PDF_add_weblink($pdf_datei, 20, 812,
250, 800, ″ http://www.ordix.de″ );
Die Werte 595 und 842 definieren
dabei die Seitenbreite und -höhe in
Punkten. Für eine DIN A4 Seite ergibt sich damit die exemplarische
Umrechnung für die Seitenbreite
(210 mm/0,3528 = 595 Punkte).
Der so definierte Bereich sollte den oben ausgegebenen
Text „Diese PDF-Datei wurde
mit PHP erstellt“ verlinken.
Selbstverständlich können
über diverse weitere Befehle
auch grafische Inhalte, z. B.
geometrische Figuren (Kreise, Rechtecke) und/oder Grafiken (GIF, JPG, PNG, TIF) hinterlegt werden. Aus platztechnischen Gründen soll an
dieser Stelle auf diese Funktionen nicht näher eingegangen werden.
Nachdem das Format der Seite
geklärt ist, sollten nun noch Schriftart und -größe festgelegt werden:
$font =
PDF_findfont($pdf_datei,
″ Helvetica-Bold″ , ″ host″ ,
0);
PDF_setfont($pdfdatei,
$font, 12.0);
//der Wert 12.0
//definiert die
//Schriftgröße in Punkten
Nun steht der ersten Ausgabe von
Inhalten nichts mehr im Wege:
PDF_set_text_pos($pdfdatei,
20, 800);
PDF_show($pdfdatei,
″ Diese PDF-Datei wurde
mit PHP erstellt″ );
Der Befehl PDF_set_text_pos
definiert, an welcher Stelle der
Text auf der zuvor definierten Seite
platziert werden soll. In diesem
Zusammenhang stellt sich die
Frage nach den Angaben 20, 800:
Die Platzierung aller Inhalte erfolgt
Ausgabe 1/2002
Die jeweils aktuelle PHP-Version können
Sie unter www.php.net downloaden.
Interessant ist auch die Möglichkeit, Lesezeichen
einzurichten. Gerade bei längeren Dokumenten erleichtern diese die Navigation erheblich. Lesezeichen müssen immer im Zusammenhang mit der
zu verlinkenden Datei stehen, d. h. sie müssen zwischen dem PDF_begin_page(x,y,z), das eine Seite einleitet und dem PDF_end_page(x), das eine
Seite abschließt, definiert werden:
PDF_add_bookmark($pdf_datei, ″ Name
des Lesezeichens″ , 0,0);
Selbstverständlich können mittels der Befehle
PDF_begin_page(x,y,z) und PDF_end_page(x)
beliebig viele Seiten in einem PDF-Dokument
angelegt werden.
Datei abschließen und verschicken
Um eine PDF-Datei zu beenden, muss der Befehl
PDF_close($pdf_datei); aufgerufen werden.
23
• ORDIX NEWS •
# $buf = PDF_get_buffer($pdfdatei);
# $len = strlen($buf);
// OPTION 1: Direkte Anzeige
# header("Content-type: application/pdf");
# header("Content-Length: $len");
# print $buf;
SYSTEME & NETZE
1.
2.
//OPTION 2: Download
# header("Content-type: Attachment/ filename=ordix.pdf");
# header("Content-Length: $len");
# print $buf;
Abb. 1: Festlegen, ob das PDF im Browser angezeigt
werden soll, oder ob nur die Möglichkeit zum Download bestehen soll.
Da wir uns anfangs für die direkte Übermittlung des
Dokumentes an den anfragenden Browser entschieden haben, bestehen nun zwei weitere Auswahlmöglichkeiten:
Das Dokument wird „ungefragt“ direkt im Browser über
das Acrobat Reader Plug-In
angezeigt.
Es kann festgelegt werden,
dass der Nutzer zunächst das
bekannte Auswahlfenster sehen soll, bei dem er sich entscheiden kann, ob er das Dokument downloaden möchte
(Übermittlung als Attachment),
oder ob es direkt im Browser
angezeigt werden soll.
Diese Unterscheidung wird über
unterschiedliche Header realisiert.
Die ersten Befehlszeilen sind jedoch für beide Varianten gleich (siehe Abb. 1).
Fazit
<?
// Datei anlegen
$pdf_datei = PDF_new();
PDF_open_file($pdf_datei);
PDF_set_info($pdf_datei, "Creator", "ORDIX AG");
PDF_set_info($pdf_datei, "Author", "Matthias Jung");
PDF_set_info($pdf_datei, "Title", "PHP kann auch PDFs erzeugen :-)");
// Seiten definieren
PDF_begin_page($pdf_datei, 595, 842);
// Schrift definieren
$font = PDF_findfont($pdf_datei, "Helvetica-Bold", "host", 0);
PDF_setfont($pdf_datei, $font, 12.0);
PDF_set_text_pos(§pdf_datei, 20, 800);
// Text ausgeben
PDF_show($pdf_datei, "Diese PDF-Datei wurde mit PHP erstellt");
// Link anlegen
PDF_add_weblink($pdf_datei, 20, 812, 250 , 800, "http://www.ordix.de");
// Lesezeichen setzen
PDF_add_bookmark($pdf_datei, "Seite1", 0,0);
PDF_end_page($pdf_datei);
// Datei abschließen
PDF_close($pdf_datei);
$buf = PDF_get_buffer($pdf_datei);
$len = strlen($buf);
Die ohnehin mächtige
Skriptsprache PHP liefert
mit der PDFlib ein reizvolles Feature, um WebInhalte dynamisch zu präsentieren.
Unschön ist allerdings,
dass im Umfeld der Komponenten, die alle der
GNU Public Licence unterliegen, die PDFlib mit
ihren 500 US $ pro Server-CPU in einigen Fällen
recht teuer werden kann.
Zwar lassen sich im Internet auch einige andere, freie Lösungen für diesen Bereich finden, jedoch sind diese sowohl
in der Installation, als
auch in der Anwendung
bei weitem nicht so komfortabel wie die PDFlib.
// Datei verschicken (Variante "Direkte Anzeige")
header("Content-type: application/pdf");
header("Content-Length: $len");
print $buf;
?>
Abb. 2: Das vollständige Beispielskript zu diesem Artikel.
24
Matthias Jung
([email protected]).
Ausgabe 1/2002
• ORDIX NEWS •
AKTUELL
Besuchen Sie die
ORDIX AG auf der
CeBIT 2002!
ORDIX präsentiert sich mit zwei starken Partnerschaften auf der CeBIT vom 13.-20.03.2002.
Am 13. März 2002 startet wieder
die größte Messe für Automation,
Informationstechnologie und Telekommunikation. Die CeBIT ist Anziehungspunkt für die gesamte
Branche: Mit mehr als 830.000
Gästen aus über 100 Ländern und
über 85 Prozent Fachbesuchern
verzeichnete die CeBIT 2001 einen
absoluten Besucherrekord.
Die Ausstellungsfläche auf dem
Messegelände in Hannover wurde
noch einmal vergrößert und das
Programm neu strukturiert. Nun
kann es losgehen auf den rund
432.000 Quadratmetern. ORDIX
präsentiert sich seinen Kunden
gleich im Doppelpack:
Migration und Datenbank-Performance in Halle 4, Stand A 58
Die strategischen Optionen für Informix Anwender bei Migrationen
auf Oracle möchten wir Ihnen auf
dem Oracle-Partnerstand der DOAG
vorstellen. Für Migrationsprojekte
bieten wir kompetente Beratung
von der Machbarkeitsanalyse über
Konzeption und Realisierung bis
hin zur Einführung. Für Anwender
von Oracle Datenbanken halten wir
Performance-Analysen und TuningMaßnahmen parat. Daneben stellt
die Überwachung von Datenbanken
ein zentrales Themengebiet dar,
das wir Ihnen gerne auf unserer
Informationsinsel am DOAG Stand
in Halle 4 präsentieren möchten.
Ausgabe 1/2002
Business Management in Halle 3, Stand C 45
Das Schwerpunktthema am Partnerstand der Firma BMC Software lautet in diesem Jahr „Business
Management“. Auf dem Stand in Halle 3 werden Lösungen und Produkte der Themenbereiche Enterprise System Management und Enterprise Data Management sowie SAP-Management, Storage- und
Security-Management gezeigt. Gemeinsam mit den
verschiedenen Partner-Unternehmen werden u. a.
die folgenden Lösungen demonstriert: PATROL allgemein, INCONTROL, DashBoard, Visualis, ACSM,
Mainframe Database Tools, Service Level Management sowie der PATROL Enterprise Manager.
Ihre Anmeldung
Bitte vereinbaren Sie im Vorfeld einen Termin, denn wir nehmen uns
gerne genügend Zeit für Sie!
Senden Sie Ihren Terminwunsch unter
Angabe der Stand-Nummer
per Post an:
ORDIX AG, Westernmauer 12-16, 33098 Paderborn
per E-Mail an: [email protected] oder
per Fax an:
0 52 51/10 63-99.
Sie erreichen uns stets auch über www.ordix.de.
Auf der ORDIX Insel möchten unsere Mitarbeiter Ihnen Hilfestellungen im System Management vorstellen. Neben PATROL for SAP R/3, PATROL DashBoard (Netzwerkmanagement), PATROL für Oracle,
UNIX und Windows zeigen wir Ihnen auch Ihre Möglichkeiten im Bereich Service Reporting/Service Level
Management auf. Und vielleicht ist auch schon ein
Blick auf die neue PATROL 7 Architektur möglich.
Wir freuen uns auf Ihren Besuch!
25
• ORDIX NEWS •
SYSTEM MANAGEMENT
Service Reporting:
Selbstdarstellung der
IT-Abteilung
In den Ausgaben 4/2000 und 2/2001 der ORDIX News wurden der Aufbau und die
Neuentwicklungen in der Version 1.1.20 beschrieben. Nachdem wir Service
Reporting in einigen Projekten eingesetzt haben, werden hier die Einsatzmöglichkeiten und Voraussetzungen beschrieben.
„Probleme erkennen und beheben, bevor der Benutzer anruft.“ Dieses Ziel verfolgt ORDIX durch den Einsatz von PATROL-Produkten. Als Dienstleister innerhalb einer Firma verbessern IT-Abteilungen durch den
Einsatz des PATROL Service Reporting die Qualität ihres Angebotes an die anderen Abteilungen: Das
hektische Reagieren auf Ausfälle wird zur Ausnahme. Service Reporting bietet den EDV-Verantwortlichen die Möglichkeit, diese Qualität intern zu analysieren und nach außen zu dokumentieren.
Dokumentation der Leistung
Zunächst sammelt der PATROL Agent Informationen über alle Komponenten - also Rechner, Vernetzung, Betriebssysteme und Applikationen. Service
Reporting stellt dann alle diese Informationen in automatisch erstellten Berichten übersichtlich, aussagekräftig und für die Adressaten leicht zugänglich dar. Die Berichte können gespeichert, ausge-
Abb. 1: Service Reporting auf einem Web-Server.
26
druckt oder über einen Web-Server zur Verfügung gestellt werden.
Gezielte Adressierung
Ein gestuftes Zugriffskonzept für diesen Web-Server erlaubt den jeweils
Verantwortlichen den Zugriff auf die
für sie relevanten Berichte. Bei
Nachfragen zu bestimmten Systemauslastungen müssen die wichtigen Parameter nicht erst gesammelt und in Berichtform zusammengefasst werden, sondern stehen
bereits für einen frei zu wählenden
Zeitraum zur Verfügung.
Grundlage für Ressourcenplanung
Die Berichte des Service Reporting
erlauben eine qualifizierte Diskussion der vorhandenen und eventuell
zusätzlich einzusetzenden Ressourcen: Die Daten der durchschnittlichen und der höchsten Auslastung
wichtiger Komponenten steht den
Verantwortlichen jederzeit zur Verfügung. Auf dieser Basis kann die
Bewertung der vorhandenen Ressourcen und eine begründete Prognose des zukünftigen Bedarfs erfolgen. Zudem lassen sich langfristige Entwicklungen, die auch die
Zusammenarbeit verschiedener
Komponenten und daraus entstehende Wechselwirkungen umfassen können, in einer überschaubaren Form darstellen.
Ausgabe 1/2002
SYSTEM MANAGEMENT
“All inclusive”
Service Reporting gehört zum Lieferumfang des PATROL-Basisproduktes, es fallen keine weiteren
Lizenzgebühren an. Das umfasst
die datensammelnden Komponenten von BMC, eine Oracle-Datenbank und die Reporting-Komponenten der Firma ACTUATE. Wenn
Service Reporting implementiert
wurde, stehen mit den QuickReports sofort lauffähige Berichte für
wichtige Standardapplikationen wie etwa für Oracle-Datenbanken,
SAP R/3, Exchange, sowie für die
Betriebssysteme UNIX und NT - zur
Verfügung. Diese Berichte können
für die Rechner, auf denen PATROL
Agenten und die entsprechenden
Knowledge Module installiert sind,
direkt abgerufen werden. Weitergehende Berichte können mit Hilfe
von Templates über die gesammelten Daten erstellt werden.
• ORDIX NEWS •
Windows-Welt beheimatet. Deshalb sind viele der
Administrationswerkzeuge, die ACTUATE für das
Service Reporting zur Verfügung stellt, nur unter
Windows verfügbar. Wer mit einer reinen Sun-Lösung arbeiten möchte, verfügt nicht über die komfortablen Möglichkeiten zur Administration, die eine
NT- oder gemischte Lösung bieten.
Abb. 2: Webgestützter Bericht.
Wer darüber hinaus komplexere
Berichte erstellen will, benötigt das
Reporting Studio von ACTUATE.
Diese Komponente muss jedoch
gesondert lizensiert werden, stellt
dafür aber sämtliche Möglichkeiten
professioneller Berichterstellung
zur Verfügung (vergleichende Berichte verschiedenster Parameter,
druckreife Berichte mit einer Vielzahl eingebundener Einzelberichte
etc.).
Erweiterbarkeit
Da Service Reporting mit einer Oracle-Datenbank
arbeitet, können auch Daten von Applikationen in
die Datenbank eingefügt werden, die von den vorgefertigten QuickReports nicht abgedeckt werden. Die
Daten können über die von BMC angebotenen oder
über eigenentwickelte Knowledge Module in den
DataStore eingefügt werden. Es besteht für heterogene Umgebungen die Möglichkeit, Systemmanagement-Daten aus den Produkten anderer Anbieter
ins Service Reporting zu integrieren.
Voraussetzungen
Fazit
Die Daten für die Berichte können
von allen Rechnertypen bezogen
werden, auf denen ein PATROL
Agent lauffähig ist. Service Reporting selbst läuft gegenwärtig auf
NT4 und Win2000 sowie Sun Solaris – auf Solaris allerdings mit Einschränkungen.
Werkzeuge zur Berichterstellung,
wie eben ACTUATE, sind wegen
ihrer grafischen Ausrichtung in der
Ausgabe 1/2002
Mit PATROL bietet ORDIX den IT-Abteilungen Werkzeuge, die Qualität und Verfügbarkeit ihres Angebotes ständig zu verbessern. Service Reporting generiert die dabei erhobenen Daten zu Berichten und
stellt sie den Verantwortlichen gezielt zur Verfügung.
Mit den vorgefertigten Lösungen deckt Service
Reporting Standardumgebungen ohne weitere Anpassungen ab, für besondere Anforderungen bietet
es vielfältige Erweiterungsmöglichkeiten.
Uwe Rübesamen ([email protected]).
27
• ORDIX NEWS •
SYSTEME & NETZE
Management von
Mailinglisten mit Majordomo
Das Problem
Wie oft kommt es vor, dass man E-Mails an mehrere interessierte Personen gleichzeitig versenden möchte? Wenn man jeden Adressaten einzeln aus seinem Adressbuch als Empfänger eintragen will, kann das sehr aufwendig sein. Aus diesem
Grund empfiehlt sich das Anlegen von Mailinglisten. Diese Listen sind über eine
E-Mail Adresse (Bsp.: [email protected]) zu erreichen und als ein Verteiler
anzusehen, über den E-Mails an alle Mitglieder der Liste weitergeleitet werden.
Wie können aber solche Listen administriert werden, ohne dass ein Administrator die Benutzer fortlaufend in die Liste hinzufügen und herausnehmen muss?
Sinnvoll wäre es, wenn sich die potentiellen Mitglieder einer Liste automatisch
in diese eintragen oder austragen können.
Die Lösung
Majordomo ist ein System, mit dem man solche
Mailinglisten verwalten kann. Die Benutzer können
sich damit per E-Mail bei Mailinglisten an- und abmelden bzw. Informationen zu vorhandenen Listen
bekommen. Jede Liste ist einem Administrator zugeordnet, der die Listenkonfiguration übernimmt und
„nach dem Rechten“ sieht. Die Listen selbst werden von einem Serveradministrator angelegt bzw.
gelöscht.
Wie man eine Liste anlegt, zeigen
wir in Abb.1.
Die Benutzung
Alle Aktionen werden per E-Mail an
die Hauptadresse des Majordomo
([email protected]) gesteuert. Das auszuführende Kommando
wird in das Textfeld der E-Mail geschrieben. Die Betreffzeile einer EMail wird von Majordomo ignoriert.
Die Installation
Majordomo ist als RPM-Paket für Linux-Plattformen
verfügbar und einfach zu installieren. Um dem System die E-Mail-Adresse [email protected] bekannt zu machen, muss die „/etc/aliases“ wie folgt
erweitert werden:
Majordomo bietet die Möglichkeit,
Listen sehr flexibel zu konfigurieren:
Eine Liste kann offen, geschlossen
oder moderiert sein. „Offen“ bedeutet, dass es keine Beschränkung
gibt, wer E-Mails an die Mailingmajordomo:
"|/usr/lib/majordomo/wrapper majordomo"
liste senden darf bzw. wessen Emajordomo-owner: owner-majordomo
Mails von der Liste berücksichtigt
owner-majordomo: <E-Mail des Majordomo-Admins>
werden. Ist eine Liste „geschlossen“, können nur Listenmitglieder Beiträge
liste:
"|/usr/lib/majordomo/wrapper resend -l liste liste-out"
schreiben und „modeliste-out:
:include:/var/lib/majordomo/lists/liste, liste-archiv
riert“ bedeutet, dass alle
liste-request: "|/usr/lib/majordomo/wrapper majordomo -l liste"
Beiträge erst an einen
liste-approval: owner-liste
liste-owner:
owner-liste
Moderator (oft ist es der
owner-liste:
<E-Mail des Listenadmins>
Administrator der Liste
"|/usr/lib/majordomo/wrapper archive2.pl -f liste -a
liste-archiv:
selbst) gesendet wer/var/lib/majordomo/lists/liste.archiv"
den und dieser die Beiträge freigibt.
Abb. 1: Anlegen einer Liste.
28
Ausgabe 1/2002
• ORDIX NEWS •
SYSTEME & NETZE
Beispielkommandos:
help:
lists:
subscribe listenname:
unsubscribe listenname:
which:
who listenname:
Hilfe über Kommandos
Anzeige der verfügbaren Listen
Anmelden bei einer Liste
Abmelden bei einer Liste
zeigt alle Listen an, bei denen man angemeldet ist
zeigt alle E-Mail-Adressen, die an listenname angemeldet sind
Auch einige Befehle (wie z. B.
which oder who) können generell
gesperrt, nur für Listenmitglieder
freigegeben, oder von jedem benutzt werden.
Damit Nichts verloren geht
Eine weitere interessante Funktion von Majordomo ist die Archivierung. Alle Beiträge zu einer Liste können in einem zugehörigen
Listenarchiv gesammelt werden.
Mit dem Befehl „index <listenname>“ kann man eine Übersicht
der Dateien bekommen, die zu einer Liste verfügbar sind. Mit dem
Befehl „get <listenname> <dateiname>“ kann man sich diese Dateien per Mail zuschicken lassen.
Abb. 2: Anmelden an eine Liste mit einer MajordomoStandard-Konfiguration.
Fazit
Majordomo ist ein freies und offenes Produkt. Die Perl-Quellen können an die eigenen Bedürfnisse angepasst werden. Einmal installiert
und konfiguriert, ist es kaum notwendig, Majordomo zu warten bzw.
zu administrieren. Dies ist sicherlich einer der Gründe für die große
Akzeptanz von Majordomo im Internet-Umfeld. Was gibt es schöneres für einen Systemadministrator, als wenn er sich nicht mehr um
tägliches Aktualisieren von Verteiler-Listen kümmern muss? Stattdessen kann er es den Listenmitgliedern persönlich überlassen,
sich komfortabel von Verteiler-Listen ein- oder auszuschließen.
Lars Hendrik Korte ([email protected]).
Ausgabe 1/2002
Abb. 3: Beispiel-E-Mail zum Steuern einer Liste.
29
• ORDIX NEWS •
SYSTEME & DATENBANKEN
Oracle Packages Teil VII:
Debugging von PL/SQL mit
DBMS_DEBUG
Bisher wurde das Debuggen von PL/SQL-Programmen wie z. B. anonymen Blöcken, Stored Procedures und Triggern häufig mit Hilfe des Package
DBMS_OUTPUT durchgeführt. Hierzu muss von dem Entwickler an gewünschten
Positionen im Programm-Code die Ausgabe von Variablen hinterlegt werden.
Dies ist bei der Fehlersuche oft umständlich und unflexibel. In diesem Artikel
wird das Package DBMS_DEBUG vorgestellt, welches für das Debugging eine
bessere Funktionalität verspricht.
Vorteile:
•
Flexibles Debuggen durch Setzen von Breakpoints, Anzeigen von Variablenwerten.
•
Source-Code muss zum Debuggen nicht verändert werden.
Nachteil:
•
Relativ aufwändig für kleine, überschaubare Programm-Teile (Hier greift man u. U. doch besser
wieder auf DBMS_OUTPUT zurück).
DBMS_DEBUG ist ein PL/SQL API zur PL/SQL Debugging Layer (Probe) im Oracle Server. Das
Package kann allerdings nur serverseitig genutzt
werden. Grundsätzlich sind zwei Sessions für das
Debuggen notwendig. In der sogenannten TargetSession werden die Debug-Informationen durch ein
PL/SQL-Programm erzeugt, während die DebugSession die Steuerung der Target-Session übernimmt.
Innerhalb einer Session kann ein Schalter gesetzt
werden, um den DEBUG-Modus ein- bzw. auszuschalten.
ALTER SESSION SET PLSQL_DEBUG = true;
Bestehender Programmcode kann
mit der Option DEBUG erneut kompiliert werden. Dazu dienen die Befehle:
ALTER [PROCEDURE | FUNCTION
| PACKAGE | TRIGGER | TYPE]
<name> COMPILE DEBUG;
ALTER [PACKAGE | TYPE]
<name> COMPILE DEBUG BODY;
Die Funktionsweise dieses Packages wollen wir anhand eines Beispiels vorstellen. Dazu legen wir
die in Abb. 1 gezeigte Beispiel-Prozedur an.
Anschließend wird der DEBUGModus eingeschaltet:
ALTER PROCEDURE upd_gehalt
COMPILE DEBUG;
Ab jetzt arbeiten wir mit zwei verschiedenen Sessions:
CREATE OR REPLACE PROCEDURE upd_gehalt IS
BEGIN
UPDATE mitarbeiter
SET GEHALT= NVL(GEHALT, 0) * 1.20
WHERE abteilungsnr in (SELECT abteilungsnr FROM abteilung WHERE
abteilungsname LIKE ‘%ORACLE%‘);
DBMS_OUTPUT.PUT_LINE(‘Rows: ‘||SQL%ROWCOUNT);
END;
/
Abb. 1: Source-Code zum Anlegen der Beispiel-Prozedur.
30
Ausgabe 1/2002
SYSTEME & DATENBANKEN
• ORDIX NEWS •
1. Die Target Session:
Die möglichen Aktionen der Target-Session sind in Abb. 2 verdeutlicht.
Für unser Beispiel initialisieren wir
zuerst die Session für das Debugging und generieren die eindeutige ID. Anschließend starten wir
das Debugging.
Abb. 2: Mögliche Aktionen der Target-Session.
SQL>VARIABLE x VARCHAR2(40)
SQL>EXECUTE :x := DBMS_DEBUG.INITIALIZE()
SQL>PRINT x
X
—————————————————————————————————————————
000F10D50001
SQL> EXECUTE DBMS_DEBUG.DEBUG_ON
SQL> EXECUTE upd_gehalt;
Die Target-Session wartet nun auf Aktion
von der Debug-Session.
2. Die Debug-Session:
Der Debug-Session wird die ID der eben
initialisierten Target-Session mitgeteilt.
SQL>SET SERVEROUTPUT ON
SQL>EXECUTE DBMS_DEBUG.ATTACH_SESSION(‘000F10D50001‘);
Welche weiteren Aktionen von der DebugSession möglich sind, verdeutlicht Abb. 3.
In unserem Beispiel wird nun auf Zeile 3
der Prozedur ein Breakpoint gesetzt. Ein
Breakpoint kann nur auf ein ausführbares Statement gesetzt werden (Abb. 4).
DECLARE
V_info
DBMS_DEBUG.PROGRAM_INFO;
V_ret
BINARY_INTEGER;
V_bnum
BINARY_INTEGER;
BEGIN
V_info.namespace :=
DBMS_DEBUG.NAMESPACE_PKGSPEC_OR_TOPLEVEL;
V_info.name := ‘UPD_GEHALT’;
V_info.owner := ‘BK’;
V_info.dblink := null;
V_info.line# := 3;
V_ret := DBMS_DEBUG.SET_BREAKPOINT(v_info,3,v_bnum);
IF v_ret != DBMS_DEBUG.SUCCESS
THEN DBMS_OUTPUT.PUT_LINE(‘Kann keinen Break
point setzen’);
END IF;
END;
/
Abb. 3: Mögliche Aktionen der Debug-Session.
Ausgabe 1/2002
Abb. 4: Setzen eines Breakpoints auf Zeile 3.
31
• ORDIX NEWS •
SYSTEME & DATENBANKEN
Nachdem der Breakpoint gesetzt ist, soll das Programm bis dorthin ausgeführt werden.
An dieser Stelle sollen Informationen über Stack-Tiefe und Zeilenanzahl ausgegeben werden.
DECLARE
v_info
DBMS_DEBUG.RUNTIME_INFO;
v_ret
BINARY_INTEGER;
v_source
VARCHAR2( 4 0 0 0 ) ;
-- V_mask enthaelt die Informationen, die gesammelt werden sollen
v_mask
PLS_INTEGER := DBMS_DEBUG.INFO_GETSTACKDEPTH +
dbms_debug.info_getbreakpoint +
dbms_debug.info_getlineinfo +
DBMS_DEBUG.INFO_GETOERINFO;
-- nach dem Breakpoint zum nächsten ausfuehrbaren Statement springen
breakflags PLS_INTEGER := DBMS_DEBUG.BREAK_NEXT_LINE;
BEGIN
-- Synchronisation
v_ret := DBMS_DEBUG.SYNCHRONIZE (v_info,0);
IF v_ret != DBMS_DEBUG.SUCCESS THEN
DBMS_OUTPUT.PUT_LINE(‘Synchronize fehlgeschlagen’);
END IF;
-- auf zum Breakpoint
v_ret := DBMS_DEBUG.CONTINUE(v_info,0,v_mask);
IF v_ret != DBMS_DEBUG.SUCCESS THEN
DBMS_OUTPUT.PUT_LINE(‘Continue fehlgeschlagen’);
END IF ;
-- in welcher Zeile befindet man sich?
-- Welcher Breakpoint? Welche Stack-Tiefe? Welches Programm?
DBMS_OUTPUT.PUT_LINE(‘aktuelle Zeile ‘||v_info.line#);
IF v_info.terminated = 1 THEN
DBMS_OUTPUT.PUT_LINE(‘Program ist terminiert’);
END IF ;
DBMS_OUTPUT.PUT_LINE(‘Breakpoint # ist ‘||v_info.breakpoint);
DBMS_OUTPUT.PUT_LINE(‘Stack-Tiefe ist ‘||v_info.stackdepth);
IF v_info.reason != 3
THEN DBMS_OUTPUT.PUT_LINE (‘Programm wartet (kein Breakpoint)’);
END IF;
DBMS_OUTPUT.PUT_LINE(‘Programm-Name ist ‘||v_info.program.name);
-- Wie sieht der Source-Code für diese Zeile aus?
SELECT text INTO v_source FROM all_source
WHERE
owner = v_info.program.owner
AND
name
= v_info.program.name
AND
line
= v_info.line#;
DBMS_OUTPUT.PUT_LINE(‘Quellcode ist ‘||chr(10)||v_source);
IF v_info.oer != 0
THEN DBMS_OUTPUT.PUT_LINE (‘Exception ist ‘|| SQLERRM (v_info.oer));
END IF;
-- gehe weiter
v_ret := DBMS_DEBUG.CONTINUE(v_info,breakflags,v_mask);
IF v_ret != DBMS_DEBUG.SUCCESS
THEN DBMS_OUTPUT.PUT_LINE( ‘Continue fehlgeschlagen’);
END IF;
DBMS_OUTPUT.PUT_LINE(‘aktuelle Zeile’||v_info.line#);
SELECT text INTO v_source FROM all_source
WHERE
owner = v_info.program.owner
AND
name
= v_info.program.name
AND
line
= v_info.line#;
DBMS_OUTPUT.PUT_LINE(‘ Quellcode ist ‘||chr(10)||v_source);
-- Gehe bis zum Ende des Programms
v_ret := DBMS_DEBUG.CONTINUE(v_info,0,0);
IF v_ret != DBMS_DEBUG.SUCCESS
THEN DBMS_OUTPUT.PUT_LINE( ‘Continue fehlgeschlagen’);
END IF;
end;
/
Abb. 5: Quellcode zur Ausgabe der Debugging Information.
32
Ausgabe 1/2002
SYSTEME & DATENBANKEN
• ORDIX NEWS •
Es wird die folgende Ausgabe in der Debug-Session erzeugt:
Line is 3
Breakpoint # ist 1
Stack-Tiefe ist 2
Programm-Name ist UPD_GEHALT
Quellcode ist UPDATE mitarbeiter
aktuelle Zeile 7
Quellcode ist DBMS_OUTPUT.PUT_LINE(‘Rows: ‘||SQL%ROWCOUNT);
Das Debuggen wird nun beendet mit:
Target-Session:
SQL>EXEC DBMS_DEBUG.DEBUG_OFF
Debug-Session:
SQL>EXEC DBMS_DEBUG.DETACH_SESSION
Weitere Funktionen und Prozeduren des Packages:
PROBE_VERSION
SELF_CHECK
SET_TIMEOUT
INITIALIZE
DEBUG_ON
DEBUG_OFF
ATTACH_SESSION
SYNCHRONIZE
SHOW_SOURCE
PRINT_BACKTRACE
CONTINUE
SET_BREAKPOINT
DELETE_BREAKPOINT
DISABLE_BREAKPOINT
ENABLE_BREAKPOINT
SHOW_BREAKPOINTS
GET_VALUE
SET_VALUE
DETACH_SESSION
GET_RUNTIME_INFO
GET_INDEXES
EXECUTE
TARGET_PROGRAM_RUNNING
SET_TIMEOUT_BEHAVIOUR
PRINT_INSTANTIATIONS
Versions-Nummer von DBMS_DEBUG
Interner Konsistenz-Check
Setzen eines Timeouts
Initialisiert die Target-Session
DEBUG wird eingeschaltet
DEBUG wird ausgeschaltet
Die Debug-Session bekommt die ID der Target-Session mitgeteilt
Wartet auf den Programm-Start
Gibt Programm-Code aus
Ausgabe des Speichers
Das laufende Programm wird fortgesetzt
Setzt einen Breakpoint in einem Programm
Löscht einen Breakpoint
Deaktiviert einen Breakpoint
Aktiviert einen Breakpoint
Listet die Breakpoints auf
Ein Wert wird aufgegeben
Ein Wert innerhalb des laufenden Programms wird gesetzt
Das Debuggen der Target-Session wird beendet
Informationen zu dem aktuellen Programm werden zurückgegeben
Gibt zu einer indizierten Tabelle die Menge der Indizes zurück
Ausführen einer Prozedur in der Target-Session
Läuft das zu überwachende Programm?
Wie ist im Falle eines Timeouts zu reagieren
Die Liste der benutzten Packages in der Session
Fazit
Der Einsatz des Package DBMS_DEBUG lohnt sich bei Programmen, die mehr als
einen Dreizeiler beinhalten. Durch den Einsatz von aufgesetzten Funktionen und
Prozeduren lässt sich der Aufwand für das einzelne zu untersuchende Programm
sicherlich minimieren.
Beate Künneke ([email protected])
Ausgabe 1/2002
33
• ORDIX NEWS •
SYSTEME & NETZE
SAN-Technik
Gründe, die für Storage Area Networks (SANs) sprechen, wurden schon an mehreren Stellen dargestellt. Mögliche Konzepte zur Konsolidierung oder Flexibilisierung von Plattensystemen findet man viele. Grosse Distanzen und Skalierbarkeit werden angepriesen. Leider wird in den Prospekten und Konzepten vieler
Hersteller mit Begriffen aus der „neuen Welt“ jongliert, als wären sie jedermann
vertraut. In diesem Artikel werden die Begriffe rund um SAN definiert. Für Neueinsteiger oder Kollegen, die nie die Grundlagen aufarbeiten durften, wird hier
in wenigen Seiten die grundlegende Technik „Fibre Channel“ dargestellt.
SAN versus NAS
Spitzfindige Strategen haben passend zum SAN den
Begriff NAS in die Diskussion hineingeworfen. Sie
verbinden damit Network Attached Storage und bieten dieses als kostengünstige Alternative zu SAN
an. Nun wird definiert, was SAN bzw. NAS wirklich
bedeutet.
NAS ist ein neuer Begriff für alte Technik. Plattenplatz wird in dedizierten Servern mit einem Standard
Betriebssystem eingebaut und mittels NFS und oder
SMB anderen Systemen zur Verfügung gestellt. Die
Server werden als Filer bezeichnet.
Glossar
Network File System (NFS):
Von Sun entwickeltes Protokoll zum lokalen Einhängen von
entfernten Filesystemen. Typischerweise unter UNIX verwendet.
SMB:
Protokoll, welches auf dem LAN-Manager von IBM/MS beruht. Dient zum Nutzen entfernter Freigaben. Typischerweise
von allen Windows Systemen verwendet. Kann mittels Samba
oder ASX auch auf UNIX-Systemen eingerichtet werden.
Fibre Channel (FC):
Standardisierte Netzwerktechnik, mit folgenden Eigenschaften:
• Datendurchsatz von bis über 2 GigaBits/s
• Entfernungen bis zu zehn Kilometer werden ohne Einbruch der Bandbreite unterstützt.
• IP, SCSI, IPI, HIPPI-FP, audio/video können auf FC aufsetzen.
Physical Address (PA):
Adresse in einer Arbitrated Loop (max. 127 möglich)
Arbitrated Loop (AC):
Fibre Channel Ring ähnlich eines Token Ring
Switched Fabric (SF):
Fibre Channel Netzwerk meist aus mehreren Switches redundant aufgebaut. Das gesamte Netz wird als Fabric bezeichnet. Viele der Eigenschaften des Fabric werden durch
die Switches realisiert.
Direct Attached Storage (DAS):
Ein Speichergerät ist direkt in einem Rechner eingebaut oder
mit ihm verbunden.
34
Häufig ermöglicht eine BedienerOberfläche über das normale Netzwerk die Konfiguration der Freigaben. Um den notwendigen Durchsatz zu erreichen, kann GigaBit
Ethernet als Netzwerktechnik zum
Einsatz kommen.
SAN beschreibt die Entkopplung
von Rechner und Speichermedium.
Zwischen beiden wird ein Netzwerk
aufgebaut, welches mit LAN- oder
WAN -Technik nicht verwechselt werden darf. Entscheidend ist, dass es
sich bei den Speichersystemen
nach wie vor um Block-Devices
handelt. Diese werden vom Server
nicht anders angesprochen als lokale Platten.
Nach heutigem Stand wird Fibre
Channel zur Verbindung der Geräte eingesetzt. In einem SAN sind
normalerweise sowohl mehrere
Rechner als auch verschiedene
Speichersysteme vorhanden.
Fibre Channel im Detail
Die Entwicklung von Fibre Channel
(FC) begann 1988. Seit 1994 ist
FC durch ANSI standardisiert. Es
verfügt über die nötige „Marktreife“
und die Leistungsbeschreibung ist
vielversprechend.
Andere Technologien (wie z. B.
Serial Storage Architecture) sind
entweder langsamer oder noch
nicht so ausgereift. Da FC als „best
practice” im SAN-Umfeld anzuse-
Ausgabe 1/2002
• ORDIX NEWS •
SYSTEME & NETZE
den automatisch berücksichtigt.
Viele Routing-Algorithmen sind in
Software realisiert, was prinzipiell
bremsend wirkt.
Fibre Channel wartet mit einem eigenen Schichtenmodell auf, welches in Schicht 4 definiert, wie Upper Layer Protokolle eingebunden
werden. Als solche können sowohl
Bus-Protokolle (z. B. SCSI) als
auch Netzwerkprotokolle (z. B. IP)
eingesetzt werden.
Abb. 1: Technologievergleich.
hen ist (siehe Abb. 1), soll dies genauer untersucht werden.
Fibre Channel verbindet die Vorteile
eines Bus-Systems (Channel) mit
den Vorteilen eines Netzwerkes.
Bus-Systeme (z. B. SCSI, PCI) haben meist wenige, definierte Endgeräte. Sie sind in sich abgeschlossen, wohlstrukturiert und kommen
daher mit wenig Protokoll-Overhead
aus. Entscheidungsalgorithmen, die
Routing-Möglichkeiten auswerten,
entfallen, was prinzipiell schnellere
Kommunikation ermöglicht.
Netzwerke sind unstrukturiert und
unvorhersehbar. Netze können eine
große Anzahl an Endgeräten bedienen. Sich verändernde Bedingungen
(z. B. Ausfall eines Routers) wer-
Kupfer
Glasfaser multimode 50/60 µm
Glasfaser single mode 9 µm
Entgegen dem Namen können
Kupfer und Glasfaser als Übertragungsmedium dienen. Es sind
Entfernungen bis zehn Kilometer
bei Übertragungsraten von 2 GBit/s
(1 GBit/s pro Richtung) möglich.
Die Spezifikation zielt auf bis zukünftig 10 GBit/s, welche jedoch
erst in mehreren Jahren erwartet
werden dürfen (siehe Abb. 2).
Fibre Channel nutzt entweder 2 Adernpaare (Kupfer)
oder zwei Glasfaser-Kabel. Dadurch ist FullduplexÜbertragung möglich. Neue Glasfaser Steckverbindungen (Galaxy-Connector) erlauben den Anschluss
beider Kabel auf kompakte Weise (ca. 6 mm x 6
mm), so dass eine höhere Anschlussdichte erreicht
werden kann.
Als Topologien kommen Punkt-zu-Punkt, Arbitrated
Loop oder Switched Fabric in Frage.
Wenn mehrere Geräte zu unabhängigen Punkt-zuPunkt Verbindungen geschaltet werden sollen, kann
ein Static Switch genutzt werden. Über ein externes Interface werden verschiedene Punkt-zu-Punkt
Verbindungen konfiguriert.
Arbitrated Loop wird durch einen Hub hergestellt,
der ähnlich eines Ringleitungsverteilers (Token Ring)
einen Ring zwischen allen angeschlossenen Geräten schaltet. Maximal sind 127 Geräte in einem Ring
max. Entfernung
47 m
2 km
10 km
max. Geschwindigkeit (pro Richtung)
100 Mbit/s
1 GBit/s nur bis ca.100 m
1 GBit/s
Abb. 2: Medienarten.
Ausgabe 1/2002
35
• ORDIX NEWS •
zu betreiben. Arbitrated Loop kann auch als direkter
Ersatz zu SCSI-Bussen gesehen werden und kann
z. B. in einer Backplane Festplatten hotplug-fähig
anschließen. Arbitrated Loop benötigt eine Initialisierung.
Switched Fabric wird durch einen Fibre Channel
Switch erreicht. Diese Switches sind hochperformant und schalten mit geringer Latenzzeit. Sie sind
konfigurierbar. Durch „Fabric Zoning“ wird schon
auf SAN-Ebene eine grobe Zugriffssteuerung erreicht.
SYSTEME & NETZE
den. Hubs haben keinen eigenen
Port, sondern dienen nur dem Aufbau einer Arbitrated Loop.
Je nach Gerät können die Ports nur
in einer Arbitrated Loop betrieben
werden, nur an einem Switch angeschlossen werden, nur zur Verbindung zweier Switches eingesetzt werden oder mehrere dieser
Eigenschaften wahrnehmen.
In einer Arbitrated Loop werden 1
Byte große „Physical Addresses“
(PAs) vergeben. Die Geräte hanKommunikation innerhalb des Fibre Channel fin- deln dynamisch während der Initiadet immer zwischen Ports statt. Es wird generell lisierung der Arbitrated Loop ihre PA
zwischen den Ports eines Endgerätes (z. B. Fest- aus. Während des Betriebs könplatte, Rechner), sogenannten Node-Ports und nen Geräte hinzugefügt oder entdem Port eines Switches „Fabric-Port“ unterschie- fernt werden, sofern gewährleistet
wird, dass der physikalische Ring
Class
Eigenschaft
nicht unterbrochen
Class 1
Zwischen zwei Node-Ports wird eine Verbindung fest aufgebaut. Die
ist.
dedicated service
Kommunikation ist leitungsorientiert. Es steht die gesamte
In einem Fabric
Bandbreite zur Verfügung, so dass über diese Ports keine andere
Kommunikation stattfinden kann. Über die gesamte Distanz wird die werden 3 Byte grogleiche Übertragungsgeschwindigkeit genutzt. Es wird nichts
ße ID’s vergeben.
Die 16 größten IDs
gepuffert. Die Reihenfolge von Frames bleibt erhalten. Diese
(hexFFFFF0 bis
Konfiguration ist für Voice- oder Video-Anwendungen zweckhaft.
hexFFFFFF) sind
Class 2
Dieser Service ist vergleichbar mit TCP/lP. Die einzelnen Frames
multiplex service
werden unabhängig versendet und können verschiedene Wege durch fest definierte „wellknown addresses“
das Fabric zurücklegen, weshalb keine Reihenfolge garantiert
und dienen der Verwerden kann. Quittungsmechanismen stellen sicher, dass keine
waltung
des
Frames verloren gehen. Einzelne Switches können die Frames
Fabric. Über eine
puffern, so dass unterschiedliche Leitungsgeschwindigkeiten
dieser wellknown
genutzt werden.
IDs meldet sich jeClass 3
Dieser Service ist vergleichbar mit UDP. Es werden keine
der Node-Port an
datagram service
Quittungsmechanismen genutzt. Ansonsten entspricht dieser
dem Fabric an.
Service dem multiplex service.
Während dieses
Class 4
Dieser Service ist leitungsorientiert und entspricht weitestgehend
Fabric-Login wird
virtual circuit
dem Class 1 Service. Es wird jedoch nur ein Teil der Bandbreite
die ID des Nodefractional bandwidth genutzt. Dies ermöglicht einerseits garantierte Zustellzeiten und
Ports festgelegt.
außerdem höhere Flexibilität, da ein Port viele dieser
Außerdem werden
Kommunikationen gleichzeitig durchführen kann.
Eigenschaften zur
Class 5
Diese Art Service ist noch nicht definiert. Es ist nicht abzusehen, ob Flusskontrolle und
just in time
dies nachgeholt wird.
mögliche ServiceClass 6
Es kann durch einen Frame eine Gruppe von Node-Ports erreicht
arten bestimmt.
multicast
werden. Die entsprechenden Node-Ports müssen zuvor in der
Bevor eine KomGruppe angemeldet sein und der Fabric muss Multicast
munikation zwiunterstützen.
schen zwei NodePorts (in der Regel
Abb. 3: Durch Fibre Channel definierte Service Classes.
Adressierung und Routing
36
Ausgabe 1/2002
• ORDIX NEWS •
SYSTEME & NETZE
durch das Fabric) stattfinden kann,
findet ein Node-Port-Login statt.
Hierbei werden die Eigenschaften
dieser speziellen Kommunikation
ausgetauscht.
Beide Arten des Login sind beständig. Sofern es keinen Grund gibt,
dieses aufzugeben, bleiben alle
Ports eingelogged, selbst wenn
keine Daten zu übertragen sind.
Arbitrated Loops sind über entsprechende Ports eines Switches auch
in ein Fabric zu integrieren. Die
Physical Addresses werden dann
auf bestimmte Art innerhalb des
Fabrics auf 3 Byte ergänzt. Eventuell kann es notwendig sein, dass
die Arbitrated Loop reinitialisiert
werden muss, damit eindeutige
Adressen sichergestellt werden.
Jeder Port hat zusätzlich noch eine
Name-ID. Diese fest vergebene 64
Bit große Kennung dient den auf
Fibre Channel aufsetzenden Protokollen zur Identifikation der Kommunikationspartner. Fibre Channel
selbst nutzt diese ID nicht.
Die Kommunikation
Fibre Channel nutzt die von IBM
entwickelte 8B/10B Umsetzung.
Diese Umsetzung überträgt für jedes Byte 10 Bit. Da physikalische
Eigenschaften der Übertragung berücksichtigt werden, wird die Anzahl an Übertragungsfehlern verringert. Zusätzlich wird durch Redundanz eine gewisse Fehlererkennung ermöglicht. Außerdem wurden Bitfolgen als Steuerzeichen definiert, die keinem 8-Bit Zeichen entsprechen.
Vier solcher 10Bit großen „Transmission Characters“ werden zu einem Transmission Word zusammengefasst. Mehrere davon ergeben einen Frame, der als eine Einheit gesendet wird.
Ausgabe 1/2002
Interessante Links:
http://www.iol.unh.edu/training/fc/fc_tutorial.html
http://www1.cern.ch/HSI/fcs/spec/overview.htm
http://www.fibrechannel.com
Jeder Frame ist mit einer Sequence-ID und einem
Sequence-Counter versehen. Dadurch kann der Empfänger die Reihenfolge und die Vollständigkeit aller Frames einer Sequence sicherstellen. Eine vollständige Kommunikation zwischen zwei Systemen
entspricht einem Exchange. Jede Sequence ist einem Exchange zugehörig. Dies wird über die Exchange-IDs sichergestellt.
Für Fibre Channel sind verschiedene Classes of Service definiert. Der Service-Type sollte entsprechend
den Notwendigkeiten der Anwendungen und den
Möglichkeiten im Fabric gewählt werden. Die Tabelle
in Abb. 3 gibt einen Überblick über die definierten
Service Classes.
LANless Backup und Serverless Backup
Nachdem die Technik nun erklärt ist, an dieser Stelle
die folgenden Überlegungen:
Da alle Speicher-Komponenten durch das SAN
miteinander verbunden sind, ist es nicht notwendig,
Daten über das LAN von einem Server zu einem
Sicherungsserver zu transportieren. Stattdessen
kann das SAN verwendet werden. Solche Lösungen werden als LANless Backup bezeichnet.
Ein Server muss normalerweise CPU- und I/O-Zeit
aufwenden, um die Daten von dem eigenen Plattenbereich zu lesen und an eine andere Stelle weiterzugeben. Gerade bei Backups kann diese Last erheblich sein und ist auf Anwendungs-Servern unerwünscht. Im SAN ist es möglich, durch entsprechende Komponenten Daten zwischen Platten-Systemen und Band-Systemen zu kopieren, ohne dass
ein Server belastet wird. Man spricht in diesem Fall
von Serverless Backup.
Die Beispiele LANless Backup und Serverless Backup lassen die Flexibilität, aber auch die Komplexität der SAN-Technik erahnen.
Markus Schreier ([email protected]).
37
• ORDIX NEWS •
JAVA
Entwurfsmuster Teil II:
Implementierung von
Entwurfsmustern
Nach der Theorie und einem erklärenden Beispiel im ersten Teil über Entwurfsmuster zeigen die folgenden Codefragmente, Strukturdiagramme und Beschreibungen, wie und wann sich Entwurfsmuster in der Praxis einsetzen lassen.
Single-Dasein
Das Singleton-Entwurfsmuster ist ein objektbasiertes
Erzeugungsmuster und gewährleistet, dass von einer
Klasse genau eine Instanz existiert und stellt eine globale Zugriffsmethode dafür bereit. Beispiele für solche
Klassen gibt es viele, oft sind es Dienstleistungsklassen wie z. B. ein Logger, Fenstermanager, Druckerspooler oder etwa ein Datenbankmanager.
Um sicherzustellen, dass es nur ein Exemplar einer
Klasse gibt, überlassen wir die Objekterzeugung und
-verwaltung der Klasse selbst. Über eine globale Zugriffsmethode können Klienten auf dieses Exemplar
zugreifen (Abb. 1).
darauf zugegriffen werden kann.
Sollte sich im Laufe des Entwicklungsprozesses herausstellen, dass
doch mehr als ein Exemplar benötigt wird, hilft das Muster dabei, die
Anzahl genau festzulegen und zu
kontrollieren (siehe Abb. 2).
Das Beobachter-Pattern
(Observer)
Dieses Verhaltensmuster ermöglicht es, dass die Änderung des
Zustands eines Objekts dazu führt,
andere Objekte zu benachrichtigen und automatisch zu aktualisieren.
Die öffentliche, statische Schnittelle
getInstance() Die zentralen Objekte in diesem
liefert die einzige Muster sind das Subjekt und die
Instanz der Klasse:
Beobachter. Ein Subjekt (ObservauniqueInstance. ble) kann mehrere abhängige BeoIst die Instanz noch bachter (Observer) besitzen, die
nicht vorhanden,
sich für den Zustand des Subjekts
interessieren. Ändern sich die DaAbb. 1: Struktur des Singleton- wird sie erzeugt. Um
sicherzustellen, dass ten des Subjekts, werden die anMusters.
nicht von außerhalb gemeldeten Beobachter darüber
ein Objekt dieser Singleton-Klasse erzeugt werden informiert.
kann, wird der Konstruktor
einfach als private deklapublic class Singleton
{
// privater Konstruktor
riert und kann somit nur inprivate Singleton()
{ ; }
nerhalb der eigenen Klasse
benutzt werden.
// einzige Instanz dieser Klasse
private static Singleton uniqueInstance =
Das Codebeispiel zeigt, wie
einfach die Umsetzung des
Singleton-Musters ist. Die
Vorteile des Musters sind
offensichtlich: Die Singleton-Klasse kapselt sein einziges Exemplar und verfügt
somit über eine strikte Kontrolle darüber, wie und wann
38
// Zugriffsmethode
public static Singleton getInstance()
if (uniqueInstance != null)
return new Singleton() ;
else
return uniqueInstance ;
}
null ;
{
}
Abb. 2: Implementierung einer Singleton-K lasse in Java.
Ausgabe 1/2002
JAVA
• ORDIX NEWS •
kreten Beobachter
(observerState )
synchronisiert (siehe
Abb. 3).
Das
Beobachtermuster
in Java
Wegen der häufigen
Verwendung, insbesondere beim Programmieren von graAbb. 3: Struktur des Beobachtermusters.
fischen BenutzungsEin gutes Beispiel für die Verwen- schnittstellen, unterstützt die Java Standard API den
dung dieses Musters ist ein Daten- Entwickler bei der Umsetzung des Beobachtermusobjekt mit mehreren grafischen Re- ters. Das Subjekt ist ein Exemplar der Bibliothekspräsentationen, z. B. eine Tabelle,
klasse java.util.Observable. Ein Beobachein Säulendiagramm und ein Kreis- ter implementiert das Interface Observer.
diagramm. Diese Darstellungsobjekte sind die Beobachter und ak- Im folgenden Beispielprogramm sehen wir, wie Obtualisieren ihre Anzeige, sobald sie servable- und Observer-Objekte miteinander komüber die Änderung der Daten vom
munizieren.
Datenobjekt informiert werden. Somit ist gewährleistet, dass die ver- Die Klasse Observable
schiedenen Anzeigen synchron
und konsistent den aktuellen Zu- Das Observable-Objekt ist eine Instanz der Klasse
stand ihres Datenobjekts darstel- Mailverteiler, an dessen Zustandsänderung (das ist
len.
der Mailempfang) die eingetragenen Mailempfänger
als Observer-Objekte interessiert sind. Es gibt verStruktur des Beobachtermusters schiedene Mailverteiler für bestimmte Themen. Einen Mailverteiler interessiert überhaupt nicht, wer
Das Subjekt kennt seine Beobach- genau seine Nachrichten empfangen möchte. Er ist
ter und bietet Schnittstellen zum
nur dafür zuständig, E-Mails zu empfangen und diese
Hinzufügen und Entfernen von Be- an die registrierten Mailempfänger weiterzuleiten.
obachtern. Die Aktualisierungsschnittstelle des Beobachters bil- Sobald der Mailverteiler eine neue E-Mail empfängt,
det die Methode update(). Ein macht er mit setChanged() auf die Änderung seikonkretes Subjekt speichert den nes Zustands aufmerksam. Dann wird mit notifyfür einen konkreten Beobachter Observers(E-Mail) eine Benachrichtigung an
relevanten Zustand und benachrich- die registrierten Observer geschickt und die E-Mail
tigt über notify() die angemel- direkt weitergeleitet.
deten Beobachter, wenn sich sein
Zustand ändert. Dazu ruft das kon- Letzteres entspricht nicht ganz dem Strukturmuster
krete Subjekt auf allen registrier- in Abb. 3, nach dem sich die Observer selbst den
ten Beobachtern deren update()- Zustand vom Subjekt holen. Der direkte DatenMethode auf. In dieser Aktualisie- transfer über notifyObservers(Object) ist jerungsmethode holt sich der kon- doch eine gängige und praktische Variante des
krete Beobachter den Zustand des Datenaustauschs.
konkreten Subjekts.
setChanged() setzt intern ein Flag, welches von
Somit sind die Daten des konkre- notifyObservers(Object) abgefragt wird.
ten Subjekts (subjectState ) Nach dem Aufruf von notifyObservers(Object)
und die der angemeldeten kon- wird dieses Flag wieder gelöscht.
Ausgabe 1/2002
39
• ORDIX NEWS •
import
JAVA
java.util.Observable;
public class Mailverteiler extends
{ private String name = null ;
Observable
public Mailverteiler(String name)
{this .name = name;}
public void empfange(String eMail)
{
//Zustandsänderung
setChanged();
//Angemeldete Observer benachrichtigen
//empfangene E-Mail weiterleiten
notifyObservers(eMail);
}
public String toString()
Dies kann ebensomanuell mit
clearChanged() geschehen. notifyObservers
(Object) sendet nur dann
eine Benachrichtigung an die
Observer, wenn auch das
Flag gesetzt ist (vgl. Abb. 4).
und
Die Schnittstelle
Observer
{return name;}
Die Mailempfänger müssen
das Interface Observer imAbb. 4: Die Klasse Mailverteiler verschickt neu eintrefplementieren. Damit versifende E-Mails an alle angemeldeten Mailempfänger.
chern sie, die Methode
u p d a t e(Observable,
import java.util.* ;
Object) zu implementieren, die bei Änderungen vom Observable-Objekt automatisch aufgeclass Mailempfaenger implements Observer {
rufen wird. Das Interface Observer besteht nur
private String eMailAdress = null ;
aus dieser einen Methode. Der zweite Paramepublic Mailempfaenger(String eMailAdress) {
ter ist eine Object-Instanz, in unserem Beispiel
this.eMailAdress = eMailAdress;
(Abb. 5) die E-Mail, die mit Hilfe des Befehls
}
notifyObservers(E-Mail) verschickt wurde.
}
/ / Implementierung der update()-Methode
/ / des Interface Observer.
public void update(Observable o, Object obj) {
System.out.println(eMailAdress+ “ empfängt
die E-Mail \““+obj+“\“ von \““+o+“\““ ) ;
}
public static void main(String args[])
{
//Erzeugen von Mailverteilern(Observable)
// und Mailempfaengern(Observer) ;
Mailverteiler java =
new Mailverteiler( „[email protected]“ ) ;
Mailverteiler oracle =
new Mailverteiler(„[email protected]“) ;
Mailempfaenger hansi =
new Mailempfaenger( „[email protected]“ ) ;
Mailempfaenger klaus =
new Mailempfaenger( „[email protected]“ ) ;
Mailempfaenger karin =
new Mailempfaenger( „[email protected]“ ) ;
//Anmelden der Observer beim Observable
java.addObserver(hansi);
java.addObserver(karin);
oracle.addObserver(klaus);
//Zustandsänderung der Observable
java.empfange(„Sun veröffentlicht Release
Candidate des JDK 1.4“) ;
oracle.empfange( „Oracle 9i integriert
JDeveloper 5.0“) ;
//Abmelden eines Observer vom Observable
java.deleteObserver(hansi);
java.empfange(„Sun veröff entlicht Java Web
Services Developer Pack“) ;
}
}
Abb. 5: Die Klasse Mailempfaenger implementiert das O b s e r v e r-Interface
durch update(Observable,Object).
40
[email protected] empfängt die E-Mail
“Sun veröffentlicht Release
Candidate des JDK 1.4“ von
“[email protected][email protected] empfängt die E-Mail
“Sun veröffentlicht Release
Candidate des JDK 1.4“ von
“[email protected][email protected] empfängt die E-Mail
“Oracle 9i integriert JDeveloper
5.0“ von “[email protected][email protected] empfängt die E-Mail
“Sun veröffentlicht Java Web
Services Developer Pack“ von
“[email protected]“
Abb. 6: Programmausgabe nach der Ausführung
der M a i l e m p f a e n g e r . c l a s s .
Fazit
Natürlich braucht es einige Zeit, bis man Muster
kennt und sie einsetzen kann, aber das einmal
erworbene Wissen lässt sich während der Entwicklung oftmals einsetzen, da die Muster ja
immer wiederkehrende Probleme und deren einfache Lösung beschreiben. Man muss nur wissen, welche Muster welche Probleme lösen und
kann dann recht schnell die Lösung in Form von
Programmcode erfolgreich umsetzen.
Ingo Vogt ([email protected]).
Ausgabe 1/2002
SYSTEME & DATENBANKEN
• ORDIX NEWS •
Informix:
Fragen an die Zukunft
Durch den Kauf von Informix hat IBM für reichlich Verwirrung gesorgt. Wie sollen
Informix Anwender zukünftig vorgehen? Migrieren! - Aber wohin? Das ist eine
der zentralen Fragen, die wir als unabhängiges Haus und Partner der beiden
bislang wesentlichen Datenbankhersteller im Open Systems Umfeld gerne mit
Ihnen diskutieren wollen. Einige der wesentlichen Punkte haben wir bereits hier
für Sie aufgeführt, damit Sie mehr Klarheit bekommen.
Fakten
Zwischen Oracle und IBM herrscht
zur Zeit sicher nicht das allerbeste
Klima. Stehen doch die beiden
Datenbanksysteme DB2 und Oracle schon seit längerem in heftigem
Wettbewerb, der in den letzten Monaten auch in großen, ganzseitigen
Anzeigen für Anwender sichtbar
wurde.
Laut IBM (DB2 data management
software Newsletter Winter 2001/
2002) werden „Informix Produkte
weiter entwickelt und gepflegt, solange dies vom Markt gewünscht
wird“ und „Es wird keine erzwungene Migration zu DB2 geben“. Auch
wenn diese Aussagen nicht sehr
griffig sind, kann man jedoch davon
ausgehen, dass Applikationen, die
nur noch eine „begrenzte Lebensdauer“ besitzen, ohne Probleme
weiterhin mit Informix ihr Lebensende erreichen können.
DB2 ist nicht DB2:Ganz wichtig ist
es, zu unterscheiden, dass es sich
bei DB2 für Mainframes um ein
anderes DB2 handelt als bei DB2
Universal Database. „In zukünftige
Versionen von DB2 Universal Database wird auch Informix Technologie einfließen“. Warum nur in die
eine Richtung? Ist DB2 technologisch veraltet und benötigt Informix
Technologie?
Ausgabe 1/2002
Oracle ist derzeit die am meisten verbreitete Datenbank. Das heißt zwar nicht, dass Oracle die
beste Datenbank ist, aber eine Entscheidung für
Oracle ist damit heute genauso gut und sicher wie
eine Entscheidung für IBM Hardware in der Vergangenheit, als IBM der Hersteller mit der weitesten
Verbreitung war.
Fragen
Zur Zeit werden Sie auf viele Dienstleister treffen,
die Ihre Informix Datenbank migrieren wollen. Viele
wollen vor allem nur Ihr Geld und nutzen Ihre Verunsicherung aus. Deshalb
sollten Sie sich bereits
• Wie lange werden meine Applikatioheute die nebenstehennen in dieser Form noch genutzt?
den Fragen stellen. Kön• Plane ich eine Neuentwicklung/
nen Sie alle Fragen selbst
Redesign?
beantworten? Wägen Sie
• Kommt für mich Standardsoftware
Vor- und Nachteile sehr
anstelle von Individualsoftware in
sorgfältig ab. Trauen Sie
Frage?
keinem, der Ihnen erzählt,
• Welche Vor-/Nachteile habe ich von
wie einfach eine Umsteleiner „schnellen" Migration?
lung ist. Jede Umgebung
• Welche Datenbankplattform wird
ist anders, selbst bei Stanzukünftig meine strategische Plattdardsoftware trifft man
form sein?
immer wieder auf Beson• Wie wirkt sich eine 1:1 Migration
derheiten. Eine Migration
meiner bestehenden Applikation(en)
ist immer ein individuelles
aus?
und neues Projekt.
• Welche Kosten bin ich bereit für eine
Migration zu tragen?
Wir beraten Sie gerne und
• Habe ich einen Partner, der unabhänwir helfen Ihnen auch,
gig ist und mir wirklich helfen will?
wenn Sie sich für eine Migration oder Neuentwicklung entscheiden! Profitieren Sie von unserer Erfahrung mit den Datenbanksystemen. Fragen Sie uns
z. B. auf der CeBIT oder per E-Mail: [email protected].
41
Herunterladen