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