03 MS SQL Server 2008 - Filestream

Werbung
www.ordix.de
news
MS SQL Server 2008 - Filestream
Performante Speicherung von umfangreichen Dokumenten, Musik- oder Video-Dateien
Google Web Toolkit Internationalisierung
Multilinguale Web-Anwendungen
S. 10
Management von
IT-Unternehmensarchitekturen
S. 38
03
2009
€ 2,20
S. 28
Spring 3.0: Der Frühling geht weiter
Neuerungen des ersten Releases
S. 31
Failover und Load Balancing
Vorteile der Oracle RAC 10g Architektur
S. 34
Die beste Plattform
zum Erfahrungsaustausch
der Oracle-Anwender
Wissen
in mehr als 300
Fachvorträgen
Networking
mit zahlreichen
Oracle-Partnern
Diskussion
mit dem OracleManagement
Erfolgreich durch die
Oracle-Community
„Ask XY“ Sessions
mit namhaften
Keynotespeakern
Brandaktuell
„Inside Oracle
Database 11g R2“
Oracle-Themenspektrum in 18
parallelen Tracks
Schulungstag am 20.11.
mit renommierten
Schulungspartnern
Infos und
Anmeldung unter
www.doag2009.org
DOAG 2009 Konferenz + Ausstellung
17. – 19.11.2009 im CongressCenter Nürnberg CCN Ost
Editorial
Ausbildung
Paderborn, September 2009
Die aktuelle Wirtschaftskrise lässt sicher viele Schlüsse zu. Eines können die meisten unserer
Leser jedoch für sich ableiten. Der Arbeitsmarkt ist nicht so stark eingebrochen, wie das von manchen Auguren befürchtet wurde. Da hat sicher das verlängerte Kurzarbeitsgeld zu beigetragen,
aber auch die Tatsache, dass es schwierig ist, wenn die Wirtschaft wieder anzieht, gut ausgebildete Fachkräfte, die man vorher entlassen hat, schnell wieder einzustellen.
Die Betonung liegt auf gut ausgebildet. Und diese Tatsache gilt branchenübergreifend. Wer also
wie auch immer (durch den Arbeitgeber oder durch Eigeninitiative) auf eine gute Ausbildung setzt,
hat in der Regel einen sicheren Arbeitsplatz oder findet bei Verlust schnell einen neuen.
ORDIX ist nunmehr im zwanzigsten Jahr seines Bestehens und in dieser Zeit haben wir viele Projekte durchgeführt und viele Kunden begleitet. Eines haben wir immer wieder festgestellt: Je besser die Mitarbeiter unserer Kunden ausgebildet waren, desto motivierter waren sie und umso erfolgreicher verliefen die Projekte. Wir setzen seit der Gründung bei unseren Mitarbeitern auf eine
gute Ausbildung und fördern diese ständig.
In den nächsten Wochen erscheint unsere neue Seminarbroschüre. Wir erweitern unser Seminarprogramm in 2010 um einige Seminare unserer Tochtergesellschaft coniatos und bieten somit
neben rein technischen Schulungen inzwischen auch viele Themen an, die die bisherige, vorwiegend technische Ausrichtung unserer Seminare hervorragend ergänzen.
Wie ernst wir das Thema Wissensbildung nehmen, zeigen wir auch seit Jahren schon mit der
ORDIX News. Bei einigen Gesprächen, die ich mit Bewerbern, Kunden und Kollegen führe, entsteht manchmal der Eindruck, dass wir ein Verlagshaus sind. Nein sind wir nicht, aber auch am
Beispiel unserer Zeitung sehen Sie, dass wir den Begriff „Ausbildung“ sehr weit fassen und als
offenes System- und Softwarehaus unsere Leser mit unseren Artikeln auf neue und modernere
Technologien aufmerksam machen und ihnen dadurch einen Einstieg in andere Themengebiete
ermöglichen.
Das ist nur eine unserer Ausbildungsleistungen der letzten 15 Jahre. In dieser Zeit haben wir mit
der ORDIX News ca. 3 bis 3,5 Millionen Euro in die Ausbildung unserer Leser investiert. Für sie
war das kostenlos. Aus unserer Sicht Zeit für Sie, jetzt auch selbst zu investieren. Denn eines ist
klar, um einen uralten Slogan der Optikerbranche zu verwenden: Gute Ausbildung nützt, gute Ausbildung schützt. Wie eingangs erwähnt.
Deshalb werfen Sie einen Blick in unsere neue Seminarbroschüre und wenn Sie keine bekommen, es gibt sie als Download auf unseren Webseiten und natürlich können Sie die Broschüre
auch gerne bei uns bestellen.
Was lernen Sie in dieser Ausgabe: Erstmalig beschäftigen wir uns mit Google-Technologien. Sie
lesen etwas zum Management von Datenbankobjekten aus Java (Hibernate) und PHP-Anwendungen heraus und – zur Zeit eines der spannendsten Themen – neues zur Virtualisierung unter
Linux. Daneben wie immer einige Projektberichte und interessante Neuigkeiten rund um die Datenbanken (MS SQL/Oracle).
In der Hoffnung, dass Sie in den Sommerwochen Kraft und Energie tanken konnten, sich nicht
durch Wahlkampfgezetere, Wirtschaftskrise und Opelkrampf mürbe machen lassen, wünsche ich
Ihnen viel Spaß beim Lesen
Wolfgang Kögler
PS: Lassen Sie sich nicht von Wirtschaftsprognosen in die Irre führen. Volkswirte sind keine Hellseher und viele von Ihnen sind nur schlechte Interpreten der Vergangenheit. Kaum gibt es mal
gute Nachrichten, schon sehen die Prognosen ganz anders aus. Schlimmer als Meteorologen.
ORDIX News 3/2009
3
Inhalt
Google Web Toolkit Internationalisierung
Seite 10
Java/JEE
10��������� Google Web Toolkit Internationalisierung
Vergleich und Bewertung verschiedener Internationalisierungsstrategien anhand eines Beispielprojektes.
31��������� Spring 3.0:
Der Frühling geht in die Verlängerung!
Neben einer kurzen Einführung in die neuen
Features von Spring 3.0 wird auf die Verwendung
der SpEL (Spring Expression Language) eingegangen.
48��������� Performance-Tests mit Hibernate (Teil III):
Lazy und Eager Loading – ein guter Cache
lädt nicht mehr als er muss
Mit Hilfe von Lazy und Eager Loading können in
Hibernate nur die Objekte in den Cache geladen
werden, die auch wirklich gebraucht werden.
Open Source
14����������PHP Data Objects Datenbankabstraktion mit PHP
Grundlagen der Programmierung mit der objektorientierten und flexiblen Datenbankschnittstelle, die
Anwendung unabhängig von der anzubindenden
Datenbanken macht.
4
ORDIX News 3/2009
MS SQL Server 2008 - Filestream
Seite 28
Datenbanken
6����������� Oracle Enterprise Manager Grid Control (Teil VII): Zeitgesteuerte Jobverwaltung und Berichterstellung
Oracle liefert mit der Steuerung und dem
Monitoring von Jobs und einer Sammlung
von konfigurierten Berichten ein mächtiges
Werkzeug.
20��������� Crystal Reports Standard Reporting mit HTML und
dynamischem SQL unter Oracle
Einblick in die Funktionen der Jobverwaltung und Berichterstellung im Oracle Enterprise Manager.
28��������� MS SQL Server 2008 New Features
(Teil III): FILESTREAM - Eine performante
Speicherung umfangreicher Binärdaten
Mit der neuen Funktion „FILESTREAM“ können vom SQL Server verwaltete Binärdaten
auch außerhalb der Datenbankdateien im
Dateisystem gespeichert werden.
34��������� Oracle Real Application Cluster (RAC)
10g (Teil IV): Failover und Load Balancing
Erst spezielle client- und serverseitige Kon­
figurationen hinsichtlich Failover und Loadbalancing eröffnen die vollen Möglichkeiten
der RAC-Technologie bezogen auf Verfügbarkeit und Skalierbarkeit.
44��������� Projektbericht:
Erstellung eine Standard Oracle Umgebung (SOU)
Mittels einer Standard Oracle Umgebung
konnten bei einem unserer Kunden die
Oracle Installationen standardisiert und
teilweise automatisiert werden.
Inhalt
Spring 3.0 - Der Frühling geht in die
Verlängerung
Seite 31
Aktuell
18��������� Larry Ratlos
und sein Excel-/Datenbank Problem (Teil II)
23��������� ORDIX Open und Mini ORDIX Open 2009
Ein Rückblick auf das weltgrößte Schnellschachturnier in Mainz
24��������� DOAG Konferenz und Schulungstag 2009
ORDIX und coniatos – ein starkes Gespann
Management von IT-Unternehmens­
architekturen
Seite 38
IT-Strategie
38��������� IT-Management (Teil II) „Der Blick auf das Ganze“:
Management von IT-Unternehmensarchitekturen
Konzepte und Prozesse im
Enterprise Architecture Management
Standards
03��������� Editorial
04��������� Inhalt
05��������� Impressum
26��������� Seminarübersicht: September 2009 bis Februar 2010
Impressum
Herausgeber:
ORDIX AG
Aktiengesellschaft für Software­ent­wick­lung,
Beratung, Schulung und Systemintegration,
Paderborn
Redaktion: Jens Pothmann, Stefanie Heither-Bürger
V.i.S.d.P.: Benedikt Georgi, Wolfgang Kögler
Anschrift der Redaktion:
ORDIX AG
Westernmauer 12 - 16
33098 Paderborn
Tel.: 05251 1063-0
Fax: 0180 1673490
Gestaltung/Layout:
Jens Pothmann, Stefanie Heither-Bürger
Auflage: 9.900
Druck: Media-Print Informationstechnologie GmbH, Paderborn
Bildnachweis:
© aboutpixel.de/Revolution der Musik,
© iStockphoto/helping hands,
© coniatos AG/Matthias Heinl,
© aboutpixel.de/offene Hand getready,
© aboutpixel.de/extra dry DJ Joe,
© chesstigers
Autoren dieser Ausgabe:
Karsten Fiedler, Julian Gärtner, Klaus Garstecki, Marius Dorlöchter, Matthias Heinl,
Stefanie Heither-Bürger, Andreas Jordan, Alexander Keil, Lars Hendrik Korte, Wolfgang
Kögler, Jens Pothmann, Thomas Rohde
Copyright:
ORDIX AG. Alle Rechte, auch die der Übersetzung, des Nachdrucks und der Vervielfältigung der Artikel oder von Teilen daraus, bleiben uns vorbehalten. Kein Teil der
Artikel darf ohne unsere schriftliche Genehmigung in irgendeiner Form reproduziert,
insbesondere unter Verwendung elektronischer Systeme verarbeitet, verbreitet, vervielfältigt oder zu öffentlichen Wiedergaben benutzt werden.
Haftung:
Eine Haftung für die Richtigkeit der Veröffentlichungen kann trotz sorgfältiger Prüfung
durch die Redaktion vom Herausgeber nicht übernommen werden.
Warenzeichen:
Einige der aufgeführten Bezeichnungen sind eingetragene Warenzeichen ihrer jeweiligen Inhaber. ORDIX® ist registrierte Marke der ORDIX AG.
Die Zeitschrift ORDIX News wird von der ORDIX AG an ausgewählte Kunden verteilt
und kann für 2,20 Euro bestellt werden. Sie finden sowohl die neueste Ausgabe als auch
ältere Ausgaben im Archiv 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 An­re­gungen, Kritik und Anmerkungen zu den Themen, aber auch für interessante Ideen sind wir immer offen und
dankbar. Wir freuen uns auf Ihr Feedback an [email protected].
ORDIX News 3/2009
5
Datenbanken
Oracle Enterprise Manager Grid Control (Teil VII)
Zeitgesteuerte Jobverwaltung
und Berichterstellung in Grid Control
Dieser Artikel wendet sich an
Datenbankadministratoren,
die ihre Jobsteuerung der Ziele
mit dem Oracle EM Grid Control
standardisiert verwalten möchten.
Während sich der sechste Teil dieser Reihe [1] mit der Standardisierung der Überwachung unter Verwendung des Oracle Enterprise Managers Grid Control beschäftigte,
richtet sich das Augenmerk in diesem Artikel auf die Vereinheitlichung der Jobverwaltung und des Berichtswesens für bestimmte Zielgruppen.
Allgemeines
Oracle liefert mit der Steuerung und dem Monitoring von Jobs sowie mit einer Sammlung
von bereits zur Ausführung konfigurierten Berichten ein mächtiges Werkzeug. Die Funktionen stehen mit der Installation und Einrichtung des Enterprise Managers, kostenlos zur
Verfügung. Die Ausführung von Jobs und die
Erstellung von Berichten kann sofort, zu einem
späteren Zeitpunkt sowie zeitgesteuert wiederholt gestartet werden.
Die Übersichtsseiten der Jobs und Berichte erreicht man von jeder Seite im EM Grid Control
aus über den entsprechenden Reiter oder die
Links am Ende jeder Seite.
Jobs
Die Startseite der Jobs (siehe Abbildung 1)
enthält eine Liste von Routinen, die mit den
Eingabefeldern nach Status und Name gefiltert werden können. Einzelne Jobs lassen
sich über diese Liste zentral verwalten. Sie ist
ein erster Überwachungsansatz für das JobMonitoring. Die Vielseitigkeit dieses Werkzeugs, ergibt sich jedoch durch die Fülle an
Routinen, die einem zur Verfügung gestellt
werden. Für alle zur Überwachung stehenden
Ziele im EM Grid Control können administrative Job-Routinen erstellt und überwacht werden. Erstellte Jobs können in der Job Library
6
ORDIX News 3/2009
abgelegt und später (manuell oder zeitgesteuert) gestartet oder bearbeitet werden.
Von der Job-Übersichtsseite (siehe Abbildung 1)
können folgende Routinen erstellt werden:
•
•
•
•
•
•
•
•
•
•
•
Agenten Patch
Betriebssystembefehl
Instanzen hoch- bzw. herunterfahren
Konfiguration der Sicherheitspolicy
Log Rotation
Oracle Patch Update
Refresh from Metalink
RMAN-Skript
SQL-Skript
Statspack löschen
Multi-Task-Job
In der Praxis werden am häufigsten SQLSkripte, Multi-Task-Jobs und RMAN-Jobs verwendet.
Generierung von Jobs
Die Definition von Jobs ist fast bei allen Routinen identisch. Bei der Job-Auswahl ist darauf
zu achten, dass die Anwendung bestimmter
Job-Typen auf die Zielgruppen beschränkt ist,
auf der sie ausgeführt werden können.
Um einen Job zu definieren, wird auf der Übersichtsseite der Typ aus der Dropdown-Liste­
selektiert und auf „weiter” geklickt. Die Defini-
Datenbanken
tionsübersicht ist in folgende fünf Schritte untergliedert:
•
•
•
•
•
Allgemein
Parameter
ID-Daten
Ausführungsplan
Zugriff
Je nach Job-Typ müssen nicht immer alle
Reiter ausgefüllt werden. In diesen Reitern
erscheint der Hinweis, dass der Job dann hier
keine Eingaben erfordert.
Abb. 1: Die Job-Übersichtsseite des EM Grid Control mit der Filterfunktion, der
Job-Erstellungsauswahl und der Job-Übersicht.
Maske Allgemeines
In der Maske „Allgemeines“ wird der Job beschrieben. Um fortzufahren, ist die Vergabe
eines Namens erforderlich. Die Routine sollte
optional noch eine Beschreibung der Funktion
erhalten. Der Zieltyp ist je nach Job-Typ nicht
variabel, da man zum Beispiel den Routinentyp „Datenbank hoch- bzw. herunterfahren“
nur auf eine Datenbankinstanz anwenden
kann. Ein Job bezieht sich immer auf einen
Zieltyp. Innerhalb des Zieltyps ist es jedoch
möglich, mehrere Ziele hinzuzufügen.
Reiter Parameter
Im Reiter „Parameter“ findet die eigentliche
Spezifikation des Jobs statt. Hier können entweder einzelne Befehle oder ganze Skripte
eingegeben werden. Zur Programmierung dieser Befehle oder Skripte stehen bestimmte
Variablen zur Verfügung.
Beim Herunter- oder Hochfahren der Instanz
sind an dieser Stelle sämtliche Parameter aufgelistet, die für die Ausführung angegeben
werden können, wie zum Beispiel für den Befehl shutdown die Option immediate.
ID-Daten
Im dritten Schritt werden die Verbindungsdaten zum Ziel angegeben. Diese Daten können schon zentral unter „Voreinstellungen 
Bevorzugte ID-Daten” für dieses Ziel hinterlegt sein [2]. Für einen Job können aber auch
unter „Bevorzugte ID-Daten außer Kraft setzen” andere Zugangsdaten angegeben werden.
Bei der Angabe der Zugangsdaten ist darauf
zu achten, dass der User über ausreichend
Rechte verfügt, um den Job auszuführen.
Ausführungsplan
Zum Terminieren der erstellten Jobs liefert der
Oracle Enterprise Manager Grid Control drei
Varianten. Die Routinen können zum einen einmalig, das heißt sofort nach Abschluss der
Eingaben, oder später zu einer angegebenen Zeit ausgeführt werden. Zum anderen
besteht aber auch die Möglichkeit, in immer
wiederkehrenden Abständen die Jobs starten
zu lassen. Allerdings beschränkt sich die Angabe auf ein immer gleiches Intervall, das hier
angegeben werden kann. Ausführungen, wie
zum Beispiel jeweils am Montag und Freitag,
sind nur abzudecken, wenn man nach der
Job-Erstellung nochmals in den Änderungsmodus wechselt.
Reiter Zugriff
Der Reiter „Zugriff“ bietet zum einen die Möglichkeit, Grid Control Benutzern Rechte auf
diesen Job zuzuordnen. Zum anderen kann
eine E-Mail-Benachrichtigung zu einem gewissen Status des Jobs versendet werden.
Voraussetzung ist hierbei allerdings, dass der
SMTP-Server unter „Setup  Benachrichtigungsmethoden” eingestellt ist [2]. Wir empfehlen hier, nicht nur bei Problemen E-Mails
zu generieren, sondern auch zum Start der
Ausführung oder wenn ein Job erfolgreich
abgeschlossen wurde. Sollte nur bei Problemen die E-Mail generiert werden, hat man nur
schwer Einblick darin, ob der Job zum angegebenen Zeitpunkt überhaupt gestartet worden ist.
Gestartet wird die Ausführung des Jobs mit
dem Button „Weiterleiten”. Den Job kann man
als Vorlage in die Job Library ablegen. Sollten
alle notwendigen Felder der fünf Job-Definitionsschritte ausgefüllt sein, erscheint eine Bestätigungsmeldung.
ORDIX News 3/2009
7
Datenbanken
Berichte
Der Oracle Enterprise Manager liefert von
Haus aus viele bereits konfigurierte Berichte,
die man auf die jeweils eingestellten Ziele anwenden kann. Ein Blick auf die Berichtübersichtsseite (siehe Abbildung 2) zeigt alle zur
Verfügung stehenden Berichte. Die mitgelieferten Berichte können nicht direkt bearbeitet
werden. Allerdings kann man einen Bericht
auswählen und unter dem Button „Ähnliche
erstellen” den vorhandenen Bericht nach eigenen Vorlieben anpassen. Sollte hier noch
jemand Informationen vermissen, ist es auch
möglich einen komplett neuen Bericht zu erstellen.
Abb. 2: Die Berichtübersichtsseite enthält eine Fülle von bereits mitgelieferten
Berichtvorlagen.
Bericht auf ein Ziel anwenden
Eine vorhandene Formatvorlage auf ein Ziel
anzuwenden, ist sehr einfach gehalten. Der
entsprechende Link wird auf der Berichtüber­
sichtsseite ausgewählt. Daraufhin muss ein
Ziel ausgewählt werden. Bei der Zielauswahl
hilft die Taschenlampe hinter dem Eingabefeld, die alle passenden Ziele auflistet.
In dem erstellten Bericht (siehe Abbildung 3)
kann man einen Zeitraum festlegen, den der
Bericht abdecken soll. Für sämtliche Berichte
steht eine Druckversion zur Verfügung.
Abb. 3: Ein fertig erstellter Bericht am Beispiel der Verfügbarkeitshistorie einer
Datenbankinstanz.
Benutzerdefinierten Bericht erstellen
Wie bereits erwähnt, können komplett neue
Berichte generiert werden („Erstellen”). Hier
sind der Phantasie keine Grenzen gesetzt.
Job-Monitoring
Das Überwachen von Jobs in Grid Control
ist sehr redundant ausgelegt. Es gibt viele
Möglichkeiten, zu den entsprechenden Informationen zu gelangen. Einige Methoden
sind schon im Laufe dieses Artikels erwähnt
worden. Eine Möglichkeit ist die Versendung
von E-Mails bei Statusänderungen des Jobs.
Möglichkeiten in der Webkonsole findet man
sowohl auf der Job-Übersichtsseite als auch
auf der Startseite eines jeden Ziels (Beispiel:
Ziel  Datenbanken  DbName).
Auf der Job-Übersichtsseite kann man für die
Detailinformationen auf den Link des Job-Namens klicken. Die Startseite jedes Ziels be­
inhaltet eine Zusammenfassung über die JobAktivitäten der letzten sieben Tage auf dem
jeweiligen Ziel.
8
ORDIX News 3/2009
Im allgemeinen Teil der Berichterstellung wird
identisch zu den Jobs ein Berichtname und
eine optionale Beschreibung ausgewählt. Unter Ziele kann der Berichtdefinition eine Zielgruppe oder ein festes Ziel zugewiesen werden. Die Angabe, des zu berücksichtigenden
Zeitraums kann variabel vom Benutzer bei
der Generierung angepasst werden, wenn es
gewünscht ist.
Die Daten, die zur Erstellung eines Berichts
von Oracle ausgewertet werden, kommen
ausschließlich aus der Repository-Datenbank
(emrep). Daher ist es nicht möglich, flexible
Reports auf Anwenderdaten aus anderen
Datenbanken zu erstellen. Diese Einschränkung ist für Anwender sehr unangenehm, die
bereits Reports mit dem unter Oracle 9i gängigen Management Server erstellt hatten.
Datenbanken
Im Reiter Elemente wird das Layout des Berichtes generiert. Je nach Ziel stellt Oracle
viele Möglichkeiten bereit. Diese reichen von
einfachem, formatiertem Text, bis hin zu komplexen SQL-Abfragen, aus denen ein Diagramm generiert wird. Oracle stellt dafür ein
eigenes Benutzerhandbuch zu Verfügung.
Bei der Berichterstellung gibt es die Möglichkeit, unter „Ausführungsplan”, einen zeitgesteuerten Job einzurichten, der den Bericht
per E-Mail versendet und/oder eine Kopie mit
einer gewissen Vorhaltzeit abspeichert.
Fazit
Mit dem Job Scheduler und den Berichten
stellt der Enterprise Manager umfangreiche
Tools zur Verfügung. Das zentrale Job-Management stellt eine Vereinfachung gegenüber dem Duplizieren von Jobs auf jedem
einzelnen Rechner dar. Die Gefahr von Inkonsistenzen innerhalb der auszuführenden Skripte wird durch diese zentrale Vorgehensweise minimiert. Wir empfehlen, sich für
Links
►► [1] ORDIX News Artikel „Standardisieren Sie Ihre individuelle Überwachung!“
http://www.ordix.de/ORDIXNews/1_2009/Datenbanken/oracle_customizing.html
►► [2] ORDIX News Artikel „Installation und Konfiguration“
http://www.ordix.de/ORDIXNews/4_2007/Datenbanken/Grid_Control_teil2.html
eine Art des Job-Scheduling zu entscheiden.
Dieses verringert den Verwaltungs- und Monitoring-Aufwand.
Das Berichtwesen ist für die Generierung neuer Berichte für ungeübte Benutzer ein schwieriges Werkzeug. Allerdings bleiben durch
die Vielzahl an bereits bestehenden Berichten kaum Wünsche offen. Es sei denn, man
möchte individuelle Berichte auf Anwenderdaten aus anderen Datenbanken erstellen.
Ole Breimann ([email protected]).
Seminarempfehlung: Oracle Grid Control
►► Informationen/Online-Anmeldung: http://training.ordix.de/seminar.php?nr=552
In diesem sehr übungsintensiven Workshop lernen Sie, mit Oracle Grid Control zu arbeiten und umzugehen. Sie erhalten einen Überblick über
die Oberfläche und die Installation der Agenten. Nach dem Seminar sind Sie in der Lage, Oracle Datenbanken über die GUI-Oberfläche zu
verwalten und zu administrieren.
Seminarinhalte
•
•
•
•
•
•
•
•
•
•
•
Überblick über die Oberfläche
Installation Grid Control
Migration von OMS zu Grid
Installation der Agenten unter Oracle 8i, 9i, 10g
Administration
Alerts
Metriken
Jobs
Advisor Framework
ADDM
Vertiefung der Theorie durch praktische Übungen und Beispiele
Termine
16.11.- 18.11.2009 in Wiesbaden
15.02.- 17.02.2010 in Wiesbaden
07.04.- 09.04.2010 in Wiesbaden
Seminar-ID: DB-ORA-35
Dauer: 3 Tage
Preis pro Teilnehmer: 1.290,00 € (zzgl. MwSt.)
Frühbucherpreis: 1.161,00 € (zzgl. MwSt.)
Wir führen unsere Seminare auch jederzeit an einem geeigneten Ort Ihrer Wahl durch und bringen, wenn nötig, auch das entsprechende
Equipment mit. Informieren Sie sich am besten im Internet über unsere Inhouse-Seminare und die mobilen Schulungen: http://training.ordix.de.
ORDIX News 3/2009
9
Java/JEE
Do you understand me?
Google Web Toolkit Internationalisierung
Dieser Artikel richtet sich an
Java-Entwickler, die das Google
Web Toolkit in multilingualen
Projekten einsetzen möchten.
Das Framework Google Web Toolkit (GWT) unterstützt bei der Entwicklung von Rich
Internet Applications für Standard-Browser. Seit dem letzten GWT-Artikel [1] hat sich
GWT am Markt etabliert. Mittlerweile ist GWT eine Open Source-Lösung und seit Juli
2009 in der Version 1.7 veröffentlicht. Dieser Artikel vergleicht und bewertet verschiedene Internationalisierungsstrategien für GWT-Projekte. Des Weiteren wird die Internationalisierung eines Beispielprojektes anhand der Static String Strategie erläutert.
Vorbereiten des Beispielprojektes
Das Google Web Toolkit ist auf den GoogleInternetseiten [2] als Download für Windows,
Linux und MacOS verfügbar. Nach dem Entpacken des GWT-Archivs ist das Toolkit ohne
weitere Konfiguration einsetzbar. GWT setzt
lediglich eine Installation von Java 32 bit SDK
Version 5 oder 6 voraus. Ein versionsspezifisches GWT-Eclipse-Plugin stellt Google zusätzlich zum Download bereit. Das Plugin erleichtert die Entwicklung unter anderem durch
Wizards, Run und Debug-Funktionalitäten sowie GWT-JUnit-Support.
GWT liefert seit der Version 1.6 den WebAppCreator zur Generierung der Verzeichnis- und
Projektstruktur aus, der den Funktionsumfang
von applicationCreator und projectCreator älterer GWT-Versionen in einem Werkzeug abdeckt.
Für die Internationalisierung verwenden wir
das GWT Web Application Starter Projekt
„GreetingService“, das durch den Aufruf des
10
ORDIX News 3/2009
WebAppCreators (siehe Abbildung 1) in den
Ordner ONewsProjekt generiert wird. Der
letzte Übergabeparameter bestimmt den Modulnamen und die Paketstruktur. In diesem
Fall ist das angegebene Paket de.ordix
und der Modulname ONews. Das generierte
Projekt kann direkt in Eclipse importiert werden. Bei installiertem Google-Eclipse-Plugin
sollte der Entwickler die GWT-Funktionen in
den Projekt-Eigenschaften aktivieren (siehe
Abbildung 2).
Auswahl der Internationalisierungs­
strategie
GWT unterstützt die Internationalisierung einer Applikation von Hause aus. Die verfügbaren Strategien sind statische und dynamische String-Internationalisierung, sowie
eine eigene Implementierung des Localizable
Interfaces. Abbildung 3 zeigt die Hierarchie
wichtiger Klassen für die Internationalisierung
von GWT-Projekten.
Java/JEE
Internationalisierung mit Static String
gwt-windows-1.6.4>webAppCreator.cmd -out ONewsProjekt
Die Internationalisierung mit Static String
stellt lokalisierte Konstanten und Nachrichten
auf Basis von Java Interfaces, propertiesDateien und GWT-Code-Generierung bereit.
Der Compiler generiert einzelne Versionen
der Benutzerschnittstelle für jede Lokalisierung. Diese Strategie verursacht zur Laufzeit
wenig Overhead und ist einfach zu implementieren, bietet aber unter Umständen nicht genügend Flexibilität. Die Vor- und Nachteile
dieser Strategie finden Sie in Abbildung 4.
Abb. 1: Aufruf des WebAppCreators.
Internationalisierung mit Dynamic String
Die Internationalisierung mit Dynamic String
basiert auf der Dictionary-Klasse und liest
Paare von Schlüsselwerten aus der HTMLHost-Seite des GWT-Moduls. Der Entwickler
fügt alle dynamischen Strings als assoziative
Java Script Arrays in den body der Host-Seite ein. Zur Laufzeit liest GWT die Schlüsselwerte-Paare aus und verwendet diese dann
beim Rendering der Benutzerschnittstelle. Bei
der Änderung der Übersetzung und der Ergänzung von Sprachen muss die Anwendung
nicht neu kompiliert werden, sondern lediglich
eine Anpassung in der Host-HTML-Seite vorgenommen werden. Dieser Vorteil kann an anderen Stellen allerdings zu Problemen führen.
Beispielsweise kann der Compiler fehlende
Schlüsselwerte-Paare nicht erkennen und somit Laufzeitfehler nicht verhindern. Nutzt eine
bestehende Webseite bereits assoziative
Java-Script-Arrays zur Lokalisierung, bietet
sich Dynamic String-Internationalisierung für
das GWT-Modul an. Die Vor- und Nachteile
dieser Strategie sind in Abbildung 5 dargestellt.
Eigene Implementierung
des Localizable Interfaces
Die mächtigste Möglichkeit stellt die eigene Implementierung des Localizable Interfaces dar.
Der Entwickler erzeugt zunächst Standardklassen, die das Localizable Interface implementieren. Die lokalisierten Klassen erweitern
dann die Standardklassen. Die Namen dieser
Klassen müssen der internationalisierungsspezifischen Namensstruktur ent­sprechen. So
können lokalisierte Versionen eigener Typen
erstellt werden. Die Implementierung dieser
Strategie ist sehr aufwändig und wird nur selten benötigt.
Für das Beispielprojekt „GreetingService“ verwenden wir die Strategie Static String.
Abb. 2: GWT-Projekt in Eclipse.
Static String
Internationalisierung
Interface
Object
Dictonary
Localizable
Constants
Dynamic String
Internationalisierung
Klasse
Messages
Abb. 3: Hierarchie der verwendeten GWT-Klassen und Interfaces.
Vorteile
Einsatz vorhanderner
Implementierungsansätze
(properties-Dateien) möglich
Die Existenz von Konstanten oder Nachrichten wird vom Kompiler überprüft.
Fehlende Einträge erzeugen einen Kompilerfehler.
Der Kompiler entfernt ungenutzte Konstanten/Nachrichten und minimiert so die
Größe der ausgelieferten Dateien
Nachteile
Neukompilierung des Codes bei Änderung der Konstanten/Nachrichten-Inhalte
nötig
Bei der Änderung des Gebietsschemas
muss die Webseite neu geladen werden.
Abb. 4: Vor- und Nachteile der Internationalisierung mit Static String.
ORDIX News 3/2009
11
Java/JEE
Vorteile
Einsatz vorhanderner Implementierungsansätze (Java-Script Arrays)
Nachteile
Die Existenz von Konstanten oder Nachrichten wird vom Kompiler nicht erkannt.
Fehlende Einträge führen ggf. zu Fehlern
in der Bernutzerschnittstelle
Neukompilierung des Codes bei Ände- Der Kompiler kann ungenutzte Konstanrung der Konstanten/Nachrichten-Inhalte ten/Nachrichten nicht entfernen und desnicht nötig
halb die Größe der ausgelieferten Dateien nicht optimieren
Änderung des Gebietsschemas erfordert
i.d.R. keine Neukompilierung
Abb. 5: Vor- und Nachteile der Internationalisierung mit Dynamic String.
package de.ordix.client;
import com.google.gwt.i18n.client.Constants;
public interface GreetingConstants extends Constants {
@DefaultStringValue("Greeting Service")
String greetingService();
... }
Abb. 6: Implementierung des Interfaces GreetingConstants.
greetingService enterName send = Grüß-Service
= Bitte geben Sie Ihren Namen ein:
= Senden
Abb. 7: Auszug der GreetingConstants_de.properties.
<!-- <h1>Greeting Service</h1>-->
<h1 id="greetingService"></h1>
Abb. 8: Marker für die Überschrift in der HTML-Host-Seite Onews.html.
1 private GreetingConstants constants =
GWT.create(GreetingConstants.class);
2 public void onModuleLoad() {
3 RootPanel.get("greetingService")
.add(new Label(constants.greetingService()));
...}
Abb. 9: Lokalisierte Version der Klasse Onews.java.
Zunächst müssen die Schnittstelle für Konstanten und Nachrichten auf Client-Seite implementiert werden. Im nächsten Schritt legt
der Entwickler für jede Sprache die entsprechenden Übersetzungen an. Zum Abschluss
werden alle festcodierten Texte durch die dynamischen Konstanten und Nachrichten ersetzt. Die Vorgehensweise für Nachrichten
und Konstanten ist analog. Deshalb werden
in diesem Beispielprojekt lediglich die Konstanten übersetzt.
Implementierung Constants Interface
Zuerst implementiert der Entwickler im ClientPaket das Interface GreetingConstants,
welches das Interface GWT-Constants erweitert (siehe Abbildung 6). Dieses Interface verbindet sich anhand des Klassennamens automatisch mit allen GreetingConstants*.
properties-Dateien im Klassenpfad. Jede
Konstante in der Datei properties muss
über eine Methode im Interface bekannt gemacht werden. Die Standardwerte können mit
der Annotation @DefaultStringValue angegeben werden. Zur Laufzeit nutzt GWT den
Methodenaufruf in Verbindung mit der entsprechend lokalisierten Datei properties.
Ohne explizit gesetzte Lokalisierung wählt
GWT den annotierten Standardwert aus.
Erstellung der Übersetzungen
Internationalisierte Anwendungen können
Sprachen verwenden, deren Zeichen nicht
vollständig vom ASCII-Zeichensatz unterstützt
werden. Deshalb sollte der Entwickler sicherstellen, dass die HTML-Host-Seite und die
properties-Dateien UTF-8-codiert sind.
Die Anwendung soll durch eine deutsche Übersetzung erweitert werden. Dazu legt der Entwickler im Client-Paket die UTF-8-codierte Datei GreetingConstants_de.properties
(siehe Abbildung 7) an. GWT identifiziert die
Sprachdateien anhand von Ländersuffixen.
Wenn keine Lokalisierung gefordert ist, wählt
GWT die Standardsprache. Diese kann entweder durch die @DefaultStringValue
Annotation im Interface oder mit einer properties-Datei ohne Sprachsuffix gesetzt
werden.
Lokalisierte Texte nutzen
Abb. 10: Aufruf der lokalisierten Version des GreetingService.
12
ORDIX News 3/2009
In dem GreetingService-Projekt müssen
Strings im HTML-Quellcode der Host-Seite
Java/JEE
und im Programmcode dynamisch gesetzt
werden. Der Titel des GreetingService steht
im HTML-Quellcode. Dieser festcodierte Titel
kann durch einen Marker ersetzt werden (sie­
he Abbildung 8), den GWT dann dynamisch
befüllt. In Abbildung 9 sind die benötigen Anpassungen der Klasse Onews.java dargestellt, damit GWT die Konstanten nutzen
kann. Als erstes intitialisiert der Entwickler mit
GWT.create() (siehe Zeile 1) ein Objekt der
Klasse GreetingConstants.
Die Methode onModuleLoad() wird aufge­
rufen, sobald die HTML-Seite samt JavaScript vom Browser geladen ist. Die Methode instanziert die GWT-Widgets und bindet
die GWT-Inhalte in die HTML-Host-Seite ein.
Zeile 3 ruft die Methode constants.greetingService() auf und setzt den zurückgelieferten String in den Marker greetingService ein. Sämtlicher, festcodierter Text wird
im Folgenden durch die Konstanten ersetzt.
Der GWT-Compiler liest die unterstützten Lokalisierungen aus der GWT Moduldefinition
(Onews.gwt.xml) aus. Durch das Einfügen
von <extend-property name="locale"
values="de"/> wird GWT die deutsche
Übersetzung bekannt gemacht. GWT verwendet zudem die länderspezifischen Datumsformatierungen und Zahlenkonventionen.
Alle nötigen Schritte zur Nutzung der internationalisierten Version sind abgeschlossen.
Beim Aufruf der Seite wird zunächst die englische Standardversion angezeigt. Durch den
Aufruf der Anwendung mit dem Parameter
locale=de (siehe Abbildung 10) wird eine
lokalisierte Version geladen.
Links
►► [1] ORDIX News Artikel “Ajax mit dem Google Web Toolkit”
http://www.ordix.de/ORDIXNews/1_2007/Java_J2EE/google_web_toolkit_ajax.html
►► [2] Download GWT: http://code.google.com/intl/de/webtoolkit/
Alternativ kann die Lokalisierung in den Meta-Informationen der HTML-Host-Seite durch
den Eintrag <meta name="gwt:property"
content="locale=de"> definiert werden.
Wenn beide Einträge gesetzt sind, priorisiert GWT den URL-Parameter. Die entsprechende Lokalisierungseinstellung kann vom
Benutzer manuell ausgewählt oder anhand
der Browser-Einstellungen automatisch zugewiesen werden.
Fazit
Mit der Static String-Internationalisierung liefert GWT ein Mittel, mit dem sich GWT-Applikationen schnell und unkompliziert internationalisieren lassen. Die alternative Strategie
Dynamic String kann bestehende Java Script
Arrays aus einem internationalisierten Projekt
mitnutzen. Durch eine eigene Implementierung des Localizable Interfaces, kann der Entwickler sein Projekt extrem flexibel an Internationalisierungsanforderungen anpassen. Die
drei Strategien decken alle Anforderungen
an multilinguale Applikationen ab. Für neue
Projekte, die auf der grünen Wiese starten,
sollten Entwickler in der Regel die Strategie
Static String einsetzen.
Julian Gärtner ([email protected]).
GWT im Expertencheck
1. Entwicklungsaufwand
2. Browser-Unterstützung
3. Funktionsumfang/verfügb. Erweiterung.
4. Einarbeitung für den Entwickler
5. Dokumentation durch Google
6. Weiterentwicklung und Bugfixing
7. Reifegrad des Frameworks
8. Zukunftspotential
positiv:
negativ:
Das GWT vereinfacht erheblich die Entwicklung von
Rich Client Anwendungen im Browser. Es wird eine hohe Browser-Kompatibilität erreicht, weil keine speziellen
Plug-Ins benötigt werden. Neue Ver­sionen und Bugfixes
werden regelmäßig veröffentlicht. Der Einsatz von GWT
als Rich Client im Browser bietet viel Potenzial. Soll das
Frontend eines Web-Projekts die Anforderungen eines
Rich Clients erfüllen, ist GWT die erste Wahl.
Julian Gärtner, ORDIX AG, Paderborn
ORDIX News 3/2009
13
Open Source
Grundlagen der Programmierung mit der PDO-Schnittstelle
PHP Data Objects Datenbankabstraktion mit PHP
Dieser Artikel richtet sich
an PHP-Entwickler, die flexibel
beim Einsatz von Datenbanken
sein möchten.
Mit den PHP Data Objects (PDO) wird eine Möglichkeit bereitgestellt, Anwendungen
zu entwickeln, ohne auf das angebundene Datenbanksystem Rücksicht nehmen zu
müssen. Mit PDO wird eine abstrakte Datenbankschnittstelle angeboten, die die Entwicklung vereinfacht und Anwendungen unabhängig von der anzubindenden Datenbank macht. Dieser Artikel gibt einen Einblick in die Grundlagen der Programmierung
mit der PDO-Schnittstelle.
Einleitung
PHP unterstützt von Hause aus diverse
DBMS wie beispielsweise Oracle, MySQL,
Informix oder SQLite. Was liegt da näher, als
auch seine Anwendungen vielfältig einsetzbar
und daher unabhängig vom jeweiligen DBMS
zu entwickeln. Bisher haben sich Programmierer vor der Entwicklung Gedanken zur
einzusetzenden Datenbank gemacht. Daraufhin wurden in der Anwendung die von PHP
zur Verfügung gestellten Funktionen für diese
Datenbank genutzt.
Ab PHP 5.1 wird die PDO-Erweiterung standardmäßig mit ausgeliefert und stellt eine einheitliche Schnittstelle für Datenbanken bereit.
Das bedeutet, dass die für den Datenbankzugriff eingesetzten Funktionen bestehen bleiben, auch wenn sich das unter der Anwendung befindliche DBMS ändert. Während für
die bisherige Programmierung Funktionen wie
mysql_connect und mysql_query für
MySQL oder sqlite_open und sqlite_exec
für SQLite oder ifx_connect und ifx_query
für Informix benutzt wurden, wird bei Verwendung von PDO auf eine objektorientierte,
einheitliche Schnittstelle zurückgegriffen, in
der alle Funktionalitäten gekapselt sind. Die
PDO-Schnittstelle ist jedoch nicht mit einem
OR-Mapper, wie z. B. Doctrine oder Propel,
14
ORDIX News 3/2009
zu verwechseln, die nicht in diesem Artikel
behandelt werden. PDO stellt lediglich die
Schnittstelle zur Datenbank dar und ist nicht
dafür verantwortlich, Objekte in Tabellen zu
persis­tieren oder eigenständig SQL-Befehle
zu generieren. Hierzu wiederum sind die angesprochenen Bibliotheken sehr nützlich und
durchaus zu empfehlen. Diese nutzen intern
wiederum die PDO-Schnittstelle als Datenbankabstraktionsschicht.
Voraussetzung für PDO
Die PHP Data Objects sind seit PHP 5.0 als
PECL-Erweiterung verfügbar und ab PHP 5.1
fester Bestandteil der Distribution. Sie können über die Ausgabe von phpinfo() feststellen, ob und für welche Datenbanksysteme
die PDO-Erweiterung in Ihrem Sys­tem aktiviert ist (siehe Abbildung 1). Standardmäßig
ist die PDO-Erweiterung für SQLite integriert.
Benötigen Sie PDO z. B. für MySQL, so ist unter Windows die entsprechende Dynamic Link
Library (DLL) in der php.ini zu aktivieren. Unter
Linux muss dazu jedoch PHP mit dem Schalter --with-pdo-mysql kompiliert werden,
damit die entsprechende PDO-Erweiterung
für MySQL eingebunden wird.
Open Source
Vielfältigkeit von PDO
Analog zur oben genannten Art der Kompilierung können auch folgende PDO-Erweiterungen in PHP eingebunden werden, da sie
direkt mit ausgeliefert werden:
•
•
•
•
•
•
•
MySQL
Firebird
OCI (Zugriff auf Oracle)
ODBC
PostgreSQL
SQLite
DBLIB-DB (Zugriff auf Microsoft SQL
Server oder Sybase)
Seit PHP 5.2 stehen die bekannten InformixFunktionen ifx_* nicht mehr zur Verfügung.
Der Zugriff kann nur noch über die PDOSchnittstelle erfolgen. Die PDO-Erweiterung
für Informix muss für Linux zunächst unter [4]
heruntergeladen, gegen ein installiertes Informix Software Development Kit (SDK) kompiliert und in PHP eingebunden werden. Für
Windows ist die Installation schwieriger, denn
ein Kompilieren kann hier oft nicht durchgeführt werden. Die International Informix User
Group bietet (ohne Gewähr) eine vorkompilierte pdo_informix.dll zum Download an [1].
In aktuellen XAMPP-Paketen wird auch eine
entsprechende Bibliothek mit ausgeliefert.
Auf- und Abbau von Verbindungen
Die Verbindung zu einer Datenbank erfolgt
bei PDO durch das Instanzieren der PDO-Basisklasse mit einem entsprechend parametrisierten Konstruktor. In Abbildung 2 ist der Verbindungsaufbau zu einer MySQL-Datenbank
dargestellt. Als erster Parameter an den Konstruktor wird der Data Source Name (DSN)
angegeben, der alle notwendigen Informationen enthält, wie u. a. den Hostnamen, den
Datenbanknamen und -port.
Der zweite Parameter ist der Benutzername,
mit dem man sich bei der Datenbank anmeldet. Der dritte Parameter ist das zugehörige
Kennwort. Einige PDO-Erweiterungen, wie
z. B. diejenige für SQLite und ODBC, benötigen keine Angabe von Benutzername und
Kennwort als Parameter des Konstruktors.
Hier genügt der DSN mit allen notwendigen
Informationen, wie z. B. dem Pfad zur SQLiteDatenbankdatei oder der bei ODBC zu nutzende Treiber. Hier können u. a. auch LoginInformationen hinterlegt werden. Der genaue
Aufbau und die möglichen Parameter eines
DSN für eine spezielle PDO-Implementierung
Abb. 1: Beispielhafter PDO-Abschnitt in der Ausgabe von phpinfo().
$mysql_dsn = 'mysql:host=localhost;dbname=pdo_test';
$mysql_user = 'root';
$mysql_pwd = '';
try {
$dbh = new PDO($mysql_dsn, $mysql_user, $mysql_pwd);
print 'Verbindung erfolgreich aufgebaut';
} catch (PDOException $pex) {
print $pex->getMessage();
}
$dbh = null;
Abb. 2: Verbindungsauf- und -abbau zu einer MySQL-Datenbank.
+---------+-------------+------+-----+-------+--------------+
| Field
| Type
| Null | Key |Default| Extra
|
+---------+-------------+------+-----+-------+--------------+
| id
| int(10)
| NO
| PRI | NULL |auto_increment|
| vorname | varchar(255)| YES |
| NULL |
|
| nachname| varchar(255)| YES |
| NULL |
|
+---------+-------------+------+-----+-------+--------------+
Abb. 3: Struktur der Tabelle namen.
kann auch in der jeweiligen Beschreibung auf
[2] nachgelesen werden.
Der Verbindungsabbau geschieht im Normalfall beim Beenden des PHP-Skripts. Eine Verbindung kann auch manuell beendet werden,
indem die Instanz des PDO-Objekts zerstört
wird, d. h. explizit auf NULL gesetzt wird, wie
es in Abbildung 2 zu sehen ist.
Datenbanktabellen schreiben
Nachdem eine Verbindung zur Datenbank
aufgebaut wurde, können wir nun Daten in
die Tabellen schreiben. Dazu nutzen wir eine
Tabelle namen und füllen diese mit Werten.
(siehe Abbildung 3). In Abbildung 4 sind die
Code-Zeilen dargestellt, die einen Datensatz
in die Tabelle schreiben. Hier bedienen wir uns
ORDIX News 3/2009
15
Open Source
$vorname = 'Stefan';
$nachname = 'Koch';
$values = array('Lars', 'Korte');
$sql = 'INSERT INTO namen (vorname, nachname) VALUES (?, ?)';
$stmt = $dbh->prepare($sql);
$stmt->bindParam(1, $vorname);
$stmt->bindParam(2, $nachname);
$stmt->execute();
$stmt->execute($values);
Abb. 4: Einfügen von Daten in die Datenbank mit Hilfe eines Prepared Statement.
$sql = 'SELECT * FROM namen';
$stmt = $dbh->prepare($sql);
$stmt->execute();
while ( $row = $stmt->fetch(PDO::FETCH_ASSOC) ) {
print_r($row);
print '<br/>';
}
Abb. 5: Datenbankabfrage mit PDO.
class Person {
private $id;
private $vorname;
private $nachname;
public function sagHallo() {
print 'Hallo ' . $this->vorname . ' ' . $this->nachname;
}
}
// [...]
while ( $person = $stmt->fetchObject('Person') ) {
$person->sagHallo();
}
// [...]
Abb. 6: Erfassen eines Datensatzes in einem Objekt.
eines PDOStatement-Objekts, das durch den
Methodenaufruf
$dbh->prepare($sql)
erzeugt wird. In der Abbildung sind zwei Möglichkeiten aufgezeigt, die durch das Fragezeichen definierten Parameter des Prepared
Statement mit Werten zu füllen. Zum einen
kann die bindParam()-Methode des Objekts genutzt werden. Zum anderen können
die Werte direkt als Array an die execute()Methode übergeben werden. Es werden zwei
neue Datensätze in die Tabelle eingefügt.
Transaktionen
In anspruchsvolleren Anwendungen spielt oft
die Transaktionssicherheit bei der Entwicklung eine große Rolle. Tritt bei der Bearbei-
16
ORDIX News 3/2009
tung von Datensätzen, z. B. Einfügen, Aktualisieren oder Löschen, ein Fehler auf, so
sollten die Änderungen nicht in die Datenbank geschrieben werden, um inkonsistente
Datensätze zu vermeiden. PDO ermöglicht
die Nutzung von Transaktionen, sofern diese
durch das angesprochene Datenbanksystem
unterstützt werden. Vor Beginn der Bearbeitung von Datensätzen erfolgt ein Aufruf der
Methode $dbh->beginTransaction(),
um eine Transaktion einzuleiten. Sind bei
der Bearbeitung keine Fehler aufgetreten,
können die Änderungen mit Hilfe der Methode $dbh->commit() in die Datenbank geschrieben werden. Im Fehlerfall wird ein Rollback mit der Methode $dbh->rollback()
durchgeführt und alle Änderungen verworfen,
die während der Transaktion vorgenommen
wurden.
Datenbankabfragen
Die Vorgehensweise bei der Abfrage von Daten ist nahezu identisch mit der Änderung und
ist in Abbildung 5 aufgeführt. Zunächst weisen wir einer Variable $sql das gewünschte SELECT-Statement zu. Daraufhin wird
ein PDOStatement-Objekt erzeugt, das die
Abfrage mittels $stmt->execute() an die
Datenbank sendet. Jetzt bedienen wir uns
der fetch()-Methode des PDOStatementObjekts, um die zurückgelieferten Daten zu
verarbeiten. Die hier verwendete Konstante
PDO::FETCH_ASSOC definiert das Aussehen
des Arrays $row. In diesem Fall wird ein assoziatives Array erzeugt, das die Spaltennamen der Tabelle als Schlüssel besitzt, denen
die Werte zugeordnet sind. Die while-Schleife wird genutzt, weil nicht nur der erste Ergebnisdatensatz, sondern alle, die von dem
SELECT-Statement zurückgeliefert werden,
verarbeitet werden soll. In unserem einfachen
Fall besteht die Verarbeitung nur aus der Ausgabe des $row-Arrays mit den Daten.
Eine weitere, sehr nützliche Möglichkeit ist
die Zuweisung eines Datensatzes zu einem
Objekt. Dies wird in Abbildung 6 verdeutlicht.
Zunächst erstellen wir eine Klasse Person,
deren Attribute den Spaltennamen der Tabelle
entsprechen. Danach verwenden wir die Methode $stmt->fetchObject() und übergeben als Parameter den Namen der Klassen, die die Werte aus der Tabelle aufnehmen
soll. Auf diese Weise kann die Verarbeitung
der Ergebnisdatensätze objektorientiert stattfinden, indem z. B. die Methode sagHallo()
der Klasse aufgerufen wird. Diese kann direkt
auf die Klassenvariablen zugreifen.
Open Source
Fazit
Glossar
Diese Einführung in PDO zeigt, wie einfach
die Handhabung dieser Schnittstelle ist. Dieser Artikel kann bei Weitem nicht alle Details
und Raffinessen aufzeigen, so dass wir zusätzlich auf die Online-Dokumentation unter
[2] hinweisen möchten.
PECL
Die PHP Extension Community Library stellt PHP-Erweiterungen zur
Verfügung, die komplett in C geschrieben sind.
OR-Mapper
Objektrelationales-Mapping (ORM) ist eine Methode in der Softwareentwicklung, um in einer Anwendung, die mittels OOP erstellt wurde,
Objekte in einer relationalen Datenbank abzulegen.
Doctrine
Doctrine ist ein ORM-Framework für PHP5, welches Ähnlichkeiten mit
dem für Java gebräuchlichen ORM Hibernate aufweist.
Propel
Propel ist ein ORM-Werkzeug für PHP5, das auf dem Apache-TorqueProjekt basiert.
SDK
Software Development Kit - Sammlung von Dateien und Programmen,
die zur Erstellung von Anwendungen durch Softwareentwickler benötigt werden.
Voraussetzung ist die Einbindung der datenbankspezifischen PDO-Erweiterung in PHP.
Diese Erweiterungen sind nicht in PHP, sondern komplett in C geschrieben und somit um
einiges performanter als PHP-eigene Schnittstellen.
DSN
Data Source Name - Eine Datenstruktur ähnlich einer URL, die zur
Beschreibung von Zugangsdaten für Datenbanktreiber dient.
Die vielfältige Möglichkeit, Daten abzufragen
und diese sogar in Objekte zu transferieren,
bietet dem Entwickler viel Freiraum.
►► [1] Download einer vorkompilierten pdo_informix.dll
PDO gibt dem Entwickler die Flexibilität, einen Datenbanktausch ohne große Mühe zu
bewerkstelligen. Die komplette Anwendung
muss nicht mehr an die neue Datenbank angepasst werden. Lediglich beim Verbindungsaufbau muss der DSN verändert werden.
Lars Hendrik Korte ([email protected]).
Links
http://www.iiug.org/software/index_all.html#php_pdo_informix
►►
►►
►►
►►
[2] PDO: http://www.php.net/PDO/
[3] Doctrine: http://www.doctrine-project.org/
[4] Propel: http://propel.phpdb.org/
[5] PECL: http://pecl.php.net
Seminarempfehlung: PHP Programmierung Aufbau
►► Informationen/Online-Anmeldung: http://training.ordix.de/seminar.php?nr=445
In diesem Seminar lernen Sie die erweiterten Technologien von PHP kennen und anzuwenden. Hierbei wird der Schwerpunkt auf die Objektorientierung gelegt, mit deren Hilfe sich in PHP5 modulare und flexible Web-Applikationen entwickeln lassen.
Seminarinhalte
•
•
•
•
•
•
•
•
•
Einführung in die objektorientierte Entwicklung mit PHP
Unterschiede zwischen PHP 4 und PHP 5
Klassen und Objekte
SimpleXML
MySQLi und Transaktionshandling
Sicherheit von PHP-Webanwendungen
Session Management
Funktionserweiterungen
Vertiefung der Theorie durch praktische Übungen und Beispiele
Termine
28.09.- 30.09.2009 in Wiesbaden
30.11.- 02.12.2009 in Wiesbaden
15.03. - 17.03.2010 in Wiesbaden
Seminar-ID: P-PHP-02
Dauer: 3 Tage
Preis pro Teilnehmer: 1.190,00 € (zzgl. MwSt.)
Frühbucherpreis: 1.071,00 € (zzgl. MwSt.)
Wir führen unsere Seminare auch jederzeit an einem geeigneten Ort Ihrer Wahl durch und bringen, wenn nötig, auch das entsprechende Equipment
mit. Informieren Sie sich am besten im Internet über unsere Inhouse-Seminare und die mobilen Schulungen: http://training.ordix.de.
ORDIX News 3/2009
17
Aktuell
Larry Ratlos
Larry und sein Excel-/
Datenbank-Problem
Bei der Aufgabe aus der letzten ORDIX News [1] hat Larry leider keine Hilfe von unseren Lesern bekommen� Daher musste er sich dieses Mal selbst helfen� Ein Blick in
die Seminarunterlagen der ORDIX Schulung „Shell, Awk und Sed“ [2] brachte ihm die
Erleuchtung� Die Lösung will Larry Ihnen nicht vorenthalten� Allerdings möchte er sein
Problem doch noch rein mit SQL-Mitteln lösen� Dazu bittet er Sie wieder um Hilfe, denn
ein Problem ist weiterhin offen: Die Hardware-Inventurliste lag nur in Papierform vor
und muss nun komplett neu erfasst werden�
Aus der Datenbank in Excel
Können Sie Larry helfen?
Die Ursache für sein Excel-Problem hatte Larry ja schnell festgestellt: Die Unload-Datei (siehe Abbildung 1) wurde von Excel falsch interpretiert.
Wie sieht die Lösung aus, wenn man die CSVDatei nur mit SQL-Mitteln erzeugt? Schicken
Sie Larry einfach die Lösung, indem Sie den
SQL-Befehl aus der letzten ORDIX News
Ausgabe [1] anpassen.
„Dazu muss ich ja nur \; eliminieren und die
Mehrzeiler für Excel verständlich machen“,
sagt sich Larry. Mehrzeiler in Excel setzt man
einfach zwischen zwei “. Und das hat Larry
mit Hilfe seines Sed- und Awk-Skriptes erreicht (siehe Abbildung 2).
Ihren Lösungsvorschlag freut sich Larry
bis zum 30� September 2009
an kniffel@ordix�de�
Lädt man nun die entstandene Datei (siehe
Abbildung 3), so wird sie völlig richtig in Excel
dargestellt.
610838060;Administration DB\; Teammeeting;08.04.2009;07:30;08.04.2009;16:00;2,0;0 08:30;4;
610838060;Oracle DB^M\
Artikel geschrieben^M\
Hardware Liste;09.04.2009;10:00;09.04.2009;16:00;4,5;
Abb� 1: Die CSV-Datei, wie sie sich z� B� im VI präsentiert�
18
ORDIX News 3/2009
0 06:00;4;
Aktuell
# Ersetzt \; durch &SC& (damit die Feldeinteilung beim awk passt)
# awk mit Feldtrenner ; aufrufen
sed 's/\\;/\&SC\&/g' monatsabrechnung.csv | \
awk -F';' '{
# ersetze ^M\ am Ende einer Zeile durch nichts
gsub(".\\\\$", "", $0)
# Unterschiedliche Behandlung von Zeilen mit 10 Feldern und mit 2 Feldern
# das zweite Feld in "" setzen
if(NF == 10)
{
printf "%s;\"%s\";%s;%s;%s;%s;%s;%s;%s;%s;\n", $1, $2, $3, $4, $5, $6,
$7, $8, $9, $10
}
else
{
# Geht das zweite Feld ueber mehrere Zeilen ...
if(NF == 2)
{
# jetzt vor das 2. Feld ein "
printf "%s;\"%s\n", $1, $2
}
else
{
# Zeilen mit einem Feld sind reine Fortsetzungszeilen
if(NF == 1)
{
printf "%s\n", $1
}
else
{
# haben wir mehr als ein Feld, erstes Feld mit " abschliessen
printf "%s\";", $1
for (i = 2; i <= NF; i++)
printf "%s;", $i
printf "\n"
}
}
}
}' | sed 's/&SC&/;/g' >m_korrekt.csv # &SC& wieder durch ; ersetzen
Abb. 2: Larry´s Sed/Awk-Lösung.
610838060;"Administration DB; Teammeeting";08.04.2009;07:30;08.04.2009;16:00;2,0;0 08:30;4;
610838060;"Oracle DB
Artikel geschrieben
Informix DB";09.04.2009;10:00;09.04.2009;16:00;4,5;
0 06:00;4;
Abb. 3: Die Datei nachdem Larry´s Skript gelaufen ist.
Links
►► [1] Larry Ratlos Rätsel 2/2009:
http://www.ordix.de/ORDIXNews/2_2009/Aktuell/larry_ratlos_22009.html
►► [2] Seminarempfehlung „Shell, Awk und Sed“:
http://training.ordix.de/siteengine/action/load/kategorie/Programmierung/nr/50/index.html
ORDIX News 3/2009
19
Datenbanken
Vorstellung einer Alternative zu Oracle Reports
Crystal Reports Standard Reporting mit HTML und
dynamischem SQL unter Oracle
Dieser Artikel wendet
sich an Oracle-Entwickler
und Report-Entwickler.
Vielfältige Möglichkeiten zur Berichterstellung stellt das Tool Crystal Reports als
Alternative zu Oracle Reports zur Verfügung. Mit wenigen Handgriffen ist es möglich,
einen dynamisch zu konfigurierenden Bericht mit Zugriff auf diverse Datenquellen zu
realisieren. Alle Zutaten, die man hierzu braucht, sind wenige Kentnisse über Crystal
Reports, über simple HTML-Tags und – bei Zugriff auf eine Oracle-Datenbank – über
dynamisches SQL unter Oracle.
Einleitung
Dieser Artikel beschreibt die Möglichkeit der
dynamischen Berichtserstellung mit Crystal
Reports und Nutzung einer Oracle-Datenbank zur Konfiguration und Auswertung von
Daten. Mit Hilfe dieses Reports kann die wesentliche Logik in der Datenbank untergebracht werden. Damit lässt sich die Anzahl zu
erstellender Reports verringern. Dies wiederum verringert die Komplexität und den Pflegeaufwand der benötigten Berichte. Der Datenschutz kann durch eine Rechtevergabe
geregelt werden.
Parametermaske dem Endbenutzer zur Auswahl oder Eingabe von Daten angezeigt. Um
Parameterfelder für den Nutzer auf dem Report „unsichtbar“ zu machen, werden die Rahmen entfernt und die Schriftfarbe auf weiß gesetzt. Die Rahmen der Unterberichte werden
ebenfalls entfernt. Parameterfelder, wie zum
Beispiel Auswahllisten, können unter Crystal
Reports Werte aus einer Selektionsanweisung enthalten. In diesem Fall bietet sich
auch die Möglichkeit an, die in diesem Artikel
beschriebene Funktion zu nutzen.
Vorbereitung
Parameterübergabe an Unterberichte
Für die Umsetzung des in diesem Artikel beschriebenen Reports wird Crystal Reports in
der Version 12 (2008) und Oracle 11g verwendet. Eine Testversion von Crystal Reports
kann unter [2] heruntergeladen werden. Die
Nutzung von Oracle 11g macht die Verwendung von dynamischem SQL und großen Zeichenketten (CLOB) einfacher.
Damit jeder Unterbericht mit den Parametern
des Benutzers arbeiten und spezifische Daten anzeigen kann, wird eine Formel für alle
Unterberichte erstellt (siehe Abbildung 2 und
3). Diese Formel fasst alle Parameter zusammen und dient später der Verknüpfung zu den
Unterberichten. Damit die Verknüpfung erstellt werden kann, muss sich in den Unterberichten jeweils ein Parameter befinden, der
die Parameterwerte aufnehmen kann (siehe
Abbildung 4). Die Parameterwerte werden
beispielsweise mit Pipe „|“ getrennt. Sollte
ein Parameter Listenwerte enthalten, so
kann die Crystal Reports Funktion Join genutzt werden. Sie liefert alle Werte einer Liste,
getrennt mit dem angegebenen Separator:
Join({?PARAMLIST}, ",") // liefert z. B.
Aufbau des Reports
Der Aufbau des Reports ist recht einfach. Wie
Abbildung 1 zeigt, wird für jeden Bereich (Berichtkopf, Seitenkopf, Details, usw.) ein Unterbericht erstellt. Im Berichtkopf werden Parameterfelder hinzugefügt. Diese werden in der
20
ORDIX News 3/2009
Datenbanken
„ListValue1,ListValue2,...“. Ist der gesamte
Parameter-String zusammengefügt, folgt die
Betrachtung der Datenbank.
Zur Datenbankebene
Damit der Report mit Leben gefüllt werden
kann, wird ein Stück PL/SQL-Code auf der
Datenbankseite benötigt. Dies kann entweder eine Prozedur mit REF CURSOR oder
eine PIPELINED FUNCTION sein. In diesem
Artikel wird die Möglichkeit mit PIPELINED
FUNCTION vorgestellt. Die Funktion sollte
so aufgebaut werden, dass sie alle Parameter aus Crystal Reports aufnehmen kann und
eine COLLECTION zurückliefert (siehe Abbildung 5).
Abb. 1: Unterberichte.
Parameter zerlegen
Da alle Parameter als lange Zeichenkette
übergeben werden, muss diese erst zerlegt
werden. Mit Hilfe der einzelnen Parameter
und Parameterwerte kann dann die Logik im
Hauptteil der Funktion gestaltet werden. Für
einen verbesserten Zugriff auf einzelne Parameter werden diese in einem assoziativem
Array gespeichert. Als Beispiel kann hier auf
den PL/SQL-Code in Abbildung 6 zurückgegriffen werden.
Abb. 2: Formel zur Parameterübergabe an Unterberichte.
Zurück zur Funktion
Alle Parameter liegen nun in mundgerechten
Stücken vor und können entsprechend ausgewertet werden. Die Hauptaufgabe der Funktion besteht darin, die Selektionsanweisung für
die Ausgabe der Daten „zusammenzubauen“
und diese dann per PIPE-Anweisung auszugeben. Den Quelltext zur Prozedur finden Sie
unter [1].
Abb. 3: Formeltext.
Crystal Reports und
PIPELINED FUNCTIONS
Wirft man einen Blick zurück in den Report,
fällt auf, dass es noch keine Datenbankverbindung bzw. Felder gibt, die Daten anzeigen
könnten. Geht man nun in einen Unterbericht,
kann über den Datenbankassistenten von
Crystal Reports eine Verbindung zur OracleDatenbank aufgebaut und ein neuer Befehl
hinzugefügt werden. Die Selektion auf eine
PIPELINED FUNCTION ist sehr einfach mit
der Funktion TABLE() zu realisieren. Damit
die Funktion auch mit unseren Parametern ar-
Abb. 4: Berichtskopf - Verknüpfung von Unterberichten.
ORDIX News 3/2009
21
Datenbanken
CREATE TYPE ty_data AS OBJECT
(
nsort NUMBER,
dsort DATE,
vsort VARCHAR2(100),
data1 VARCHAR2(4000)
);
CREATE TYPE ty_data_tab AS
TABLE OF ty_data;
CREATE FUNCTION get_data
(
params IN VARCHAR2 DEFAULT NULL
) RETURN ty_data_tab
PIPELINED
...
CREATE TABLE mitarbeiter
(
mitarbeiternr
NUMBER NOT NULL,
mitarbeitername VARCHAR2(30),
beruf
VARCHAR2(30),
vorgesetzter
NUMBER,
eintrittsdatum DATE,
gehalt
NUMBER,
provision
NUMBER,
abteilungsnr
NUMBER
);
CREATE TABLE abteilung
(
abteilungsnr
NUMBER NOT NULL,
abteilungsname VARCHAR2(30),
niederlassung
VARCHAR2(30)
);
Abb. 5: Verwendete Datenbankobjekte.
DECLARE
TYPE tt_param_list IS TABLE OF VARCHAR2(100)
INDEX BY VARCHAR2(50);
param_list
tt_param_list;
param_string VARCHAR2(100) := 'SQL=STD_REP|' ||
'OPTIONS=1,2,3,4|VON=01.01.2009|BIS=|' ||
'BEMERKUNG=Hallo Welt';
param
VARCHAR2(100);
beiten kann, binden wir sie gleich mit ein (siehe Abbildung 7).
Der Parameter PARAMS muss hier noch
einmal rechts in der Parameterliste erzeugt
werden. Erst dadurch wird der Platzhalter
{?PARAMS} durch den Inhalt des Parameters
PARAMS vor der Ausführung der Query ausgetauscht.
Anzeigefelder im HTML-Format
Da nun die Verbindung zur Datenbank steht,
sollten die Daten auch angezeigt werden.
Dazu wird beispielsweise das Feld „DATA1“
(siehe Abbildung 8) dem Report hinzugefügt.
Wählt man nun für das Feld im Kontextmenü
den Punkt „Feld formatieren“, kann unter der
Tabpage „Absatz“ die Textinterpretation auf
HTML eingestellt werden. Es ist darauf zu achten, welche Schriftart man für dieses HTMLFeld wählt. Soll der angezeigte Text tabellarisch dargestellt werden, empfiehlt sich eine
nichtproportionale Schriftart. Hierdurch können Abstände zwischen Spalten mit Leerzeichen realisiert werden.
HTML im Report
Crystal Reports interpretiert einfache HTMLTags für die Anzeige im Report, wie z. B. <B>
für Bold, <I> für Italic, <U> für Underline,
<FONT> für Schriftart, <PRE> für Darstellung und vorformatierten Text. Das HTML-Tag
<TABLE> wird von Crystal Reports leider nicht
komplett interpretiert. Die Breite einer Spalte
wird gekonnt ignoriert. Dies wäre eine Alternative zum vorformatierten Text mit <PRE>.
BEGIN
END;
Wie der Quelltext [1] zeigt, werden in der
Query für die Detaildaten des Reports schon
einfache HTML-Tags verwendet, z. B. für die
unterschiedliche Einfärbung von Gehältern.
In Abbildung 9 wird die Ausgabe mit diesem
Quelltext dargestellt.
Abb. 6: Zerlegen von Parametern.
Verbesserungen
FOR n IN 1 .. REGEXP_COUNT(param_string, '[^|]+') LOOP
param := REGEXP_SUBSTR(param_string, '[^|]+', 1, n);
param_list(REGEXP_SUBSTR(param, '[^=]+', 1, 1)) :=
REGEXP_SUBSTR(param, '[^=]+', 1, 2);
END LOOP;
//Beispiel für den Berichtkopf
SELECT *
FROM
TABLE(
get_data(
'{?PARAMS}|BEREICH=KOPF'
)
)
Abb. 7: Selektionsbeispiel für den Berichtskopf.
22
ORDIX News 3/2009
Der im Beispiel verwendete Report kann mit einigen Handgriffen komfortabler gestaltet werden. Beispielsweise könnten alle Select-Anweisungen in einer Tabelle gespeichert und je
nach Parameterwerten selektiert und zusammengestellt werden. Crystal Reports unterstützt nicht nur Platzhalter {?PLATZHALTER}
sondern auch Funktionen {@FUNKTION},
die ggf. komplexere Anweisungen ausführen.
Platzhalter für Parameter haben wir schon
Datenbanken
beim Aufruf der PIPELINED FUNCTION kennengelernt. Warum sollte man die Idee einer
Funktion nicht auch unter PL/SQL realisieren.
Anstatt direkt eine SQL-Anweisung auszuführen, könnte erst ein PL/SQL-Quelltext aus
einer Tabelle dynamisch ausgeführt werden.
Eine Bindevariable vom Typ CLOB würde die
auszuführende Query beinhalten und dann
durch die Funktion ausgeführt werden.
Abb. 8: Hinzufügen von Feld DATA1 in Unterbericht BERICHTKOPF.
Fazit
Die angedeutete Lösung zur dynamischen
Berichterstellung mag für komplexe Ausgaben nicht immer das geeignete Mittel sein.
Man erreicht jedoch einen gewissen Standard
für wiederkehrende Reports und eine bessere
Übersicht durch Zentralisierung der Logik in
der Datenbank.
Abb. 9: Beispielausgabe des Reports.
Links
Karsten Fiedler ([email protected]).
►►
►►
►►
►►
[1] http://www.ordix.de/ORDIXNews/3_2009/Datenbanken/crystal_reports.html
[2] http://www.sap.com/solutions/sapbusinessobjects/sme/reporting/index.epx
[3] http://www.sap.com
[4] http://www.oracle.com
Rückblick Chess Classic 2009 in Mainz
ORDIX Open immer erfolgreicher!
Auch dieses Jahr fanden sich vom 27. Juli – 03. August wieder die Welt-Elite des
Schachs und die Nachwuchsspieler in Mainz zusammen, um die ORDIX Open und die
Mini ORDIX Open auszuspielen. Schauplatz war wie in den vergangenen Jahren die
gutbesuchte Rheingoldhalle am Ufer des Rheins.
ORDIX Open
Seit nunmehr 16 Jahren sponsert die ORDIX
AG das gleichnamige Schnellschach-Turnier.
Sieger der ORDIX Open wurde in diesem Jahr
der Aserbaidschaner Shakhryar Mamedyarov
vor Arkadi Naiditsch, Vladimir Akopian und Vugar Gashimov, die sich den 2. Platz teilten.
Mini ORDIX Open
Alexander Donchenko heißt der Sieger der
diesjährigen Mini-ORDIX-Open. Der Elfjährige
zählt zu den größten hessischen Talenten und
setzte sich ohne Niederlage mit 6 Punkten gegen 70 Jugendliche durch. Nach ihm folgen
Dominik Will, Frederik Eigemann und Daniel
Steblin mit jeweils 5,5 Punkten auf dem 2.
Platz.
Im Vordergrund bei dem Mini-Turnier steht
vor allem der Spaß. Allerdings kann man
von denjenigen, die ganz vorne stehen, auch
künftig einiges erwarten. Der Sieger von
2008, Dennis Wagner, ist übrigens in diesem
Jahr Deutscher Meister geworden!
ORDIX Open Sieger 2009,
Shakhryar Mamedyarov.
Mini ORDIX Open Sieger 2009,
Alexander Donchenko
Jens Pothmann ([email protected]).
ORDIX News 3/2009
23
Aktuell
DOAG Konferenz und Schulungstag 2009
ORDIX und coniatos –
ein starkes Gespann
Das Congress Center Nürnberg Ost wird vom 17. bis 19. November 2009 wieder zum
Meeting-Point der Oracle Community. In weit mehr als 300 Fachvorträgen bietet die
DOAG Konferenz + Ausstellung 2009 wieder Oracle-News und praxisnahen Erfahrungsaustausch. ORDIX ist als „Stammgast“ wieder mit zwei Vorträgen und einem Schulungstag dabei. Darüber hinaus präsentiert unser Tochterunternehmen, die coniatos AG aus
Wiesbaden, sein Know-how dieses Jahr erstmalig in zwei weiteren Vorträgen.
Verschlüsselung
Beim Thema Datenschutz gewinnt das Thema „Verschlüsselung“ zunehmend an Wichtigkeit. Unternehmen sind aufgefordert, ihre
sensiblen Daten vor unberechtigten Zugriffen, Manipulation und Missbrauch zu schützen. Eine Methode dafür ist die Verschlüsselung von Daten. Anhand von Demos stellt
Klaus Reimers, Oracle Spezialist der ORDIX
AG, in seinem Vortrag datenbankseitige Verschlüsselungsmethoden im Oracle Umfeld
vor. Dabei werden die Vor- und Nachteile
sowie die Anwendungsmöglichkeiten erörtert und mit Tipps und Tricks aus der Praxis
angereichert. Inhalte des Vortrags sind u. a.
PL/SQL (dbms_obfuscation_tool_kit,
dbms_crypto), transparente Verschlüsselung, RMAN und Data Pump.
„Secure by Default“ in Oracle 11g – Die
sichere Datenbank out-of-the-box?
Dem Thema „Secure by Default in Oracle 11g“
widmet sich Kathleen Hock. Unter „Secure by
Default“ versteht Oracle eine ganze Reihe
von Out-of-the-box-Maßnahmen, welche die
Oracle 11g Datenbank sicherer machen sollen als eine vergleichbare 10g-Installation.
Neben der Vorstellung der „Enhanced default
security settings“ beschäftigt sich der Vortrag mit dem verbesserten Passwortschutz
und -management, der in Oracle 11g ebenfalls standardmäßig zur Verfügung steht. Als
langjährige Oracle-Beraterin beleuchtet Frau
Hock, ob und wie die hier eingeführten Maßnahmen wirklich zu einer Out-of-the-box sichereren Datenbank führen und mit welchem
Aufwand dies für den DBA zu erreichen ist.
IT-Risiken im Griff – Neue Herausforderung für das IT-Management
Abb. 1: Gespannt wartet die Oracle Community auf die Oracle News, die auf der
diesjährigen DOAG Konferenz präsentiert werden.
24
ORDIX News 3/2009
Wie man „IT-Risiken im Griff“ behält, erläutert
Lars Eisenblatt, Vorstand der coniatos AG, in
seinem Vortrag. Das Erkennen und Beherrschen von IT-Risiken zählt als eine der neuen Herausforderungen des IT-Managements.
Durch den pro-aktiven Umgang mit IT-Risiken
sichern Sie die Marktposition oder sogar die
Existenz Ihres Unternehmens nachhaltig und
können die Kosten kontrollieren. Der Vortrag
gibt einen Überblick über dieses interessante
Thema und liefert Methoden und Checklisten,
Aktuell
die bei Identifikation, Bewertung, Umgang
und Beherrschung von Risiken helfen. Zudem
wird aufgezeigt, in welchen IT-Standards Risikomanagement verankert ist.
Link
► [1] Rückblick DOAG Konferenz 2008
http://www.ordix.de/ORDIXNews/1_2009/Aktuell/doag.html
► [2] Oracle Dienstleistungen der ORDIX AG
http://www.ordix.de/Portfolio/Technologien/Datenbanken/oracle.html
„Mit Weitsicht zur Übersicht“ - Agiles
Enterprise Architecture Management
Viele Unternehmen haben mittlerweile erkannt, dass EAM immer wichtiger für den
strategischen Geschäftserfolg wird. Neben
etablierten Frameworks, wie Zachman, FEA
und TOGAF, rücken immer mehr Prozesse
und Verfahrensweisen in den Vordergrund,
um kostengünstiger agieren zu können. In der
Praxis zeigt sich, dass insbesondere Aspekte
des agilen EAM in vielen Anwendungsfällen schneller und effizienter zum Ziel führen.
Matthias Heinl von der coniatos AG, stellt die
aktuellen Weiterentwicklungen aller wichtigen
EAM-Methodiken vor und zeigt, was man mit
agilem EAM erreichen kann.
DOAG Schulungstag
Direkt im Anschluss an die DOAG Konferenz
und Ausstellung lädt Sie die ORDIX AG am
20. November 2009 von 9 bis 16 Uhr zum eintägigen Schulungstag ebenfalls ins CCN Ost
ein. Der Referent, Markus Fiegler, stellt in seinem Seminar das Thema „Objektorientierung
in Oracle“ vor.
► [3] Oracle Seminare: http://training.ordix.de/index_oracle.htm
► [4] DOAG Webseite: http://www.doag.org/konferenz/doag/2009/
► [5] coniatos AG Webseite: http://www.coniatos.de
Oracle unterstützt auch objektorientierte Konzepte wie Vererbung, Polymorphismus und
benutzerdefinierte Konstruktoren. Die Abbildung von komplexen Strukturen und Klassenbeziehungen ist möglich. Objektorientierte
Vorteile, wie Wiederverwendbarkeit, Modularität, Verbesserung der Wartbarkeit und Steigerung der Qualität der Software, können genutzt werden. Den Teilnehmern werden die
Grundprinzipien der Objektorientierung in einer Oracle Datenbank vermittelt. Mehrere Demos zeigen, wie man ein OO-Klassenmodell
in Oracle umsetzt und wie man daraus erzeugte Objekte persistent in einer Datenbank
verwaltet.
Die Teilnahme kostet 450 Euro zzgl. MwSt.
und beinhaltet Pausen-Snack, Mittagessen
sowie Getränke. Buchbar ist das Seminar direkt über die DOAG-Webseite [4].
Stefanie Heither-Bürger ([email protected]).
Besuchen Sie uns auf der DOAG Konferenz + Ausstellung 2009 in Nürnberg� Wir freuen uns auf Sie!
Die Vorträge der ORDIX AG und der coniatos AG im Überblick
IT-Risiken im Griff –
Neue Herausforderung
für das IT-Management
Mittwoch, 18.11.2009
09:00 – 09:45 Uhr
Raum Krakau
Referent: Lars Eisenblatt, coniatos AG
„Mit Weitsicht zur Übersicht“
Agiles Enterprise
Architecture Management Donnerstag, 19.11.2009
10:00 – 10:45 Uhr
Raum Singapur
Referent: Matthias Heinl, coniatos AG
Verschlüsselung
Mittwoch, 18.11.2009
13:00 – 13:45 Uhr
Raum Tokio
Referent: Klaus Reimers,
ORDIX AG
„Secure by Default“ in Oracle 11g –
Die sichere Datenbank out-of-the-box?
Donnerstag, 19.11.2009
10:00 – 10:45 Uhr
Raum Shanghai
Referent: Kathleen Hock, ORDIX AG
ORDIX News 3/2009
25
26
ORDIX News 3/2009
KW 46
KW 45
KW 44
KW 42
KW 41
KW 40
KW 39
KW 38
Nove
KW 46
KW 45
KW 44
KW 43
KW 42
KW 41
KW 40
KW 39
KW 38
KW 36
550,00 €
890,00 €
1.890,00 €
1.290,00 €
1.890,00 €
1.890,00 €
1.990,00 €
1.990,00 €
1.990,00 €
1.990,00 €
1.990,00 €
1.290,00 €
1.990,00 €
1.990,00 €
1.990,00 €
1.290,00 €
1.590,00 €
1.590,00 €
1.290,00 €
1.290,00 €
1.290,00 €
1.290,00 €
1.290,00 €
1.790,00 €
1.990,00 €
1.990,00 €
1.290,00 €
1.590,00 €
1.890,00 €
1.990,00 €
1.290,00 €
1.190,00 €
1.790,00 €
1.690,00 €
1.190,00 €
1.690,00 €
1.690,00 €
1.690,00 €
1.190,00 €
1.190,00 €
890,00 €
1.190,00 €
1.190,00 €
1.690,00 €
1.690,00 €
1.690,00 €
590,00 €
1.290,00 €
1.590,00 €
1.590,00 €
1.590,00 €
1.190,00 €
1.190,00 €
1.690,00 €
1.290,00 €
1.190,00 €
1.190,00 €
1.390,00 €
1.190,00 €
1.690,00 €
1.690,00 €
1.190,00 €
1.290,00 €
1.490,00 €
1.990,00 €
1.990,00 €
1.990,00 €
1.990,00 €
1.290,00 €
890,00 €
1.990,00 €
1.290,00 €
590,00 €
1.190,00 €
1.190,00 €
890,00 €
1.990,00 €
1.850,00 €
1.100,00 €
1.650,00 €
1.290,00 €
1.650,00 €
1.100,00 €
1.650,00 €
1.990,00 €
1.650,00 €
1.650,00 €
1.100,00 €
KW 37
KW 36
KW 37
September 2009 - Februar 2010
Datenbanken
Datenbank-Hochverfügbarkeitslösungen für Entscheider
Datenbank-Modellierung
Oracle SQL
Oracle SQL für Experten
Oracle Datenbankprogrammierung mit PL/SQL Grundlagen
Oracle Datenbankprogrammierung mit PL/SQL Aufbau
Objekt-Orientierung in Oracle
Oracle Datenbankadministration Grundlagen
Oracle Datenbankadministration Aufbau
Oracle Backup und Recovery
Oracle Tuning und Monitoring
Analyse und Interpretation von Oracle AWR und ASH
Oracle Troubleshooting Workshop
Oracle Real Application Cluster (RAC)
Oracle 11g Neuheiten
Oracle Security
Oracle Data Guard
Oracle RMAN
Oracle Grid Control
Oracle Streams Advanced Queuing
Oracle Replikation
Oracle Migration und Patching
Oracle Capacity Planning
IBM Informix SQL
IBM Informix Dynamic Server Administration
IBM Informix Dynamic Server Tuning und Monitoring
IBM Informix Dynamic Server Backup und Recovery
IBM Informix Dynamic Server Hochverfügbarkeits-Technologien unter Unix
IBM DB2 für Linux/Unix/Windows SQL Grundlagen
IBM DB2 für Linux/Unix/Windows Administration
IBM DB2 für Linux/Unix/Windows Monitoring, Tuning
MySQL Administration
Microsoft SQL Server Administration
Programmierung
PHP Programmierung Grundlagen
PHP Programmierung Aufbau
Perl Programmierung Grundlagen
Perl Programmierung Aufbau
Shell, Awk und Sed
AWK Intensiv-Workshop
Einführung in XML
XML Programmierung unter Java mit DOM und SAX
Oracle und XML
Java-JEE
Einführung in die objektorientierte Programmierung
Java Programmierung Grundlagen
Java Programmierung Aufbau
Java GUI Entwicklung mit Swing
JEE für Entscheider
Einführung in JEE
JSP und Servlet Programmierung
EJB Programmierung
Web-Anwendungen mit JavaServer Faces (JSF)
Entwickeln mit dem Spring-Framework
Java Web Services
Hibernate und die Java Persistence API
Java Performance Tuning
Web- und Applikations-Server
Apache Web-Server Installation und Administration
Tomcat Konfiguration und Administration
WebSphere Application Server Installation und Administration
Administration und Konfiguration für JBoss
Betriebssysteme
Unix/Linux Grundlagen für Einsteiger
Linux Systemadministration
Server-Virtualisierung mit XEN
Linux Hochverfügbarkeits-Cluster
OpenLDAP - Praxiseinsatz im Netzwerk
Solaris Systemadministration Grundlagen
Solaris Systemadministration Aufbau
Solaris kompakt für erfahrene Unix-Administratoren
Solaris 10 für erfahrene Systemadministratoren
Solaris Containers
Zettabyte Filesystem (ZFS) Workshop
IBM AIX Systemadministration Grundlagen
IBM AIX Installation, Backup und Recovery
IPv6 für Entscheider
IPv6 für Systemadministratoren
Systemmanagement
Systemüberwachung mit Nagios Grundlagen
Systemüberwachung mit Nagios Aufbau
Projektmanagement
IT-Projektmanagement
Systemisches Projektmanagement
Krisenmanagement in Projekten
IT-Controlling Grundlagen
IT-Projektcontrolling in der Praxis
IT-Management
IT-Architekturen
E-Business
Systemische Strategieentwicklung
IT-Management
IT-Risikomanagement
IT-Prozessmanagement
Konfliktmanagement
Oktober
September
Preis in
Euro *)**)
KW 43
Seminartermine
Seminartermine
KW 8
KW 7
KW 6
KW 5
KW 4
Februar
KW 3
KW 2
KW 1
KW 53
KW 51
KW 50
KW 49
KW 48
KW 47
Januar
KW 52
Dezember
ember
September 2009 - Februar 2010
ORDIX AG
Kreuzberger Ring 13
65205 Wiesbaden
Tel.: 0611 77840-00
http://training.ordix.de
Informationen und Anmeldung
ORDIX AG
Westernmauer 12 - 16
33098 Paderborn
Tel.: 05251 1063-0
zentrales Fax: 0180 1 ORDIX 0
bzw. 0180 1 67349 0
E-Mail: [email protected]
Online-Anmeldung: http://training.ordix.de
Für Informationen und Fragen zu individuell zugeschnittenen
Seminaren, Ausbildungsreihen oder Inhouse-Schulungen
stehen wir Ihnen gerne zur Verfügung. Auf Wunsch senden
wir Ihnen auch unser komplettes Seminarprogramm zu.
Online-Anmeldung und stets aktuelle
Seminarinhalte und Termine!
Seminartermin in Wiesbaden
Seminartermin in Bielefeld (IPS)
KW 8
KW 7
KW 6
KW 5
KW 4
KW 3
KW 2
KW 47
KW 1
KW 53
KW 52
KW 51
KW 50
KW 48
KW 49
*) Preise pro Seminar pro Teilnehmer in Euro.
Alle Preise gelten zzgl. ges MwSt.
**) Inhousepreise auf Anfrage.
ORDIX News 3/2009
27
Datenbanken
MS SQL Server 2008 New Features (Teil III)
FILESTREAM - Eine performante
Speicherung umfangreicher Binärdaten
Dieser Artikel richtet sich an
Administratoren von Microsoft
SQL Servern sowie an Datenbank-Entwickler, die sich einen
Überblick über die hinzuge­
kommenen Funktionalitäten
der neuen Version verschaffen
möchten.
Große Binärdateien, wie beispielsweise umfangreiche Dokumente, Musik- oder VideoDateien, werden häufig auf Dateiservern in Verzeichnisstrukturen gespeichert. Diese
Speicherart ist übersichtlich und bietet eine gute Performance beim Zugriff auf die Inhalte. Wer jedoch eine Transaktionssteuerung für den konfliktfreien Zugriff auf Daten
benötigt, speichert die Inhalte in BLOB-Feldern in einer Datenbank. Hierbei muss jedoch mit Performance-Nachteilen gerechnet werden.
Die neue Option FILESTREAM des SQL Servers 2008 bietet nun die Möglichkeit, beide Technologien miteinander zu kombinieren: Transaktionssteuerung durch TransactSQL und hohe Performance durch eine Win32-API für den Zugriff auf die im Dateisys­
tem gespeicherten Datenbankinhalte.
28
ORDIX News 3/2009
Vorbereitungen
Einrichtung der Datenbank
FILESTREAM muss nicht separat installiert,
nur aktiviert werden: Entweder direkt bei der
Installation oder später im Konfigurationsmanager (siehe Abbildung 1). Zusätzlich ist die Instanz noch mit der Prozedur sp_configure
zu konfigurieren (siehe Abbildung 2). Der Parameter bestimmt dabei den Zugriffsmodus:
0 = deaktiviert
1 = nur Transact-SQL-Zugriff
2 = zusätzl. E/A-Streaming-Zugriff (Win32-API)
Zur Speicherung wird eine spezielle Datei­
gruppe angelegt. Diese enthält keine Dateien
sondern nur Verzeichnisse. In diesen Verzeichnissen werden dann die Inhalte gespeichert und durch den SQL Server verwaltet.
Die angegebenen Verzeichnisse werden vom
SQL Server angelegt und konfiguriert. Sie
dürfen daher vorher noch nicht existieren (sie­
he Abbildung 3).
Datenbanken
Erstellung einer Tabelle
Um die FILESTREAM-Daten zu verwalten,
werden in der Tabelle zwei Spalten benötigt. Zum einen eine Spalte vom Datentyp
UNIQUEIDENTIFIER, die mit der Option
ROWGUIDCOL angelegt wird und die später
im Dateisystem abgelegten Daten eindeutig
referenziert. Zum anderen eine Spalte vom
Datentyp VARBINARY(MAX), die mit der Option FILESTREAM versehen wird und für den
Zugriff auf die Daten mit Transact-SQL dient.
Wenn mehrere FILESTREAM-Dateigruppen
angelegt wurden, gibt die Tabellen-Option
FILESTREAM_ON an, in welcher Dateigruppe
und damit in welchem Verzeichnis die Daten
abgelegt werden sollen (siehe Abbildung 4).
Zugriff über Transact-SQL
Die Daten können mit normalen SQL-Befehlen bearbeitet werden. Texte (VARCHAR-Daten) müssen dabei mit CAST in den Datentyp
VARBINARY konvertiert werden. So legt der
in Abbildung 5 angegebene Befehl eine erste
Zeile in der Tabelle und damit eine erste Datei
im Dateisystem an.
Der SQL Server baut automatisch eine entsprechende Verzeichnisstruktur auf (siehe
Abbildung 6). So steht die erste Verzeichnisebene (54f3f625 ...) für die Tabelle und
die zweite Verzeichnisebene (01397ed0 ...)
für die Spalte. Der Dateiname ist die Log-Sequenz-Nummer (LSN) zum Zeitpunkt der Datenänderung.
Zugriff über die Win32-API
Für den Zugriff über die Win32-API wird ein
UNC-Pfad verwendet, der mit der Funktion
PathName() ermittelt werden kann (siehe
Abbildung 7). Über diesen Pfad kann z. B. mit
Hilfe einer C#-Applikation auf die Daten zugegriffen werden. Diese Art des Zugriffs soll hier
jedoch nicht weiter erläutert werden. Ein Beispiel finden Sie unter der [2].
Abb. 1: Nachträgliche Aktivierung der FILESTREAM-Option im Konfigurations­
manager.
EXEC sp_configure filestream_access_level, 2
RECONFIGURE
Abb. 2: T-SQL-Befehle zur Aktivierung der FILESTREAM-Option.
ALTER DATABASE beispiel
ADD FILEGROUP fs_group CONTAINS FILESTREAM;
ALTER DATABASE beispiel
ADD FILE (NAME = fs_dir, FILENAME = 'c:\db\fs_dir')
TO FILEGROUP fs_group;
Abb. 3: Erweiterung einer vorhandenen Datenbank um eine FILESTREAMDateigruppe mit einem FILESTREAM-Verzeichnis.
CREATE TABLE beispiel..dokumente
( id
UNIQUEIDENTIFIER ROWGUIDCOL
, name
VARCHAR(100)
, dokument VARBINARY(MAX) FILESTREAM
, CONSTRAINT dokumente_pk PRIMARY KEY (id)
) FILESTREAM_ON fs_group;
Abb. 4: Anlegen einer Tabelle mit einer FILESTREAM-Spalte zur Speicherung
der Dokumente.
Performance-Aspekte
Welche Zugriffsart gewählt werden sollte,
hängt von der Datengröße ab. Bis zu BLOBGrößen von etwa einem MB ist der Zugriff
über Transact-SQL schneller. Danach ist der
Zugriff über die Win32-API wesentlich effi­
zienter. Daher ist es wichtig, dass die Applika-
INSERT INTO beispiel..dokumente (id, name, dokument)
VALUES (NEWID(), 'Lebenslauf',
CAST('Geboren im schönen Berlin' AS VARBINARY(MAX)));
Abb. 5: Speicherung eines Dokumentes.
ORDIX News 3/2009
29
Datenbanken
tion diese Zugriffsart unterstützt, wenn dieser
Performance-Vorteil genutzt werden soll.
Sicherheitsaspekte
Die Dateien liegen unverschlüsselt im Dateisystem. Sie sind lediglich geschützt durch die
Datei- und Verzeichnisrechte des Betriebssystems. Diese werden vom SQL Server bei
der Einrichtung der Verzeichnisse so gesetzt,
dass nur das Dienstekonto des SQL Servers
sowie die lokalen Administratoren Zugriff haben.
Abb. 6: Ablage des Dokumentes im Dateisystem.
Wichtig ist in diesem Zusammenhang, dass
das Löschen von Dateien innerhalb der Verzeichnisse zu einer korrupten Datenbank führen kann.
Arbeiten mit Transaktionen
Abb. 7: Die Funktion PathName() liefert einen UNC-Pfad zum Dokument für
den Zugriff durch die Win32-API.
Glossar
LSN
UNC-Pfad
Log Sequence Number (oder Protokollfolgenummer). Die LSN ist eine
für jede Datenbanktransaktion eindeutig und aufsteigend vergebene
Nummer.
Uniform Naming Convention (auch Universal Naming Convention)
wird weitgehend als Standard zur Bezeichnung von Adressen freigegebener Ressourcen in einem Rechnernetz genutzt. Die UNC-Adresse stellt einen Netzwerkpfad dar, über den man Ressourcen anderer
Rechner in dem Netzwerk ansprechen und nutzen kann.
Link
Im Rahmen von Transaktionen werden die
FILESTREAM-Daten genauso wie alle anderen Daten behandelt. Wird der Wert einer
FILESTREAM-Spalte geändert, so wird nicht
die zugehörige Datei verändert, sondern eine
neue Datei mit dem neuen Inhalt angelegt.
Zusätzlich werden alle Änderungen im Transaktionsprotokoll vermerkt. Die alte Datei wird
erst dann entfernt, wenn ihr Inhalt nicht mehr
für Recovery-Zwecke benötigt wird. Dies ist
bei der Planung des benötigten Festplattenplatzes zu berücksichtigen.
Fazit
Verwaltet die Applikation große, sich nur selten ändernde Datenmengen, bei denen es auf
schnellen Lesezugriff ankommt, z. B. VideoStreaming-Applikationen, so stellt die FILESTREAM-Option eine gute Alternative zur
klassischen Speicherung der Daten in BLOBFeldern dar. Voraussetzung ist allerdings,
dass die Applikation die Win32-API verwenden kann.
►► [1] Designing and Implementing FILESTREAM Storage:
http://msdn.microsoft.com/en-us/library/bb895234.aspx
►► [2] Managing FILESTREAM Data by Using Win32:
http://msdn.microsoft.com/en-us/library/cc645940.aspx
►► [3] FILESTREAM Storage in SQL Server 2008
(Whitepaper von Paul S. Randal):
http://msdn.microsoft.com/en-us/library/cc949109.aspx
►► [4] Blog-Einträge von Paul S. Randal zum Thema FILESTRAM:
http://www.sqlskills.com/BLOGS/PAUL/category/FILESTREAM.aspx
Andreas Jordan ([email protected]).
30
ORDIX News 3/2009
Java/JEE
Spring 3.0:
Der Frühling geht in
die Verlängerung!
Mittlerweile ist bereits der dritte Meilenstein von Spring 3.0 erreicht worden. Das Team
von SpringSource beschäftigt sich fleißig mit der Fertigstellung des ersten Release
Candidate. Es ist somit an der Zeit, um einen Blick auf die Neuerungen von Spring 3.0
zu werfen.
Einleitung
Als Integrationsframework der Wahl trennt
sich Spring in der dritten Generation von einigen Altlasten. Der Core wurde auf die Basis von Java 5 gebracht, wodurch die Typensicherheit durch die neue Spring-API genutzt
werden kann. Java 1.4 bleibt damit außen vor.
Erweiteter Support für Annotations und die
neue Spring Expression Language (SpEL)
zeigen ebenfalls ihre Stärken. Für das WebUmfeld stehen REST, Portlet 2.0 und die Konversationsverwaltung im Mittelpunkt. Der Aufbau der Spring-Bibliotheken hat sich ebenfalls
verändert.
Dieser Artikel richtet
sich an Java-Entwickler und
Architekten, die einen
kompakten Überblick über
die Neuerungen von Spring 3.0
erhalten möchten.
Annotations definieren und konfigurieren.
In der Praxis hat sich die Verwendung von
Annotations generell durchgesetzt und daher
hat sich bei Spring auch hier einiges getan.
Gerade bei der Verwendung von JUnit oder
anderen Test-Frameworks gibt es ein großes
Einsparpotenzial, wenn es um die Testvorbereitung geht: Die Ausgangssituation muss
schnell geschaffen sein. Meist kommen im
Test nur wenige Spring-Beans zum Einsatz.
Annotations sind „in”
Gültige Objekte werden mit Hilfe von Spring
generell über den Application Context erzeugt.
Zur Vereinfachung bieten sich in Testklassen aber vor allem folgende Annotations an:
@RunWith, @ContextConfiguration und
@Autowired bzw. @Resource.
Die Konfiguration von Spring über Annotations wurde mit Spring 2.5 eingeführt. Dadurch kann man Spring-Beans mittels Java-
Die Abbildung 1 zeigt eine kleine Testklasse, die genau diese Annotations verwendet. Mit @RunWith wird zunächst die gene-
ORDIX News 3/2009
31
Java/JEE
Neue Ausdrucksweise für Spring
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"/applicationContext.xml"})
public class ServerConnectorTest {
@Resource(name = "connector1")
private Connector connector1;
@Resource(name = "server1")
private Server server1;
@Resource(name = "connector2")
private Connector connector2;
@Resource(name = "server2")
private Server server2;
@Resource(name = "connectorMock")
private ConnectorMock connectorMock;
@Test
public void testConnect() {
// ohne EL
System.out.println("Connector: " + connector1);
System.out.println("Server: " + server1);
server1.open();
connector1.connect2server();
// mit EL
System.out.println("Connector: " + connector2);
System.out.println("Server: " + server2);
server2.open();
connector2.connect2server();
// Mock mit Default-Wert
System.out.println("ConnectorMock: " +
connectorMock);
connectorMock.connect2server();
}
}
Abb. 1: Die Testklasse erzeugt den ApplicationContext über Annotations und
vereinfacht dadurch das Laden der Beans.
Connector:
127.0.0.1:8001
Server:
127.0.0.1:8001
Listener opened on:
127.0.0.1:8001
Connection to server established: 127.0.0.1:8001
Connector:
127.0.0.1:8002
Server:
127.0.0.1:8002
Listener geöffnet:
127.0.0.1:8002
Connection to server established: 127.0.0.1:8002
ConnectorMock:
127.0.0.1:8002
Connection to server established: 127.0.0.1:8002
Abb. 2: Die Konsolenausgabe der Testklasse ServerConnectorTest.
relle Spring-Unterstützung aktiviert. Durch
@ContextConfiguration wird die zu verwendende Spring-Konfiguration bestimmt.
Instanzvariablen können dann über den Namen (@Resource) oder über den Datentyp
(@Autowired) gefüllt werden. Die Ausgabe
auf der Konsole können Sie der Abbildung 2
entnehmen.
Mit der SpEL wurde auch die Annotation
@Value eingeführt. Hierauf werfen wir im
nächsten Abschnitt einen detaillierten Blick.
32
ORDIX News 3/2009
Die ersten Anregungen für die Unterstützung
der Expression Language liegen schon lange
zurück (05.12.2003). Im Wesentlichen geht
es darum, dass Ausdrücke zur Laufzeit ausgewertet werden, was die Flexibilität der Anwendung erhöht. Dies kennt man bisher bereits von JSP oder JSF.
XML-basiserte Konfiguration
Bisher war es beispielsweise ein Problem,
bestimmte Werte in der Spring-Konfiguration
mehreren Beans zuzuweisen. Eine Möglichkeit war die Erstellung einer String-Bean und
deren Injektion in andere Beans, wie es Abbildung 3 zeigt. Diese Vorgehensweise ist zwar
funktional, aber nicht unbedingt elegant. Hinzu kommt, dass ein Verknüpfen von Werten
ebenfalls nicht möglich ist.
Die SpEL hingegen erlaubt einen Zugriff auf
die Werte von anderen Spring-Beans. Dazu
wird dem Ausdruck ein # vorangestellt und
der Wert in geschweiften Klammern angegeben (#{bean-id.property}). In Abbildung 3 ist dies im Zusammenhang mit einer
Verknüpfung von zwei dynamischen Werten
und einer festen Zeichenkette zu sehen. Die
Bean mit der ID connector2 bekommt also
die folgende Zeichenkette injiziert:
127.0.0.2:8002
Vorbelegt ist von Spring bereits die Variable
systemProperties. Damit können die entsprechenden Werte einfach über die Angabe
des Namens in eckigen Klammern abgefragt
werden. Abbildung 3 zeigt die Abfrage der Systemsprache bei der Spring-Bean server2.
Eigene Werte können beim Start der JVM
über die Option –D an das Programm übergeben werden.
Annotation-basiserte Konfiguration
Weitaus interessanter wird die Verwendung
der SpEL in Annotations. Diese haben nämlich grundsätzlich den Nachteil, dass eine Änderung immer ein Rekompillieren erfordert.
Spring 3.0 führt für die Nutzung der SpEL die
@Value-Annotation ein. Hierdurch können
Properties von Spring-Beans beispielsweise
mit Default-Werten belegt werden. Werden die
Properties also nicht explizit über die SpringKonfiguration gesetzt, so werden die Standardwerte der @Value-Annotation verwendet.
Das Beispiel zeigt dies bei der Konfiguration
der ConnectorMock-Bean. Es wird hier keine Property innerhalb der Spring-XML-Datei
gesetzt, sondern die connectionUrl be-
Java/JEE
kommt die Bean über die @Value-Annotation.
Achten Sie darauf, dass der gesetzte Wert im
Default-Konstruktor durch Spring überschrieben wird.
Neu strukturiert ans Werk
Bisher gab es von Spring eine zentrale Biblio­
thek, die spring.jar. Diese enthielt bisher alle
Klassen des Spring-Frameworks und wurde nun aufgesplittet. Entsprechend der Paketstruktur bietet sich einem nun der folgende
Aufbau:
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
org.springframework.aop.jar
org.springframework.aspects.jar
org.springframework.beans.jar
org.springframework.context.jar
org.springframework.context.support.jar
org.springframework.core.jar
org.springframework.expression.jar
org.springframework.instrument.jar
org.springframework.instrument.
classloading.jar
org.springframework.integration-tests.jar
org.springframework.jdbc.jar
org.springframework.jms.jar
org.springframework.orm.jar
org.springframework.oxm.jar
org.springframework.test.jar
org.springframework.transaction.jar
org.springframework.web.jar
org.springframework.web.portlet.jar
org.springframework.web.servlet.jar
Wenn bisher auch die Bibliotheken von Fremdanbietern mitgeliefert wurden, setzt Spring ab
jetzt auf Technologien wie Maven oder OSGi,
um Abhängigkeiten automatisch aufzulösen.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context=
"http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/
spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/
spring-context-2.5.xsd">
<context:annotation-config />
<!-- Server und Connector ohne SpEL -->
<bean id="ip" class="java.lang.String">
<constructor-arg value="127.0.0.1" />
</bean>
<bean id="port" class="java.lang.Integer">
<constructor-arg value="8001" />
</bean>
<bean id="server1"
class="de.ordix.on.spring.services.Server">
<constructor-arg ref="ip" />
<constructor-arg ref="port" />
</bean>
<bean id="connector1"
class="de.ordix.on.spring.services.Connector">
<constructor-arg ref="ip" />
<constructor-arg ref="port" />
</bean>
<!-- Server und Connector mit SpEL -->
<bean id="server2"
class="de.ordix.on.spring.services.Server">
<constructor-arg value="127.0.0.1" />
<constructor-arg value="8002" />
<property name="language"
value="#{ systemProperties['user.language'] }" />
</bean>
<bean id="connector2"
class="de.ordix.on.spring.services.Connector">
<constructor-arg
value="#{ server2.ip + ':' + server2.port }" />
</bean>
<bean id="connectorMock"
class="de.ordix.on.spring.test.mock.ConnectorMock" />
</beans>
Fazit
Abb. 3: Konfiguration von Spring mit und ohne SpEL.
Die elementaren Neuigkeiten fallen für den
Außenstehenden in die Bereiche Expression
Language, Erweiterung der Annotations und
der neue Aufbau der JAR-Struktur. Unter der
Haube wurde die Java-Version auf Java 5 angehoben und einige Funktionen wurden auf
„Deprecated“ gesetzt. Ein Wechsel auf die
aktuelle Version sollte aber in den meisten
Fällen recht leicht sein. Das SpEL-Beispiel
können Sie übrigens unter folgender Adresse
herunterladen [1].
Links
►► [1] SpEL-Beispiel:
http://www.springsource.com
Thomas Rohde ([email protected]).
ORDIX News 3/2009
33
Datenbanken
Oracle Real Application Cluster (RAC) 10g (Teil IV)
Failover und Load Balancing
Der Artikel richtet sich an
Datenbankadministratoren und
Entwickler, die Oracle RAC
aufsetzen und betreiben
möchten.
Nach Beleuchtung einiger technischer Details der Architektur von Oracle RAC in den
bisherigen Artikeln dieser Reihe [1 - 3] ist festzustellen, dass die technischen Voraussetzungen sowohl für die Hochverfügbarkeit als auch für die Skalierbarkeit der Datenbank geschaffen sind. In diesem Artikel werden nun die Vorteile der RAC-Architektur
– das Loadbalancing und die Failover-Mechanismen – beschrieben. Den „Preis”, den
man hierfür zahlen muss, ist jedoch eine nicht zu unterschätzende Komplexität.
Zusammenfassung RAC-Architektur
Die ersten drei Teile dieser Reihe [1 – 3] befassten sich mit der RAC-Architektur. Hier
wurden die Anforderungen und technischen
Details vom Betriebssystem-Layer bis hin
zum Storage Management Layer dargestellt
(siehe Abbildung 1).
Durch die Verwendung von virtuellen IPAdressen und dessen Übernahme im Fail­
over-Fall wird sichergestellt, dass immer mindestens ein Cluster-Knoten erreichbar ist.
Allerdings muss die RAC-Architektur deutlich
mehr leisten als nur die Übernahme der virtuellen IP-Adressen. Neben dem verteilten
Speichermanagement (Cache Fusion) muss
jede RAC-Instanz auch in der Lage sein, das
Instanz-Recovery von anderen Instanzen zu
übernehmen. Das bedeutet, im Fall eines
Instance Crash muss die überlebende Instanz
sofort aus den Online Redo Logs der abgestürzten Instanz ein Crash Recovery durchführen.
Die Skalierbarkeit der RAC-Architektur basiert
auf dem dynamischen Hinzunehmen und Entfernen von Knoten aus dem System. So können quasi Speicher und CPUs von Servern
zusammengefasst werden.
Vorteile für die Anwendung
Welche Vorteile ergeben sich nun für die Anwendung? Zum einen wird die Verfügbarkeit
verbessert, da beim Ausfall eines Clus­ter-Kno­
34
ORDIX News 3/2009
tens alle Sessions auf die oder den „überlebenden” Knoten reconnected werden können. Zum anderen besteht die Möglichkeit, die
Leistung zu steigern, da RAC über die Grenzen eines physikalischen Rechners skalieren
kann.
Failover und Load Balancing werden nun im
Einzelnen dargestellt.
Failover
Das Failover sollte für die Anwendung möglichst transparent sein. Das bedeutet, der Anwender sollte keine oder nur eine kurze Unterbrechung wahrnehmen. RAC unterscheidet
die folgenden Failover-Methoden.
Connect Time Failover
Mit der Konfiguration des CONNECT TIME
FAILOVER wird sichergestellt, dass der Client
eine Verbindung zur Datenbank aufbauen
kann, wenn ein funktionsfähiger Knoten des
RAC-Systems den gewünschten Net-Service
zur Verfügung stellt.
Entscheidend ist dabei, dass zumindest die
Verbindung zu einem laufenden Listener-Prozess aufgenommen werden kann. Dieser entscheidet dann, welcher Knoten den in der Verbindungsdefinition genannten Servicenamen
bedient. Zu diesem Zweck müssen alle vorhandenen virtuellen Adressen des Knotens in
der Adressliste angegeben und der Zusatzpa-
Datenbanken
Node:
ORACLE 1
Node:
ORACLE 2
Cache Fusion
SGA
DBWR
LGWR
SGA
...
DBWR
LGWR
...
DB
Oracle RAC 10g
RDBMS Layer
Oracle ASM, Cluster File-System, RAW Devices
Storage Management
Layer
evtl. 3rd Party Volume Manager
Volume Manager Layer
evtl. 3rd Party Clusterware
Oracle Clusterware
OS/Netzwerk
Clusterware Layer
OS/Netzwerk Layer
Storage Layer
Abb� 1: Darstellung des Oracle RAC Hard-/Software Stacks�
rameter FAILOVER definiert werden. Bei einer
Verbindungsaufnahme wird dann diese Liste
der Adressen durchprobiert, bis eine Verbindung zur Datenbank zustande kommt (siehe
Abbildung 2).
Session Time Failover (TAF)
Mit der Oracle-Eigenschaft TAF (Transparent
Application Failover) kann auch eine FailoverFunktionalität bei bestehender Verbindung
mit der Datenbank realisiert werden. TAF ermöglicht bei einem Knotenausfall den unbemerkten Übergang einer Session auf einen
anderen Knoten.
Hierbei bestehen jedoch einige Einschränkungen, die von der Applikation adäquat behandelt werden müssen. Zum einen werden bestehende, noch nicht mittels commit
bestätigte Transaktionen abgebrochen, da
Transaktionen immer an die ausführende Instanz gebunden sind.
Zum anderen werden Einstellungen zur aktuellen Session (alter session ...),
ebenso bei der Datenbankinstanz, gehalten
und gehen bei dem Übergang verloren (siehe
Abbildung 3).
Definiert wird TAF durch den Bereich FAILOVER_MODE in der TNS-Alias-Definition.
Abhängig von den Einstellungen der Parameter kann das Failover-Verhalten gesteuert
werden. Maßgebend dabei sind die Parameter in Abbildung 4.
zen =(DESCRIPTION=
(FAILOVER=ON)
(LOAD_BALANCE=OFF)
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=tcp)(HOST=ying)(PORT=1521))
(ADDRESS=(PROTOCOL=tcp)(HOST=yang)(PORT=1521))
)
(CONNECT_DATA=(service_name=zen)))
Abb. 2: Beispielkonfiguration zum Client-side CONNECT TIME FAILOVER.
zen_taf=(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = ying)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = yang)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = prod )
(FAILOVER_MODE = ( TYPE=SELECT)
( METHOD=BASIC)
( RETRIES=20)
( DELAY=30))))
Abb. 3: Beispiel einer TAF-Konfiguration.
Load Balancing
Ziel des Load Balancing ist es, die Kapazitäten
des RAC-Systems bezüglich des Hauptspeichers und der CPU-Zeit möglichst effektiv
zu nutzen. Die Gesamtlast soll gleichmäßig
über den Cluster verteilt werden. Erreicht
wird dies entweder durch Einstellungen
auf dem Server/Listener (Server-side Load
ORDIX News 3/2009
35
Datenbanken
TYPE = SESSION
TYPE = SELECT
METHOD = BASIC
METHOD = PRECONNECT
BACKUP = TNS_ALIAS
RETRIES = ANZAHL und
DELAY = SEKUNDEN
Aktuelle Abfragen werden abgebrochen.
Ein aktuell laufendes SELECT-Statement wird über
die neue Verbindung noch einmal ausgeführt. Die
Rückgabe des Resultsets des Statements wird an
der richtigen Stelle fortgeführt.
Bei dieser Standardmethode wird die Verbindung
zur Failover-Instanz erst im Failover-Fall aufgenommen.
Im Gegensatz zur BASIC-Methode werden die Verbindungen zu den anderen Knoten des Systems
beim Connect erstellt und in Reserve gehalten.
Dadurch wird bei einem Failover der Overhead der
Verbindungaufnahme vermieden, sodass es zu einer schnelleren Weiterführung der Session kommt.
Nachteilig ist natürlich der damit verbundene Overhead an Prozessen und der Hauptspeicherverbrauch.
Hier kann ein TNS-Alias einer Backup-Instanz angegeben werden. Bei einem Failover wird dann auf
diese Instanz bzw. TNS-Alias-Definition gewechselt.
Definition des zeitlichen Verhaltens bei erneuter
Verbindungsaufnahme, also wie oft und mit welchem Abstand wird ein neuer Connect versucht.
Abb. 4: Parameter-Einstellungen zur Steuerung des Failover-Verhaltens.
zen=(DESCRIPTION=
(FAILOVER=on)
(LOAD_BALANCE=on)
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=tcp)(HOST=ying)(PORT=1521))
(ADDRESS=(PROTOCOL=tcp)(HOST=yang)(PORT=1521))
)
(CONNECT_DATA=(service_name=zen)))
Abb. 5: Auszug aus einer Client TNSNAMES.ORA:
Client-side Load Balancing durch den Paramenter Load Balance.
LISTENERS_APACHE =(ADDRESS_LIST =
(ADDRESS = (PROTOCOL...)(HOST = vip_srv01)(PORT...))
(ADDRESS = (PROTOCOL...)(HOST = vip_srv02)(PORT...))
)
Abb. 6: Auszug aus einer Server TNSNAMES.ORA:
Eintragung der Remote Listener.
REMOTE_LISTENER = LISTENERS_APACHE
Abb. 7: Datenbankparameter: Zuweisung des TNS-Alias für Remote Listener
erfolgt über den Parameter REMOTE_LISTENER.
36
ORDIX News 3/2009
Balancing) oder durch Einstellungen beim
Client in der TNS-Spezifikation (Client-side
Load Balancing).
Client-side Load Balancing
Das Client-side Load Balancing wird in der
TNSNAMES.ORA des Clients mit dem Parameter LOAD_BALANCE eingestellt. Steht
LOAD_BALANCE auf on, so wird die Liste von
Adressen in einer zufälligen Reihenfolge abgearbeitet, bis eine erfolgreiche Verbindung
hergestellt werden kann. Dies führt zu einer
fast gleichmäßigen Verteilung neuer Verbindungen auf die Clusterknoten, allerdings ohne
Berücksichtigung des aktuellen Zustands bzw.
der Last der Server (siehe Abbildung 5).
Server-side Load Balancing
Neben der Möglichkeit, das Load Balancing
beim Client zu realisieren, kann das Load
Balancing auch auf der Server-Seite konfiguriert werden. Wird diese Funktionalität genutzt,
entscheidet der Listener, mit welcher Instanz
des Knotens der Client verbunden werden
soll. Die Entscheidungskriterien werden bei
dem Listener und der Datenbankinstanz konfiguriert. Einerseits muss die Datenbank die
aktuellen Werte der verwendeten Kriterien
an den eigenen Listener weitergeben. Andererseits müssen sich die Listener aller Knoten miteinander unterhalten können, um diese Kriterien zu vergleichen und entsprechend
über die zu wählende Instanz entscheiden.
•
•
LOCAL_LISTENER
Der Parameter LOCAL_LISTENER definiert, wie die Datenbankinstanz den eigenen Listener erreicht. Werden für den
Listener die Standardvorgaben wie Listenername = LISTENER, HOST = localhost,
PORT = 1521 verwendet, kann dieser Parameter ausgelassen werden.
REMOTE_LISTENER
Hier wird eine Liste von Adressen an den
lokalen Listener weitergegeben, mit der
dieser seine Partner auf den anderen
Knoten ansprechen und deren Informationen über Auslastung der Instanzen abfragen kann (siehe Abbildung 6 und 7).
Die Einstellung des Server-side Load
Balancing erfolgt über den Aufruf der Routine dbms_service. Mittels der PL/SQLProzedur dbms_service.modify_service
können die Eigenschaften des Load Balancing modifiziert werden. Der Parameter
Datenbanken
clb_goal gibt an, welches Kriterium als Basis für das Load Balancing genutzt werden
soll (LONG, SHORT). Der Parameter goal
stellt ein, ob Load Balancing verwendet und
in welcher Form es auf Basis der Serverlast
gestaltet wird (siehe Abbildung 8).
Wichtige Parameter des PL/SQL Packages
dbms_service.modify_service werden
in Abbildung 9 beschrieben.
Load Balancing
aufgrund der Verbindungsanzahl
Wird für den Parameter clb_goal der Wert
long gewählt, so wird das Load Balancing
auf Basis der Anzahl der aktuell vorhandenen
Verbindungen auf den einzelnen Knoten gemacht. Die Verbindungen werden gleichmäßig auf die Instanzen verteilt. Diese Einstellung zielt u. a. auf Applikationsserver, die
einen Verbindungspool zur Datenbank mit
lang bestehenden Verbindungen aufbauen
und selbst die Anfragen auf diese Verbindungen verteilen.
dbms_service.modify_service( service_name => 'zen_srv' , goal =>
dbms_service.goal_throughput , clb_goal =>
dbms_service.clb_goal_long );
Abb. 8: Beispiel für die Einstellung des Server-side Load Balancing.
•
•
GOAL => dbms_service.none
Mittels der Einstellung none wird das Server-side Load Balancing ausgeschaltet
und damit dem Client überlassen.
GOAL => dbms_service.service_time /
GOAL => dbms_service.throughput
Mittels diesen Einstellungen kann die Art der Lastvermittlung definiert werden.
Mit der Einstellung throughput dient der Durchsatz der Knoten (Transaktionen pro Sekunde) als Lastkriterium, ansonsten wird die Antwortzeit auf Anfragen verwendet.
Abb. 9: Wichtige Parameter des PL/SQL-Packages
dbms_service.modify_service.
Glossar
Load Balancing
aufgrund der Serverlast
Wird der Parameter auf den Wert short eingestellt, wird erwartet, dass Verbindungen zur
Datenbank nur kurzfristig existieren und direkt
nach der Verbindungsaufnahme Aktionen auf
die Datenbank durchgeführt werden. Diese
werden dann auf dem aktuell am wenigsten
belasteten Knoten ausgeführt. Das Lastprofil der Datenbank wird regelmäßig durch die
Datenbankinstanzen ermittelt und an die
Listener weitergegeben. Abhängig vom Parameter goal entscheiden dann entweder
die Antwortzeiten oder der aktuelle Durchsatz der Instanzen, welche Knoten verwendet
werden.
TAF
Transparent Application Failover. Automatischer Session Failover einer Datenbank-Session. Für die Anwendung verhält sich der Failover
transparent. Sessions werden z. B. bei einem Ausfall eines Knotens
auf einen anderen Knoten reconnected.
Load Balancing
Mechanismus zur Lastverteilung von Aufgaben auf mehrere Komponenten eines Systems, meist eines Clusters.
Links
►► [1] ORDIX News Artikel „Load Balancing und Ausfallsicherheit”:
http://www.ordix.de/ORDIXNews/3_2007/Datenbanken/oracle_rac_teilI.html
►► [2] ORDIX News Artikel „OS/Netzwerk und Clusterware-Layer”:
http://www.ordix.de/ORDIXNews/4_2007/Datenbanken/oracle_rac_teil2.html
►► [3] ORDIX News Artikel „Automatic Storage Management”:
Fazit
http://www.ordix.de/ORDIXNews/3_2008/Datenbanken/Oracle_RAC_ASM.html
Erst wenn alle vorgestellten Einstellungen
und Konfigurationen auf dem Client und auf
Seite des Clusters beachtet werden, können die vollen Möglichkeiten der RAC-Technologie genutzt werden. Durch das Failover
erreicht man eine hohe Ausfallsicherheit der
Datenbankverbindung und durch das Load
Balancing können die Kapazitäten des Gesamtsystems effektiver genutzt werden.
Klaus Garstecki ([email protected]).
ORDIX News 3/2009
37
Datenbanken
Projektbericht: Erstellung einer Standard Oracle Umgebung (SOU)
Automatisierung und Standardisierung
von Oracle Installationen
Dieser Artikel richtet sich an
Datenbankadministratoren, die
die Installation von Datenbanken
standardisieren und teilweise
automatisieren möchten.
Die Installation und Konfiguration von Datenbanken ist meist eine zeitraubende und
monotone Arbeit. Die Software wird installiert, die Datenbank manuell oder über ein
grafisches Frontend eingerichtet und anschließend erfolgt die Individualisierung nach
Wünschen des Kunden bzw. den Anforderungen der Applikation. Einen unternehmensweiten Standard gibt es nur selten, was dazu führt, dass die Datenbanken unterschiedlich installiert und konfiguriert sind: Angefangen vom Installationsverzeichnis über die
Ablage der Datenbankdateien bis zur Einrichtung von benötigten Cronjobs.
Anforderungen
In kleinen Unternehmen mit nur einem oder
wenigen Datenbankadministratoren fällt das
zumeist nicht so sehr auf, so lange Konstanz
bei der personellen Besetzung besteht. In
einem global agierenden Unternehmen z. B.
mit einem „follow the sun“ Support, bei dem
der Support vom jeweiligen lokalen Team
tags­über übernommen wird, erschwert dies
jedoch die Administration und Pflege der Datenbanken ungemein. Im Fall eines kritischen
Fehlers verstreicht wertvolle Zeit, bis sich der
jeweilige Mitarbeiter auf dem Server zurechtfindet, bevor überhaupt mit der Analyse begonnen werden kann.
Ein weiterer Punkt, der in einem großen Unternehmen zu unnötigen Kosten führt, ist die
manuelle Installation. Die Anforderung nach
neuen Instanzen, und sei es nur zu Testzwecken, werden fast wöchentlich von den Applikationsteams an die IT-Infrastruktur gestellt.
Daraus lassen sich die folgenden Anforderungen für einen globalen Standard ableiten:
•
•
•
44
ORDIX News 3/2009
Einheitliche Struktur
Einheitliche Namenskonventionen
für Datenbanken und Services
Automatische Installation und Einrichtung
•
•
•
•
von Datenbanken on demand
Möglichkeit zur parallelen Installation auf
mehreren Servern
Generierung einer einheitlichen Umgebung
(Shell, Login Profile, Shell Aliase, etc.)
Auslieferung von Standard „DBA Skripten“
für alltägliche Aufgaben (z. B. Skripte für
Backup, Monitoring, Housekeeping, etc.)
Bereitstellung von Startup- und ShutdownSkripten
SOU ist Definitionssache
Aus diesen Gründen werden bei einem unserer Kunden globale Standards für nahezu
den gesamten Software-Stack definiert. Sie
sind die Grundlage für die anschließende
technische Umsetzung. In Abbildung 1 ist der
Aufbau einer SOU zu erkennen. Wer sich ein
wenig im Sybase-Umfeld auskennt, wird hier
einige Parallelen wiederfinden. Dies hat den
Hintergrund, dass die Standard Oracle Umgebung in Anlehnung zu einer bereits standardisierten Sybase-Umgebung erstellt wurde.
Daher könnten einige Namensgebungen (z. B.
dumps oder devices) in Bezug zum OracleKontext etwas befremdlich wirken.
Eine Datenbank wird grundsätzlich einem
Projekt zugeordnet. Das Projekt wird über
Datenbanken
ein n-stelliges Kürzel identifiziert und ist der
Einstiegspunkt in die Struktur. Jedes Projekt
erhält ein eigenes ORACLE_HOME-Verzeichnis. Dadurch sind im Falle einer PatchEinspielung nur die Datenbank(en) des jeweiligen Projekts betroffen.
Neben diesen essentiellen Vorgaben, existieren weitere Richtlinien für die Benennung der
Datenbanken und der abhängigen Services.
Am Beispiel wird nun gezeigt, wie die oben
genannten Ziele erreicht werden konnten.
Vorbereitungen
Um die Anforderungen der Oracle-Installation
zu erfüllen, wird initial ein „Prepare Package“
erstellt. Dieses legt den Benutzer oracle
und die Gruppe dba an, setzt Kernel Parameter sowie die Shell Limits und hinterlegt die
SSH-Konfiguration, um den Login über einen
zentralen Login Server zu ermöglichen.
Unter Solaris wird zusätzlich ein Service eingerichtet, der die Datenbankkomponenten beim
Hochfahren startet bzw. beim Herunterfahren
stoppt.
/opt/oracle/TST
dumps/FFTST01D/backups -rman Backupsets
dumps/FFTST01D/exports -export dumps
dumps/FFTST01D/loads -import dumps, z. B. für Schema Refresh
dumps/FFTST01D/keeps -export dumps, die über einen längeren Zeitraum zur Verfü-­
gung stehen sollen
dumps/FFTST01D/dp_exports -Data Pump Exports
dumps/FFTST01D/audit_exports -Export der Audit Einträge aus aud$
devices/FFTST01D/db01 -Datafiles der FFTST01D Datenbank
devices/FFTST01D/arc01 -Archivelog der FFTST01D
Datenbank
devices/ClusterWare -Verzeichnis zur Aufnahme der Quorum und Voting Disk im Falle einer RAC Installation
dba/autosys -Autosys Skripte
dba/etc -Konfigurationsdateien für die DBA Skripte
dba/local -Verzeichnis für lokale Skripte
dba/logs -Logfiles vom Aufruf der DBA- Skripte
dba/skripts -DBA Skript Sammlung (versio-
niert und aktualisierbar)
autostart -Startup- / Shutdown Skripte
admin/network/admin -Oracle Net Konfigurations-
dateien
admin/network/log -Oracle Net Logfiles
admin/network/trace -Oracle Net Tracefiles
admin/FFTST01D/bdump -Datenbank bdump Verzeichnis
admin/FFTST01D/cdump -Datenbank cdump Verzeichnis
admin/FFTST01D/udump -Datenbank udump Verzeichnis
admin/FFTST01D/config -Konfigurationsdatei der
Standard Oracle Umgebung
Die technische Sicht
Die SOU selbst ist eine Ansammlung von
Shell-Skripten, die nach unterschiedlichen
Themen unterteilt sind. Ein zentrales Wrapper-Skript (STOra_setup) ist die Schnittstelle
zum Benutzer bzw. zum Tivoli Provision Manager (TPM), doch dazu später mehr.
Die Installation selbst besteht bei einer Standard Umgebung aus 4 Schritten. Ein Schritt
gruppiert dabei mehrere Shell-Skripte, die
einzelne Aufgaben erledigen (siehe Abbildung 2). Die Prepare-Phase der Installation
überprüft zunächst, ob alle Bedingungen für
die Installation der SOU erfüllt sind. Im Prinzip
wird hier getestet, ob das Prepare Package
und die damit verbundenen Komponenten installiert sind. Anschließend wird die einheitliche SOU-Verzeichnisstruktur erstellt und die
DBA-Skriptsammlung abgelegt.
Die letzte Aufgabe ist nun die Erstellung des
Res­ponse Files, dass für die Silent-Installation
der Datenbank-Software benötigt wird. Sollte
es bei einer Aufgabe zu einem Problem kommen, wird der Benutzer darüber informiert. Er
hat nun die Chance, den Fehler zu beheben
und die Installation erneut zu starten. Dabei
wird automatisch wieder an der Stelle auf-
Abb. 1: Die Verzeichnisstruktur einer Standard Oracle Umgebung.
1-Prepare.a.pre_install_checks
1-Prepare.b.create_goto
1-Prepare.c.install_dba_environment
1-Prepare.d.create_install_directories
1-Prepare.e.create_oraInstloc
1-Prepare.f.create_response_file
2-Software_Install.a.run_installer
2-Software_Install.b.check_oratab
2-Software_Install.c.set_file_permissions
3-Configure.a.create_links
3-Configure.b.create_initora
3-Configure.c.set_orapwd
3-Configure.d.setup_listener
3-Configure.e.create_db
3-Configure.f.create_spfile
3-Configure.g.setup_login_security
3-Configure.h.create_autosys_jil_skript
3-Configure.i.registerserver
4-Apply_CpuPatch.a.pre_install_checks
4-Apply_CpuPatch.b.shutdown_services
4-Apply_CpuPatch.c.run_opatch
4-Apply_CpuPatch.d.post_install_tasks
4-Apply_CpuPatch.e.post_install_checks
4-Apply_CpuPatch.f.startup_services
Abb. 2: Die einzelnen Schritte der Installation werden über Shell-Skripte umgesetzt.
ORDIX News 3/2009
45
Datenbanken
Customize Me!
STOra_setup -T [Prepare | Software_Install | Configure | Apply_CpuPatch]
-C
-P
-S
-V
Komponente, in diesem Fall „Database“
Projektkürzel, z. B. „TST“
Name der Datenbank
Umgebungsversion, z. B. „EE_10.2.0“
Abb. 3: Aufrufe des Wrapper-Skripts STOra_setup.
# Vorlage für die zentrale Konfigurationsdatei: database.cfg
# Diese Datei sollte erstellt werden, bevor der Schritt
# Software_Install durchgeführt wird
# Database Parameter
DATABASE.CHARACTER_SET=WE8ISO8859P15
DATABASE.NATIONAL_CHARACTER_SET=AL16UTF16
DATABASE.NO_OF_LOGFILEGROUPS=3
DATABASE.SIZE_OF_LOGFILEMEMBER_IN_MB=50
# init.ora Parameter
INITORA.open_cursors=300
INITORA.shared_pool_size=10M
# [ ... ]
Hierfür existiert eine zentrale Konfigurationsdatei, deren Aufbau in Abbildung 4 gezeigt
ist. Hier kann z. B. direkt zu Beginn der Installation die Größe der SGA dimensioniert
werden, falls die Default-Werte nicht ausreichend sein sollten. Im Prinzip darf jeder beliebige Initialisierungsparameter verändert werden, solange dieser nicht der SOU-Struktur
widerspricht. Die Ablage von Control- und archivierten Redologdateien über die Parameter log_archive_dest_[1-9] und control_files
dürfen beispielsweise daher nicht angepasst
werden und würden abgewiesen.
Abb. 4: Die zentrale Konfigurationsdatei erlaubt die Anpassung der Datenbank
bis zu einem gewissen Grad.
SOU hits TPM
gesetzt, an der der Fehler aufgetreten ist.
Die dafür nötige Logik ist im Wrapper-Skript
STOra_setup implementiert.
Die zweite Phase wird mit dem Schritt
Software_Install eingeläutet. Hier wird
ausschließlich die Datenbank-Software installiert. Anhand einer Konfigurationsdatei
und der Benutzerangabe wird entschieden,
welche Datenbankversion aufgespielt wird.
Die „Configure“ Phase umfasst dann das eigentliche Aufsetzen der Datenbank (create
database) und die jeweiligen Nachbereitungen, wie z. B. das Erstellen des spfiles, die
Konfiguration der listener.ora, das Implementieren von diversen Security Policies und das
anschließende Registrieren der Datenbank
im zentralen Repository des Unternehmens.
Der vierte Schritt ist optional und installiert
den aktuellen CPU-Patch.
Somit sind für die Installation maximal vier
Aufrufe des Wrapper-Skripts nötig, jeweils mit
dem entsprechenden Task (-T <Task>), um
die Software zu installieren und eine Datenbank aufzusetzen (siehe Abbildung 3).
Es gibt weitere Parameter, die spezifiziert
werden können, die für diese Betrachtung jedoch nicht entscheidend sind.
46
Neben dieser Default-Installation ist es auch
erlaubt, bestimmte Eigenschaften der Datenbank vor der Installation zu konfigurieren.
Dazu zählen z. B. der Zeichensatz der Datenbank und/oder die Anzahl der Redolog-Gruppen.
ORDIX News 3/2009
Um der SOU nun ein schickes Äußeres zu
verpassen und die Bedienung weiter zu vereinfachen, wurde diese in den Tivoli Provision
Manager (TPM) integriert.
Unser Kunde setzt eine angepasste Oberfläche des TPM ein, die eine effizientere Bedienung ermöglicht. Durch die Anbindung
an das zentrale Host Repository kann nun
im Webbrowser über wenige Schritte der
zu bespielende Server ausgewählt werden.
Selbstverständlich können auch hier sämtliche Eigenschaften der Datenbank vom Benutzer festgelegt werden. Sind die Informationen vollständig, sorgt TPM für den Aufruf der
Skripte.
Eine weitere Interaktion seitens des Benutzers ist nun nicht mehr erforderlich. Das Aufspielen der Software und das Installieren der
Datenbank läuft selbstständig im Hintergrund.
Die Ausgabe der Skripte und eventuelle Fehlermeldungen können im Browser-Fenster bei
Bedarf betrachtet werden. Über TPM ist es so
auch möglich, direkt mehrere Server parallel
zu bespielen, was den Aufwand für den einzelnen DBA nochmals erheblich reduziert.
SOU wird erwachsen
Neben der Oracle Standard Umgebung exis­
tieren eine ganze Reihe von weiteren Standardisierungen, die die in der Einleitung ge-
Datenbanken
nannten Kriterien erfüllen. Dieses gilt nicht
nur im Datenbankbereich, sondern auch für
die Betriebssystemebene. So kann ein Server
in sehr kurzer Zeit komplett bespielt und an
das Applikationsteam übergeben werden.
Durch neue Anforderungen sind mittlerweile
weitere Komponenten in die SOU eingeflossen. So kann neben der Datenbank auch ein
vollständiger Oracle Unix Client und das Ausrollen von Oracle Grid Control Agenten über
eine Standard-Installation eingeleitet werden.
Komplettiert wird die SOU durch die automatische Installation der Clusterware auf einer
beliebigen Anzahl von Knoten als Voraussetzung für den Einsatz von Oracle RAC.
Abb� 5: Prozentualer Anteil der Datenbanken, die SOU-konform aufgesetzt
sind�
Fazit
Durch die Einführung eines standardisierten
Verfahrens zum Aufsetzen von Datenbanken
konnten viele Vorteile gewonnen werden. Der
„follow the sun“ Support findet in jeder Lokation dieselbe Struktur vor. Das Aufsetzen von
neuen Datenbanken ist nun keine Tagesaufgabe mehr. Auch das Patchen von Instanzen,
die standardisiert eingerichtet sind, wurde
vereinfacht. Zudem ist die Installation von
Datenbanken für eingekaufte Anwendungen
hierdurch vereinheitlicht worden.
Die Anzahl der Datenbanken die nun SOUkonform sind, lag zum Ende des Projekts bei
40 % (siehe Abbildung 5).
([email protected]).
Seminarempfehlung: Oracle Datenbankadministration Grundlagen
► Informationen/Online-Anmeldung: http://training�ordix�de/seminar�php?nr=35
In diesem Seminar werden Sie mit der Verwaltung und Analyse von Oracle Datenbanken vertraut gemacht. Da die Grundlage aller administrativen
Tätigkeiten das gute Verständnis der Oracle Architektur ist, werden Sie intensiv in den Aufbau und die Struktur eingeführt. Somit sind Sie in der
Lage, grundlegende Administrationen der Datenbank vorzunehmen. Das Seminar wird sowohl unter Windows als auch unter Unix gehalten.
Seminarinhalte
•
•
•
•
•
•
•
•
•
•
•
Grundlagen: Die Oracle Architektur, das Data Dictionary
Installation eines Datenbanksystems
Datenbankverwaltung: Anlegen einer Datenbank, Verwalten
von Datenbankstrukturen (Tablespaces, Datafiles, Logfiles,
Controlfiles)
Instancehandling: Startup/Shutdown
Grundlagen Backup und Recovery: Sicherungskonzept,
Rekonstruktion einer Datenbank
Benutzerverwaltung, Zugriffsschutz, Password-File
Verteilte Datenbanken: Database Links
Einführung in die Konfiguration von Oracle Net
Tools: DataPump, Export, Import, SQL*Loader
National Language Support (NLS)
Vertiefung der Theorie durch praktische Übungen und Beispiele
Termine
16.11. - 20.11.2009 in Wiesbaden
30.11. - 04.12.2009 in Wiesbaden
18.01. - 22.01.2010 in Wiesbaden
Seminar-ID: DB-ORA-03
Dauer: 5 Tage
Preis pro Teilnehmer: 1.990,00 € (zzgl. MwSt.)
Frühbucherpreis: 1.791,00 € (zzgl. MwSt.)
Wir führen unsere Seminare auch jederzeit an einem geeigneten
Ort Ihrer Wahl durch und bringen, wenn nötig, auch das entsprechende Equipment mit. Informieren Sie sich am besten im Internet über unsere Inhouse-Seminare und die mobilen Schulungen:
http://training.ordix.de.
ORDIX News 3/2009
47
Java/JEE
Performance-Tests mit Hibernate (Teil III)
Lazy und Eager Loading – ein guter
Cache lädt nicht mehr als er muss
Dieser Artikel richtet sich an
Softwareentwickler- und
architekten, die Hibernate
performant einsetzen möchten.
Müssen wir beim Laden von Objekten in den Cache wirklich jedes mal alle Objekte
laden? Gibt es nicht eine Möglichkeit, nur die Objekte zu laden, die auch gebraucht
werden? Diesen Fragen widmen wir uns in diesem Artikel und untersuchen, welche
Möglichkeiten Hibernate bietet und welche Auswirkungen fehlerhafte Einstellungen
auf die Performance haben können.
Einleitung
Nachdem wir uns zu Beginn der Artikelreihe
mit dem First Level, Second Level und Query
Cache von Hibernate auseinandergesetzt haben [1], wurde im 2. Teil der Reihe der Easy
Hibernate Cache näher unter die Lupe genommen [2]. Als Grundlage für diesen Artikel
dient erneut das altbekannte Klassenmodell
aus dem 1. Artikel (siehe Abbildung 1).
Mal träge, mal eifrig ...
Um in Hibernate-Objekte in den Cache zu laden, existieren die folgenden zwei Zugriffsarten.
•
•
Lazy Loading
(engl. „träges Laden“): Bei dieser Zugriffsart hält Hibernate (englisch „Winterschlaf“)
wahrlich einen Winterschlaf, weil das Objekt nicht sofort in den Cache geladen wird,
sondern erst beim Zugriff auf Objekteigenschaften nachgeladen bzw. Hibernate aus
seinem Winterschlaf geweckt wird.
Eager Loading
(engl. „eifriges Laden“): Bei dieser Methode wird Hibernate aus dem Winterschlaf
geweckt, weil die Objekte sofort vollständig geladen werden.
Lazy Loading –
der „träge“ Nachzügler
Beim Auslesen von persistenten Objekten
benutzt Hibernate als Default für alle Entities
und Collections eine Lazy Fetching Strategie.
48
ORDIX News 3/2009
Dabei werden bei Verwendung eines Proxies
nur die Objekte in den Cache geladen, nach
denen eine Abfrage gestartet wurde. Ein
Proxy ist ein Platzhalter, der zur Laufzeit generiert wird. Ein sinnvolles Beispiel für Lazy
Loading ist eine Auswertung aller Vorlesungen, ohne dass dabei die Dozenten und
Studenten geladen werden müssen.
In Abbildung 2 wird dies anhand eines Beispiels veranschaulicht. Zunächst wird mit
Hilfe der Methode load() über einen Identifikator eine Vorlesung geladen. In Hibernate
steht nach diesem Aufruf allerdings kein Vorlesungsobjekt im Cache. Stattdessen wird ein
Proxy erstellt, das als „leeres“ Objekt verstanden werden kann. Der Proxy besitzt jedoch
außer einem Identifikator noch keine Daten.
Wenn ein Zugriff über die Getter-Methoden
auf die Objekteigenschaften stattfindet, wird
ein SQL-Statement generiert und die Objekt­
eigenschaften werden nachgeladen.
Der Aufruf der Methode getId() löst hingegen
keinen Datenbankzugriff aus, weil für Identifikatoren keine Initialisierung des Proxies nötig
ist. Ein Datenbankzugriff findet erst statt, wenn
die Methode getName() in Zeile 3 ausgeführt
wird und somit auf die Objekteigenschaften zugegriffen wird. Weiterhin ist zu beachten, dass
immer ein Datenbankzugriff stattfindet, wenn
Annotations auf direkten Feldzugriff gemappt
werden (siehe Abbildung 3).
Eager Loading –
der „eifrige“ Vorarbeiter
Proxies bieten sich bei Objekten an, dessen
Objekteigenschaften nicht immer gebraucht
Java/JEE
werden. Aber es gibt auch Situationen, in denen Daten direkt komplett in den Cache geladen werden sollen, ohne dass weitere Datenbankzugriffe stattfinden (Eager Loading).
Ein Beispiel ist, dass beim Laden eines Vorlesungsobjekts auch direkt das Objekt des Dozenten und des Lehrstuhls mitgeladen werden
soll. Abbildung 4 zeigt das Vorlesungsobjekt,
das ohne Generierung eines Proxies gespeichert worden ist. Mit der Methode get()
wurde eine Möglichkeit beschrieben, die ein
Nachladen der Objekteigenschaften auslöst.
Mit der Annotation @Proxy(lazy=false)
ist es möglich, die Proxy-Generierung für eine
bestimmte Klasse zu deaktivieren (siehe Abbildung 5).
Assoziationen Eager und Lazy fetchen
In dem Klassendiagramm existiert eine Vielezu-Eins-Beziehung zwischen den Objekten
Vorlesung und Dozent, sowie eine Einszu-Eins-Beziehung zwischen den Objekten
Dozent und Lehrstuhl. Assoziationen können ebenfalls Lazy oder Eager geladen werden. Das hängt davon ab, ob mit einem Objekt
auch die in Beziehung stehenden Objekte sofort in den Cache geladen werden oder nicht.
In Hibernate werden Beziehungen standardmäßig Lazy geladen. Durch Deaktivierung
der Proxy-Generierung für das Objekt Vorlesung, werden die Objekte Dozent und
Lehrstuhl Eager geladen (siehe Abbildung
4). Es ist möglich, die Fetching-Strategien für
Assoziationen zu verändern, indem in der Parameterliste der Annotation die Fetching-Strategie festgelegt wird (siehe Abbildung 6). In
diesem Beispiel wird die Viele-zu-Eins-Beziehung Lazy und die Viele-zu-Viele-Beziehung
Eager geladen.
Abb. 1: Klassenmodell des Beispielprojekts.
1Vorlesung vorlesung = (Vorlesung) session.load(Vorlesung.class , id) ;
2vorlesung.getId() ;
3vorlesung.getName();
Abb. 2: Verwendung eines Proxies.
1 @Column(name="Name")
2 public String name
Abb. 3: Direkter Feldzugriff.
Eager und Lazy Loading mit Hibernate
Query Language (HQL)
Mit HQL ist ebenfalls die Unterscheidung zwischen Lazy und Eager Loading möglich. Die
Methoden list() und find() verwenden
die Eager Fetching Strategie, während die
Methode iterate() dem Lazy Fetching-Ansatz entspricht.
Die Methode list() verfolgt folgenden Ansatz: Nachdem die HQL-Anfrage auf der Datenbank ausgeführt wurde, werden die Ergebnismengen in eine Java-Liste gespeichert.
Dabei wird das Objekt vollständig in den
Cache geladen. Im Cache werden die erstell-
ten Objekte mit dem Cache-Inhalt geprüft.
Existiert das Objekt bereits im Cache, wird es
nicht aktualisiert. Wenn das Objekt nicht im
Cache vorhanden ist, wird es dort gespeichert.
Die find()-Methode verfolgt den gleichen
Ansatz, liefert das Ergebnis jedoch in einem
unsortierten Java Set zurück. Die Methode iterate() gibt die gleichen Daten wie
list() zurück, ermittelt aber nur die Objektidentifikatoren der Trefferobjekte. Wenn
bereits ein Objekt im Cache vorhanden ist,
wird es aus dem Cache geladen. Andernfalls
wird ein Proxy generiert.
ORDIX News 3/2009
49
Java/JEE
•
•
•
Anzahl der gefundenen Vorlesungen in der
Datenbank: 500
Aktive Caches: First Level Cache
Fetching-Strategie: Viele-zu-Viele und
Viele-zu-Eins-Beziehung Lazy
Es werden zwei Durchläufe gestartet. Beim
ersten Durchlauf wird mit HQL die Methode
list() verwendet (Eager Loading), beim
zweiten Durchlauf die Methode iterate()
(Lazy Loading). Nach 50 Abfragen findet ein
Zugriff auf die Objekteigenschaften von Vorlesung, Dozent und Lehrstuhl statt.
Trägheit kann bestraft werden
Abb. 4: Vorlesungsobjekt.
1
2
3
4
@Entity
@Table(name = "VORLESUNG")
@Proxy(lazy=false)
public class Vorlesung {...}
Abb. 5: Proxy deaktivieren.
1 @ManyToOne(fetch = FetchType.LAZY)
2 public Dozent getDozenten() {return dozenten;}
1 @ManyToMany(fetch = FetchType.EAGER)
2 public Collection<Student> getStudenten() {return studenten;}
Abb. 6: Fetching-Strategien ändern.
Links
[1] ORDIX News Artikel „Performance-Tests mit Hibernate (Teil I)“:
http://www.ordix.de/ORDIXNews/3_2008/Java_J2EE_JEE/Performance_steigern_
Query_Cache.html
[2] ORDIX News Artikel „Performance-Tests mit Hibernate (Teil II)“:
http://www.ordix.de/ORDIXNews/2_2009/Java_JEE/easy_hibernate_cache.html
Um die Auswirkungen der Fetching-Strategien zu untersuchen, wird im Folgenden ein
Szenario beschrieben und die Ergebnisse
ausgewertet.
Wie in Abbildung 7 zu erkennen ist, benötigt
die Strategie Lazy Loading mit durchschnittlich 3 ms für die ersten 50 Anfragen gegenüber Eager Loading mit 46 ms weniger Zeit für
eine Abfrage. Für die restlichen Abfragen benötigt Lazy Loading durchschnittlich 1218 ms
und Eager Loading wieder 46 ms.
Beim Eager Fetching werden alle Vorlesungen
und alle zugehörigen Objekte zusammen
mit einem einzigen Select-Statement in den
Cache abgelegt. Die Lazy Loading-Strategie
selektiert nur den Identifikator der Vorlesung
und generiert Proxies für die Beziehungen.
Dadurch wird die Datenmenge reduziert, die
aus der Datenbank gelesen wird. Aus diesem
Grund ist Lazy Loading bei den ersten 50
Durchläufen schneller als Eager Loading.
Nach 50 Abfragen wird auf die Objekteigenschaften zugegriffen. Beim Eager Fetching
sind die Daten bereits vorhanden. Beim
Lazy Loading müssen hingegen nachträglich alle Objekt­eigenschaften nachgeladen
werden. Dabei selektiert ein Select-Statement die Objekteigenschaften der Vorlesung
mit dem Identifikator. Danach wird ein weiteres Select-Statement erzeugt, das die Objekteigenschaften des Dozenten und des
Lehrstuhls lädt. Dieser Vorgang wird für alle
gefundenen Vorlesungen wiederholt (n+1
selects-Problem) und ist somit wesentlich in­
effizienter als die Strategie Eager Loading.
Fazit
Szenariobeschreibung
•
•
50
ORDIX News 3/2009
Datenbankabfrage mit HQL: Selektiere alle
Vorlesungen, die „Hibernate“ heißen.
Iteration der Abfragen: 100
Bevor man sich für eine der beiden Strategien
entscheidet, sollte man sich vorher Gedanken
darüber machen, ob es sinnvoll ist, alle Objekteigenschaften in den Cache zu laden oder
ob ein Platzhalter ausreichend ist.
Java/JEE
Werden die Objekteigenschaften häufig gebraucht, ist es sinnvoll die Eager-Strategie
anzuwenden, weil dadurch ein Zugriff auf die
Datenbank vermieden wird und man sich das
Nachladen der Objekteigenschaften spart.
Falls ein Nachladen der Objekte vermieden
werden soll, ist es ratsamer die Lazy-Strategie zu verwenden.
Vorsicht ist jedoch besonders bei der Strategie Lazy Loading geboten. Bei fehlerhaftem
Einsatz kann es zu Performance-Einbußen
kommen, wie anhand des Performance-Tests
zu erkennen war. Trägheit kann also bestraft
werden. Aber es gibt auch Situationen, in denen sie förderlich ist .
Abb. 7: Messergebnisse des Lazy und Eager Loading.
Alexander Keil ([email protected]).
Seminarempfehlung: Hibernate und die Java Persistence API
►► Informationen/Online-Anmeldung: http://training.ordix.de/seminar.php?nr=549
In diesem Seminar werden Sie mit der Hibernate-Entwicklung vertraut gemacht. Hibernate ist ein Open Source Persistenz-Framework für die Speicherung von Java-Objekten in relationalen Datenbanken. Durch deklaratives Mapping bietet es die Möglichkeit, einfach und effizient auf Basis relationaler Datenbanken zu entwickeln.
Seminarinhalte
•
•
•
•
•
Grundlagen, Begriffsdefinitionen, Architektur
Rolle im Applikation-Server und Web-Container
Einordnung von Hibernate API und Java Persistence API (JPA)
Konfiguration von Hibernate
O/R-Mapping
• Mapping von Entities, Hibernate Tools
• Relationen zwischen Entities
• Vererbung bei Entities
Termine
23.11.- 27.11.2009 in Wiesbaden
08.02.- 12.02.2010 in Wiesbaden
26.04.- 30.04.2010 in Wiesbaden
Seminar-ID: J-HIB-01
Dauer: 5 Tage
Preis pro Teilnehmer: 1.690,00 € (zzgl. MwSt.)
Frühbucherpreis: 1.521,00 € (zzgl. MwSt.)
Wir führen unsere Seminare auch jederzeit an einem geeigneten Ort Ihrer Wahl durch und bringen, wenn nötig, auch das entsprechende Equipment
mit. Informieren Sie sich am besten im Internet über unsere Inhouse-Seminare und die mobilen Schulungen: http://training.ordix.de.
ORDIX News 3/2009
51
Wir bieten mehr
als Consulting
Wir unterstützen Sie bis zu Ihrem Ziel!
Um mit IT-Management langfristig Erfolg zu haben, geht
es nicht nur darum, IT-technische Lösungen zu finden.
Heutzutage sind die größten Herausforderungen die Umsetzung von gewinnbringenden Strategien, damit IT zum
Motor Ihres Business wird.
Wir begleiten Sie nicht nur auf der
fachlichen sondern auch auf der
sozialen Ebene, zum Beispiel durch
Kommunikationstrainings und proaktives Konfliktmanagement.
Wir unterstützen Sie bei:
• Optimierung Ihrer IT-Business-Prozesse
• Enterprise Architecture Management
• Ausarbeitung Ihrer IT-Strategien
Sprechen Sie uns einfach an, um
mit uns gemeinsam Ihre Ziele zum
geschäftlichen Erfolg zu führen!
coniatos AG
Kreuzberger Ring 13
65205 Wiesbaden
Tel: 0611 77840-00
E-Mail: [email protected]
Internet: www.coniatos.de
Herunterladen