www.ordix.de ORDIX News Das IT-Magazin der ORDIX AG Ausgabe 3/2006 € 2,20 Datenkompression unter Oracle XEN – ein neuer Stern am Himmel? S. 24 Lucene unter Last Open Source Virtualisierungslösung S. 13 beim Deutschen Rundfunkarchiv S. 30 EJB 3.0: Annotations versus XDoclet Oracle Objekttypen Teil I dieser Artikelserie stellt EJB 3.0 aus konzeptioneller Sicht vor. S. 5 Die neue Reihe bringt Licht in die zahlreichen von Oracle unterstützten Objekttypen S. 28 Besuchen Sie ORDIX auf der 19. Deutschen Oracle Anwenderkonferenz am 15./16.11.2006 in Mannheim ... Auf der Konferenz präsentieren wir Oracle Know-how an der ORDIX Infoinsel und in diversen Vorträgen: • Umstieg auf RMAN mit Oracle Secure Backup Rechnet sich das? Herr Andreas Kother, ORDIX AG, Paderborn • Tracing - Im Geheimdienst Ihrer Majestät Herr Martin Hoermann, ORDIX AG, Münster • PL/SQL-Debugging und Tuning Frau Beate Künneke, ORDIX AG, Paderborn • Auditing - Sinn, Einsatzmöglichkeiten & Performance Herr Klaus Reimers, ORDIX AG, Köln ... und auf dem DOAG Schulungstag am 17.11.2006 http://training.ordix.de Schnuppern Sie das ORDIX Know-how in dem Workshop „Advanced PL/SQL“ im Rahmen des DOAG Schulungstags. Advanced PL/SQL Workshop PL/SQL wird als Sprache im „Datenbank-Kern“ immer wich­ tiger. Die Verarbeitung und Bereitstellung der Daten an zen­ traler Stelle ermöglicht damit den Zugriff von unterschiedlichen Anwendungen aus verschiedenen Systemen auf eine gemeinsame Basis. Große Bedeutung hat nach wie vor eine sehr gute Performance, die in der Datenbank optimal erzielt werden kann. Wir gehen in diesem Workshop auf wichtige Erweiterungen ein und zeigen Möglichkeiten zum Tracen auf. Darüber hinaus behandeln wir das Thema Performance. Zielgruppe: Dieser Workshop richtet sich an fortgeschrittene Entwickler und Datenbankprogrammierer, die ihre PL/SQL-Kenntnisse erweitern möchten. Inhalte: • PL/SQL-Designkonstrukte: Cursor Variablen, Subtypen, Objekttypen • Kollektionen (SQL, PL/SQL): Assoziative Arrays, Nested Tables, Varrays, Vorteile von Kollektionen • Fine Grained Access Control (FGAC): Prozessbetrachtung, Anwendungskontexte einrichten, Policies implementieren • Externe Prozeduren: Vorteile, Komponenten, Aufruf • PL/SQL Server Pages: Verwendungszweck, Aufbau und Aufruf • LOBs: Definition von Datentypen, LOB in der Datenbank, die Nutzung des DBMS_LOB Packages, Vorteile von LOBs • Analyse und Performance Tricks Infos zu den ORDIX Vorträgen und zur Anmeldung finden Sie unter http://www.doag.org. Infos zum kompletten ORDIX Trainingsprogramm finden Sie unter http://training.ordix.de. Wir freuen uns auf Ihren Besuch! Editorial Paderborn, September 2006 An dieser Stelle ... ... erwarten Sie normalerweise offene, kritische und manchmal auch amüsante Worte von mir. Als ich das letzte Editorial geschrieben hatte und noch nicht einmal die Drucklegung der Zeitung beendet war, erreichte die Eltern zweier junger Männer und unser Unternehmen eine unbegreifliche Nachricht. Ein Schicksalsschlag, von dem ich mir immer, seitdem ich dieses Unternehmen gegründet hatte, wünschte, dass er uns nie treffen würde. Daniel Hellinge und Christoph Voss Im Mai 2006 erlagen unsere beiden Auszubildenden Daniel Hellinge und Christoph Voss ihren schweren Verletzungen, die sie sich bei einem unverschuldeten Autounfall zugezogen hatten. Diese Seite ist deshalb ihnen und ihrem leider viel zu kurzen Schaffen innerhalb der ORDIX gewidmet. Wir werden sie nicht vergessen. Daniel Hellinge Christoph Voss * 22.01.1986 † 26.05.2006 * 11.05.1986 † 31.05.2006 Diese abrupte Trennung hat uns schwer getroffen. Und dennoch haben in alter Tradition am 1. August zwei neue Auszubildende ihre Arbeit in unseren Reihen aufgenommen. Wir wünschen uns und ihnen, dass sie würdige Nachfolger von Christoph und Daniel werden. Trotz dieser sehr ernsten und traurigen Einleitung lassen Sie sich nicht davon abhalten, auch in dieser ORDIX News unsere interessanten Artikel rund um Java, Oracle, Informix, Linux ... zu lesen. Ich wünsche Ihnen nach der WM-Euphorie viel Erfolg für die restlichen Monate des Jahres. Wolfgang Kögler ORDIX News 3/2006 Inhaltsverzeichnis Training Standards 09 ....Seminar EJB Programmierung 03 ....Editorial 12 ....Seminar Informix Backup & Recovery mit ON-Bar 04 ....Inhalt 22 ....Seminarübersicht: Oktober 2006 bis März 2007 34 ....Impressum Unix/Linux/Open Source Aktuell Titel- 13 ....XEN – Ein neuer Stern am Himmel? thema Überblick über die Open Source Lösung „XEN“ im Vergleich zu den Produkten Virtual Server und VMware. 02 ....DOAG Konferenz 2006 ORDIX auf der Anwenderkonferenz und dem Schulungstag 15 ....Betty, Tina, Lilli und Rosi sind pensioniert Bericht über die Planung und Migration eines (Betriebs-)­ Systems inklusive untersc 21 ....Rückblick ORDIX Open Neue Rekord-Teilnehmerzahlen 27 ....Larry Ratlos Zugriffsrechte unter Unix 40 ....Tiefe Einblicke in Solaris 10 mit Dtrace (Teil III): Geisterhafte Technik oder Technik, die begeistert? Betrachtung von Dtrace auf der Grundlage des Skriptes dexplorer aus dem DtraceToolkit. 43 ....Messe-Rückblick ORDIX diesjährig erstmals auf der JAX Java/XML Titel- 05 ....EJB 3.0 (Teil I): Titelema Annotations versus XDoclet th Der Artikel stellt EJB 3.0 aus konzeptioneller Sicht vor. Es wird ein kurzer Quellcodevergleich zu EJB 2.x mit XDoclet auf Ebene von Auszeichnungen und EJB-Artefakten durchgeführt. 30 ....Lucene unter Last thema beim Deutschen Rundfunkarchiv Durch einen Lasttest werden Einflussgrößen für die Antwortzeiten der Suchmaschine Lucene ermittelt. 18 ....Web-Entwicklung mit den Ajax-Tags Kurze Einführung in die Ajax-Programmierung und Verwendung der Ajax Tag Library an einem konkreten Beispiel. 37 ....Hibernate (Teil III): Caching in Hibernate Einführung in die Grundlagen und die Konfiguration des Caching von Objekten in Hibernate. Datenbanken 10 ....IBM IDS 10.0 Neuheiten (Teil III): Informix 10 Table Level Restore Mit dem Table Level Restore kann man einzelne Tabellen aus einem Backup extrahieren und in der Datenbank wieder herstellen. Titela 24 ....Datenkompression unter Oracle them Wir stellen die Komprimierung von Tabellen unter Oracle mit Hilfe von Data Segment Compression vor. Titel28 ....Oracle Objekttypen (Teil I): thema Von Cluster bis XML Mehrteilige Übersicht zu den von Ora­cle unterstützten Objekttypen. 35 ....Auditing für die Datenbank Die Möglichkeiten des Auditing unter Oracle bieten eine erhöhte Sicherheit für die Datenbankadministration. ORDIX News 3/2006 Java/XML - Titelthema Java/XML Neue Reihe EJB 3.0 (Teil I): Annotations versus XDoclet Der EJB-Entwickler musste bislang für eine einzelne Enterprise Java Bean sieben Dateien und mehr erstellen und pflegen, um seine Businesslogik an den Server zu bringen. Eine große Arbeitserleichterung war da die Einführung von XDoclet als Hilfsmittel zur Code-Erzeugung. Mit EJB 3.0 Annotationen wird nun alles anders ... oder doch nicht?! EJB-Entwicklung und ihre Tücken Kritiker von Enterprise Java Beans (EJB) gibt es viele - wohl manchmal auch zu recht. Dabei ist einer der erstgenannten Kritikpunkte, dass für die Implementierung einer simplen EJB 2.0 Anwendung sieben Dateien und mehr erstellt und gepflegt werden müssen (siehe Abbildung 1). Neben der eigentlichen Bean verlangen bis zu vier Java-Interfaces sowie zwei DeploymentDeskriptoren die Aufmerksamkeit des Program­ mierers. Diese Artefakte der EJB-Spezifikati­on sind anfällig für Fehler und Unachtsamkei­ten. Zudem treten viele damit verbundenen Feh­ler erst beim Deployment in den Applikationsser­ ver auf. Für den Java-Compiler ist es zudem noch kein Grund, beim Übersetzungsvorgang einen Fehler anzuzeigen, wenn sich die throws-Klauseln einer Methode der eigentlichen Bean von denen des EJB Remote Interfaces unterscheiden. Wurde hier in der eigentlichen Bean ein Ex­ cep­tion-Wurf verzeichnet, jedoch nicht im EJB Re­mote Interface, wird dieser Verstoß ge­gen die J2EE-Spezifikation meist erst beim De­ ploy­ment in den Applikationsserver als Fehler erkannt. Eine neu implementierte Methode, zu der in den Deployment-Deskriptoren die Angaben für das Verhalten zu Datenbanktransaktionen nicht korrekt definiert sind, zeigt meist erst bei kontrollierten Fehlerfällen ihre fatalen Auswir- • • • • • • • Home Interface Remote Interface Local Interface Local Home Interface Deployment-Deskriptor ejb-jar.xml Container-abhängiger DeploymentDeskriptor (z. B. jboss.xml) Anwendungs-Deskriptor des EARs (application.xml) Abb. 1: Mögliche Artefakte von EJB 2.0. ORDIX News 3/2006 Der Artikel richtet sich vor allem an Java-Entwickler, die bereits mit EJB Erfahrung haben. kungen auf die Konsistenz der Datenbestände. Eine halb durchgeführte Kontobuchung wäre sicher ein mögliches Worst-CaseSzenario. Gerne wird bei der Implementierung von neuer Geschäftslogik auch die korrekte Definition der JAAS-Einstellungen der EJB vergessen. Auswirkungen können sein, dass z. B. ein in der Software abgebildeter Geschäftsvorfall nicht für alle beteiligten Nutzer zur Verfügung steht und der Container das Ansprechen der Schnittstelle mit einer java.lang.SecurityException verweigert. Für den Programmierer sind die EJB-Artefakte einer einzigen, zu implementierenden EJB-Methode (z. B. einer Stateless Session Bean) nicht alle auf einen Blick verfügbar. Sie müssen an diversen Stellen in XML und in separatem Java-Code gepflegt werden. In den letzten Jahren haben sich in der Softwareentwicklung diverse Verfahren herausgebildet, um diese Hindernisse bei der EJB 2.0 Entwicklung zu reduzieren. Alle modernen, integrierten Entwicklungsumgebungen unterstützen den Entwickler bereits bei der Einhaltung diverser J2EE-Spezifikationen. So werden mit Eclipse oder IDEA IntelliJ bei Refactorings der EJBMethoden auch die jeweiligen Stellen in den EJB-Interfaces angepasst, obwohl diese nicht in direkter Implementierungsbeziehung zu dieser Bean stehen. Anstatt die Einstellungen der DeploymentDeskriptoren umständlich über XML zu regeln, lassen sie sich zudem auch zentral über eine GUI steuern. Jenseits einer IDE hat sich im Open Source Bereich XDoclet als ungeschriebener Standard zur Pflege von EJB-Artefakten durchgesetzt. XDoclet als Wegbegleiter XDoclet ist ein Code-Generierungstool, das als Plugin für JavaDoc mit Hilfe von ant ausgeführt werden kann. Mit XDoclet hatte man ursprünglich genau jene EJB-Artefakte im Visier, die eine EJB-Entwicklung bislang unnötig erschwerte: XDoclet generiert die oben erwähnten, ungeliebten Artefakte (in Form von Text, XML- und Java-Quellcode) mit Hilfe von Auszeichnungen (Tags) innerhalb von Java-Kommentaren zu Klassen und Methoden. Java/XML Annotationen / Anmerkungen / Auszeichnungen / Tags Die Anwendung von XDoclet folgt dabei dem gleichen Prinzip, wie es zur Erstellung einer aussagekräftigen API-Dokumentation notwendig ist: Es werden im Java-Kommentar von Klassen, Methoden und Attributen spezielle Anmerkungen (Tags) vorgenommen, die das jeweilige Element speziell auszeichnen. Soll in der API-Dokumentation beispielsweise für eine Klasse ein Autor benannt sein, lässt sich im Java-Kommentar der Klasse das Tag @author Autorname einfügen, um die Information über einen Autor der Klasse in die Dokumentation einfließen zu lassen. Auf XDoclet übertragen fügt man so im Kommentar einer Klasse z. B. die Anmerkung @ejb.bean type="Stateless" ein, um XDoclet mitzuteilen, dass bei der javaDoc-Prozessierung dieser Klasse die EJB-Artefakte einer Stateless Session EJB generiert werden sollen. Über Tags lassen sich so alle benötigten Zusatzinformationen angeben, die zur Erstellung von gültigen EJB-Artefakten notwendig sind. Innerhalb der Steuerskripte für die Laufzeitumgebung ant oder über die Java-Umgebungsvariablen lassen sich zusätzlich Einstellungen für den Generierungsvorgang von XDoclet vorgeben. Sie definieren, was alles von XDoclet generiert werden soll. Hier lässt sich festlegen, ob definierte XDoclet-Tags ausgewertet und wo z. B. generierte Quellen abgelegt werden sollen. XDoclet folgt den Ansprüchen zur Generierung von Quellen und Metadaten unterschiedlichen Typs. So können neben dem EJBUmfeld auch Quellen und Metadaten für JMX, Spring, Tapestry, Hibernate oder JDO erzeugt werden. Selbst in komplexeren Code-Generierungsszenarien, die einem modellzentrierten Software-Entwicklungsansatz folgen, findet XDoc­ let seinen Einsatz. Mit Tools wie AndroMDA oder Middlegen lassen sich auf der Grundlage eines Datenmodells Quelldateien erzeugen, die um XDoclet-Tags angereichert sind. Mit XDoclet lassen sich über diese Quelldateien fertige Software-Bausteine generieren [1]. Zu XDoclet gibt es auch eine alternative, erweiterte Implementierung: XDoclet2. Im Wesentlichen unterscheidet sie sich von der Vorversion durch diverse Verbesserungen bei der Unterstützung von Hibernate. Es gibt aber auch Verschlechterungen: In einigen Bereichen fehlen XDoclet2 einige Funktionalitäten der früheren Version. Zudem unterstützt auch XDoclet2 noch nicht die neuen Features von Java 5. JSR 175 Metadata Annotationen Mit Java 5 wird das Prinzip der Auszeichnungen von Xdoclet im Standard „JSR 175 Metadata Annotations“ auf die elementare Sprach­ ebene von Java gebracht. Annotationen liegen nicht mehr innerhalb von Kommentaren als Bestandteil der Dokumentation, sondern sind nun echte Metadaten als Bestandteil des Quelltextes. Im Gegensatz zu den rein textbasierten JavaDoc-Kommentaren, deren Verhalten in den JavaDoc-Plugins bzw. in XDoclet implementiert ist, kommt mit den JSR-175-Annotationen ein stark typisiertes Verfahren daher. Jede Annotation wird durch ein eigenes Sprachelement, den Annotation-Typ, beschrieben. Dieser steht auf einer sprachli­ chen Stufe mit den anderen, syntaktischen Ele­ menten, wie Interface, Klasse etc. Damit einher gehen der Vorteil der Syntaxprüfung beim Übersetzungsvorgang und die Möglichkeit der Erweiterbarkeit um eigene, z. B. projektspezifische, Annotationen. Im Gegensatz zu XDoclet-Annotationen können JavaAnnotationen direkt in die Java-Klasse mit einkompiliert werden. Sie sind anschließend derart mit der Klasse verbunden, dass sie auch noch zur Laufzeit per Reflection abgefragt wer­ den können. EJB 3.0 Annotationen – was ist neu? Im (künftigen) Standard EJB 3.0 (JSR-220) wird von den Java-Annotationen rege Gebrauch gemacht. Alle Metadaten lassen sich mit Hilfe der neu eingeführten Java-Annotationen beschreiben. Wurde ein bestimmter Wert nicht definiert, greift ein Standard. Bei der Entwicklung kann nun prinzipiell komplett auf XMLDeployment-Deskriptoren verzichtet werden. Der Verzicht ist jedoch nicht zwingend erforderlich. Jede EJB 3.0-Metainformation kann immer noch in gesonderten Deployment-Deskriptoren definiert werden und überschreibt somit die am Quellcode vorgenommene Auszeichnung. Die althergebrachten, von Sun definierten, EJBZuständigkeitsbereiche wie z. B. „Application Component Provider“, „Application Assembler“ und „Application Deployer“ sind damit immer noch gültig. Gerade dies wurde ja vor einigen Jahren als großer Vorteil der EJB-Komponentenentwicklung gefeiert. Eine SoftwareKompo­nente, die eigene JAAS-Rollen verwendet, kann nun z. B. immer noch über die Anpassung der Deployment-Deskriptoren in die JAAS-Umgebung einer bestehenden EJB-Anwendung integriert werden. Es sollte gut überlegt sein, welche Metainformationen direkt mit dem Quellcode verbunden werden. Von der Laufzeitumgebung abhängige Eigenschaften, wie der JNDI-Name einer Datenbank-Ressource, werden sicher besser immer in einem XML-Deployment-Deskriptor definiert. Hierzu siehe auch den empfehlenswerten Artikel unter [2]. Dem Entwickler wird die hohe Ähnlichkeit von EJB 3.0 Annotationen mit XDoclet Annota­ tionen für Hibernate auffallen. Kein Wunder, denn die Entwickler von Hibernate sind doch an der Definition des Standards beteiligt und die Erfahrungen aus den Open Source Tools ORDIX News 3/2006 Java/XML Hibernate und XDoclet in die Spezifikation ein­ geflossen. sowie auf den Artefakten, die in den unterschiedlichen EJB-Versionen benötigt werden. So ist ein Vergleich dieser Tools mit dem neuen Standard nicht abwegig. Im Folgenden sei ein näherer Blick auf die Implementierungsunterschiede der beiden Technologien im Quellcode gewagt. Im Folgenden wird dazu der Quellcode einer einfachen Stateless Session EJB gezeigt, die die beiden im EJB-Interface zu veröffentlichenden Methoden String doSomeAction() und int getCount() enthält. Die Implementierung dieser Methoden enthält keine Logik. Für den Vergleich mit Blick auf Annotationen und Artefakte ist dies auch nicht nötig. Für das Beispiel wird die Bean um die jeweiligen Metainformationen zu Transaktions- und Sicherheitseinstellungen erweitert. Ein kleiner Vergleich Auf Grundlage der aktuellen JBoss-Version (4.0.4.GA) und der dafür verfügbaren, vorläufi­ gen EJB 3.0 Implementierung soll ein kleiner Ver­gleich mit einer einfachen Stateless Session Bean unter EJB 2.x mit XDoclet und EJB 3.0 gezeigt werden. Das Augenmerk liegt hier besonders auf dem Prinzip der Annotationen Es fallen die großen Ähnlichkeiten der beiden Auszeichnungsvarianten auf (siehe Abbildung 2), wenngleich die zugrundeliegenden, technischen Unterschiede immens sind. Der EJB 2.x Entwickler bemerkt, dass die SessionBean des XDoclet-Beispiels abstrakt deklariert ist und nicht die für EJB 2.x obligatorischen Methoden des SessionBean Interfaces implementiert. Um XDoclet-Tags angereicherter Quellcode Um EJB 3.0 Annotationen angereicherter Quellcode (in aktueller JBoss EJB 3.0 Implementierung) package ordix.xdoclet.ejb; package ordix.EJB 3.0.ejb; import import import import import import org.jboss.aspects.security.Unchecked; import org.jboss.annotation.security.SecurityDomain; javax.ejb.SessionBean; javax.ejb.SessionContext; javax.ejb.CreateException; javax.ejb.EJBException; java.rmi.RemoteException; /** * Diese Klasse ist ein Beispiel für die * XDoclet-Nutzung * * @ejb.bean * name="FooFacadeBean" * type="Stateless" * view-type="both" * transaction-type="Container" */ public abstract class FooFacadeBean implements SessionBean { /** * @ejb.interface-method * @ejb.permission unchecked="true" * @ejb.transaction type="Required" */ public String doSomeAction() { return "I made it."; } import java.rmi.RemoteException; import javax.ejb.*; import javax.annotation.security.RolesAllowed; /** * Diese Klasse ist ein Beispiel für die EJB 3.0-Nutzung */ @Stateless public class FooFacadeBean implements FooFacade { @TransactionAttribute(TransactionAttributeType.REQUIRED) @Unchecked public String doSomeAction() { return "I made it."; } @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) @RolesAllowed({"Administrator"}) public int getCount() { return 68; } } /** * @ejb.interface-method * @ejb.transaction * type="RequiresNew" * @ejb.permission * role-name="Administrator" */ public int getCount() { return 68; } } Abb. 2: Die Implementierungsunterschiede im Quellcode der beiden Technologien im Vergleich. ORDIX News 3/2006 Java/XML Erst beim Generierungsvorgang von XDoclet wird eine konkrete Implementierung erzeugt, die auch die Servicemethoden wie ejbStart(), ejbStop() oder setSessionContext() enthält. Auf die erzeugte Bean-Implementierung wird dann in den generierten Deployment-Deskriptoren verwiesen. Betrachtet man die verwendeten Auszeichnungen, fallen Ähnlich­ keiten auf. XDoclet erwartet als Auszeichnung einer zu prozessierenden EJB das Tag @ejb.bean, bei dem als Attribut definiert ist, um welchen Typ von EJB (hier Stateless Session Bean) es sich handelt. | +---META_INF | ejb-jar.xml | jboss.xml | \---ordix \---xdoclet +---ejb | FooFacadeBean.java | FooFacadeSession.java | +---interfaces | FooFacade.java | FooFacadeHome.java | FooFacadeLocal.java | FooFacadeLocalHome.java \---util FooFacadeUtil.java Unter EJB 3.0 wird das Gleiche durch die Anno­ tation @Stateless erreicht. Sofern hier nichts weiter definiert wurde, greifen Standardwerte, die im JBoss z. B. die EJB unter dem JNDIPfad mit dem Namen der Klasse ablegt. In unserem Vergleich in Abbildung 2 lautet der JNDI-Pfad /FooFacadeBean. Unter XDoclet muss jede Methode, die in den EJB-Interfaces publiziert werden soll, durch das Tag @ejb.interface-method ausgezeichnet werden. In EJB 3.0 passiert das Gleiche durch die Deklaration in dem implementier­ ten Interface. Hier werden standardmäßig alle Methoden-Interfaces als zu veröffentlichen­ de EJB-Methoden verwendet. Auch bei den Sicherheitseinstellungen und bei der Transaktionssteuerung entdeckt man Ähnlichkeiten. Verwendet XDoclet das Tag @ejb. permission mit dem Attribut unchecked, um eine Methode als ungeprüft im Sicherheitskontext zu kennzeichnen, macht es in EJB 3.0 die Annotation @Unchecked. Das EJB 3.0 Äquiva­lent zum XDoclet Tag @ejb.transaction type="Required" ist in der Annotation @Trans­actionAttribute (Transaction­ Attri­buteType.REQUIRED) zu finden. Vereinfachungen Abb. 3: Verzeichnisbaum mit Quelldateien nach der Generierung durch XDoclet. Überblick über die Neuerungen von EJB 3.0 • • • • • • • • • • Deployment-Deskriptoren sind nicht nötig, können aber StandardVerhalten überschreiben. Viele vordefinierte Einstellungen. Man spezifiziert nur die Ausnahmen von den Regeln. Es sind keine Schnittstellen wie Remote, EntityBean, SessionBean sowie Callback Interfaces nötig, die oft gar nicht benötigt werden. (Etwa bei Stateless Session Beans und Passivierung.) Falls es zum Beispiel eine remove-Methode geben muss, wird diese annotiert. Für eine Methode wie setSessionContext() wird setter injection genutzt. Exceptions müssen nicht mehr deklariert werden. (Ein Ärgernis mit Business Interfaces für den lokalen und remote Fall). Die Objekte sind viel leichter zu testen und ein First-Test-Ansatz ist damit viel leichter. Home Interfaces sind nicht mehr nötig. Es lassen sich EntityBeans objektorientiert modellieren, denn Vererbung ist möglich. EntityBeans müssen nicht mehr abstrakt sein und lassen sich so besser testen. Während EJBs unter der 2.x Spezifikation diverse Schnittstellen implementieren, sind sie unter EJB 3.0 viel mehr „Plain Old Java Objects“ (POJOs). EJB-QL wird mit Projektion, Inner und Outer Join, Bulk Updates, Bulk-Deletes, Sub-Queries und GROUP BY vervollständigt. Nutzt die in Java 5 eingeführten Annotationen, um Metadaten zu beschreiben. Abb. 4: Zusammenfassung der Neuerungen von EJB 3.0. (Quelle: http://www.java-tutor.com/java/ejb-3.0-links.htm) Betrachtet man die beiden Technologien nach der XDoclet-Generierung, werden die großen Vereinfachungen deutlich, die EJB 3.0 mit sich bringt. In EJB 3.0 reicht es aus, die Klassen in einen JAR zu verpacken und dann dem Applikationsserver bereitzustellen. Bei EJB 2.x gibt es eine Reihe von Artefakten, die XDoclet generiert hat (siehe Abbildung 3). Neben den Deployment-Deskriptoren ejb-jar.xml und jboss.xml werden alle EJB-Interfaces generiert. Ebenso werden die konkrete Implementierung von javax.ejb. SessionBean und die Erweiterung von FooFacadeBean mit dem Namen FooFacadeSession generiert. Die ebenfalls generierte Util-Klasse stellt eine Implementierung eines J2EE-Patterns zum Caching der EJB Home Interfaces zur Verfügung, die dem Client unnötige JNDI-Lookups erspart. Ausblicke Auch wenn sich die Technologien EJB 2.x und EJB 3.0 in der Praxis in den Grundsätzen stark unterscheiden, dürfte für den XDoclet-erfahrenen Entwickler ein Umstieg auf EJB 3.0 relativ einfach sein. Die verschiedenen Auszeichnungen sind in beiden Fällen ähnlich und lassen ein Gefühl der Vertrautheit mit dem Verfahren aufkommen. ORDIX News 3/2006 Java/XML Glossar Literaturhinweise Java Specification Request (JSR) JSR kennzeichnet eine Anforderung für eine Änderung der Programmiersprache Java, die vom Standardisierungskomitee, dem Java Community Process, eingebracht wird. Doclet Als Doclet bezeichnet man - in Anlehnung an Applet - Module, die von Dokumentationswerk­zeugen zur Verarbeitung und automatischen Erzeugung von Dokumentationen und eventuell auch Code eingesetzt werden. Bekannt sind Doclets insbesondere im Umfeld der Program­ mier­sprache Java, wo sie als Mo­ dule im Dokumentationswerk­zeug Java­Doc eingesetzt wer­den. ► [1] Fertige Software-Bausteine generieren http://www.codegeneration.net/tiki-read_article.php ?articleId=35 (engl.) ► [2] Wann setzt man Java-/Xdoclet-Annotationen ein und wann besser nicht?! http://www-128.ibm.com/developerworks/java/library/jcwt08025.html (engl.) ► [3] Was ist MDA und wie steht das im Zusammenhang zu Code-Generatoren wie XDoclet? http://de.wikipedia.org/wiki/Model_Driven_Architecture (dt.) ► [4] Wo finde ich Generalkritik an EJB? http://c2.com/cgi/wiki?WhatsWrongWithEjb (engl.) ► [5] Was bezeichnet Annotation in der Programmierung? http://de.wikipedia.org/wiki/Annotation_(Programmierung) (dt.) ► [6] Wo finde ich eine Zusammenfassung der Neuerungen von EJB 3.0 und begleitende Web-Verweise? http://www.java-tutor.com/java/ejb-3.0-links.htm (dt.) Mit XDoclet und EJB 2.x hat sich in der Entwick­ lergemeinde bereits ein hohes Erfahrungspotential aufgebaut, das in Grundzügen dem Verständnis von EJB 3.0 dienlich sein kann. Nichtsdestotrotz ist EJB 3.0 eine komplexe, neue Technologie, die weit über die Fähigkeiten von XDoclet/EJB 2.x hinausgeht (siehe Abbildung 4). ► [7] Was versteht man unter Java-Annotationen? http://de.wikipedia.org/wiki/Annotation_%28Java%29 (dt.) ► [8] Wo finde ich eine Einführung zu Java-Annotationen von Sun? http://java.sun.com/j2se/1.5.0/docs/guide/language /annotations.html (engl.) ► [9] Wo finde ich die eigentliche Spezifikation der Java-Annotationen (JSR 175)? http://jcp.org/en/jsr/detail?id=175 (engl.) ► [10] Wo bekomme ich XDoclet her? http://xdoclet.sourceforge.net (engl.) Lassen Sie sich überraschen und begeistern von den neuen Möglichkeiten, die sich mit EJB 3.0 bieten. Mit den Artikeln aus den Lite­ raturhinweisen kommen Sie vielleicht auf den Geschmack. ► [11] Wo finde ich XDoclet2? http://xdoclet.codehaus.org/ (engl.) ► [12] Wo bekomme ich eine praktische XDoclet-Einführung mit Vergleichen zu MDA? http://www.oio.de/xdoclet.htm (dt.) ► [13] Kurze EJB 3.0 Einführung von Oracle http://www.oracle.com/technology/tech/java/newsletter/articles /simplifying_ejb3.html (engl.) Holger Bartnick ([email protected]). Seminar: EJB Programmierung Der Teilnehmer erlernt die Programmierung von fort­geschrittenen Java-Enterprise-Anwendungen mittels Enterprise Java Beans (EJB). Mit Hilfe ausführlicher Übungen kann das Erlernte sofort in die Praxis umgesetzt werden. Voraussetzungen Gute Java-Kenntnisse oder Teilnahme am Seminar „Java Programmierung Grundlagen“. Grundkenntnis­se der J(2)EE-Architektur oder Teilnahme am Seminar „Einführung in J(2)EE“. Zielgruppe Software-Ingenieure, Internet- und Intranet-Entwickler, die effizient J(2)EE-Anwendungen mit Java (insbesondere EJB) entwickeln möchten. Java-Enterprise-Entwickler, die Geschäftsobjekte auf der Serverseite entwickeln wollen. ORDIX News 3/2006 Seminarinhalte • J(2)EE-Architektur im Überblick • Übersicht Enterprise Java Beans Container: Session Beans, Entity Beans, Message Driven Beans • Session Bean Details: Stateful/-less Session Beans • Persistenz und Entity Bean Details: CMP, BMP, Benutzung von Transaktionen • Message Driven Beans • Ausführliche Übungen zu allen Themen Kursgebühr/Teilnehmer: 1590,00 Euro zzgl. MwSt. Dauer: 5 Tage Termine 06.11.2006 - 10.11.2006 in Wiesbaden 12.02.2007 - 16.02.2007 in Wiesbaden 07.05.2007 - 11.05.2007 in Wiesbaden 27.08.2007 - 31.08.2007 in Wiesbaden 05.11.2007 - 09.11.2007 in Wiesbaden Datenbanken IBM Informix Dynamic Server 10.0 Neuheiten (Teil III): Informix 10 Table Level Restore Problemlose Wiederherstellung auf Tabellenebene In Ausgabe 2/2006 stellten wir die Features „Renamed Restore“ und „ONTAPE auf STDIO“ vor. Neben diesen beiden Neuerungen gibt es ein weiteres Feature aus dem Bereich Backup und Recovery, dessen Vorzüge wir Ihnen gerne aufzeigen möchten. Es handelt sich um den Table Level Restore. Dieser Artikel richtet sich an Datenbankadministratoren, System­ administratoren und Entscheider. Was ist „Table Level Restore“? Bisher war es so, dass im Falle einer inkonsistenten Datenbanktabelle oder beim Verlust von Daten eine komplette Datenbanksicherung zurückgespielt werden musste. Eine Alternativlösung bestand darin, die komplette Datenbanksicherung auf einem anderen Referenzsystem zurückzuspielen und die entsprechenden Daten von diesem System aus auf das Produktionssystem zu übertragen. Diese Maßnahme konnte, je nach Größe der Datenbank, unter Umständen sehr lange dauern. Der Table Level Restore (TLR) kann an dieser Stelle Abhilfe schaffen. Durch den TLR können einzelne Tabellen aus einem Backup extrahiert und in der Datenbank wieder hergestellt werden. Es ist also kein kompletter Restore des ganzen Datenbanksystems mehr notwendig, um an die Daten einer einzelnen Tabelle zu gelangen. Die Grundlage des TLR bildet das Informix Tool archecker. Das Tool archecker Mit dem Tool archecker können Datenbanksicherungen, die mit Hilfe von ONTAPE oder ONBAR erstellt wurden, auf ihre Konsistenz und Vollständigkeit überprüft werden. Jedoch sollte trotz dieses Tools auf einen Testrestore nicht verzichtet werden, um zum einen die Abläufe zu trainieren und zum anderen die 100%ige Sicherheit zu haben, dass ein Restore fehlerfrei funktioniert. Ab Informix Release 10.0 kann das Tool archecker zusätzlich für den TLR genutzt werden. Dabei kann auch hier sowohl auf ONBARals auch auf ONTAPE-Sicherungen zurückgegriffen werden. 1. Es muss eine Sicherung (ONTAPE oder ONBAR) existieren, die auch die ent­spre­ chen­de(n) Tabelle(n) beinhaltet, die herausgezogen und wieder hergestellt werden soll(en). 2. Von den wieder herzustellenden Tabellen muss eine so genannte Schemadatei vorhanden sein, die das Data Definition Language (DDL)-Statement für die Tabelle enthält. Mit dem Tool dbschema existiert eine komfortable Möglichkeit, eine solche Schemadatei zu erstellen (siehe Abbildung 1). Natürlich kann diese auch „von Hand“ geschrieben werden. 3. Zusätzlich muss in dieser Schemadatei eine Verbindung zur Datenbank hergestellt werden, in welche die Tabelle zurück geschrieben werden soll. Weiterhin muss sie das entsprechende Insert-Statement enthalten, um die Datensätze der Tabelle hinzuzufügen (siehe Abbildung 2). 4. In der SQLHOSTS-Datei muss mindestens ein Eintrag für eine TCP/IP Verbindung zum Online Server vorhanden sein, über die der TLR durchgeführt werden kann. Während des Restores werden über eine Verbindung mehrere Sessions innerhalb der Datenbank geöffnet. Eine Shared Memory-Verbindung kann im Gegensatz zu einer TCP/IP-Verbindung immer nur eine Session pro Verbindung bereitstellen und ist deshalb für den TLR ungeeignet. Befehlssyntax Syntaktisch sieht der Befehl für einen TLR folgendermaßen aus: archecker { -t | -b } –X –f <Schema-Datei> Voraussetzungen Um einen TLR durchzuführen, müssen folgende Voraussetzungen erfüllt sein: 10 Die Optionen –t oder -b legen fest, um welchen Archive-Typ es sich handelt. Für die Benutzung einer ONTAPE-Sicherung wird direkt ORDIX News 3/2006 Datenbanken nach dem Kommando die Option –t angege­ ben. Für eine ONBAR-Sicherung wird die Option –b angegeben. $ dbschema –t kunde –d DB1 kunde.sql $ cat kunde.sql Die Option –X teilt dem Kommando mit, dass ein TLR durchgeführt werden soll. Alle weiteren Informationen werden anhand der zuvor konfigurierten Schemadatei ermittelt, die über die Option –f angegeben wird. create table "informix".kunde ( kundennr serial not null, kundenname char(15), kundenanschrift char(45), primary key(kundennr) ); Beispiel Für eine Schemadatei einer Tabelle kunde würden die Befehle für ONTAPE bzw. ONBAR Sicherungen folgendermaßen aussehen: ONTAPE-Sicherung: archecker –t –X –f kunde.sql ONBAR-Sicherung: archecker –b –X –f kunde.sql Die Schemadatei Die Schemadatei ist ein wichtiger Bestandteil des TLRs. Mit ihr kann der Datenbankadministrator (DBA) einen direkten Einfluss auf den Namen der Tabelle und auf die Datenbank, in der die Tabelle wieder hergestellt werden soll, nehmen. Folgende Informationen und Befehle sind in der Schemadatei anzugeben: • Datenbankname der Quelldatenbank • DDL Statements der Tabelle(n) • DML Befehle Ein Beispiel zeigt Abbildung 2. Der TLR bietet somit auch die Möglichkeit, eine Tabelle aus einer Sicherung zu extrahieren und unter einem anderen Tabellennamen in einer anderen Datenbank wieder herzustellen (siehe Abbildung 3). Point-In-Time Durch die Ergänzung restore to ... kann eine Tabelle auch bis zu einem bestimmten Zeitpunkt (Point-In-Time) wieder hergestellt werden. Das Kommando erwartet dazu die Angabe eines Zeitstempels, der sich aus dem Datum und der Uhrzeit zusammensetzt. Die Syntax eines Table Level Point in Time Restores (TLPITR) ist in Abbildung 4 dargestellt. External Table Neben der Wiederherstellung einer Tabelle in einer Datenbank bietet der TLR auch die Möglichkeit, die Daten direkt in eine Datei im File- ORDIX News 3/2006 Abb. 1: Beispiel zur Erstellung einer Schemadatei mit Hilfe des Befehls dbschema. database DB1; create table "informix".kunde ( kundennr serial not null, kundenname char(15), kundenanschrift char(45), primary key(kundennr) ); insert into kunde select * from "informix".kunde; Abb. 2: Beispiel einer einfachen Schemadatei für den Table Level Restore. database DB1; create table "informix".kunde ( kundennr serial not null, kundenname char(15), kundenanschrift char(45), primary key(kundennr) ); database DB2; create table "informix".kunde_newDB ( kundennr serial not null, kundenname char(15), kundenanschrift char(45), primary key(kundennr) ); insert into DB2:kunde_newDB select * from DB1:kunde; Abb. 3: Beispiel eines datenbankübergreifenden Table Level Restores. database DB1; create table "informix".kunde ( kundennr serial not null, kundenname char(15), kundenanschrift char(45), primary key(kundennr) ); insert into kunde select * from "informix".kunde; restore to "2006-06-23 18:43:29" Abb. 4: Beispiel eines Table Level Point in Time Restores (TLPITR). 11 Datenbanken database DB1; create table "informix".kunde ( kundennr serial not null, kundenname char(15), kundenanschrift char(45), primary key(kundennr) ); create external table external_kunde ( kundennr serial not null, kundenname char(15), kundenanschrift char(45), primary key(kundennr) ) USING ('external_table.unl','DELIMITED'); insert into external_kunde select * from "informix".kunde; Abb. 5: Verwendung von externen Tabellen mit Hilfe des Table Level Restores. System zu schreiben. Hierbei nimmt jeder Datensatz der Tabelle eine Zeile in der Datei ein. Die einzelnen Spalten werden durch ein Trennzeichen voneinander abgegrenzt, welches bei Informix standardmäßig das Pipe-Zeichen ( | ) ist. Über die Umgebungsvariable DBDELIMITER kann dieser Wert jedoch nach Belieben verändert werden. Die Steuerung erfolgt auch hier anhand der Schemadatei. Im oberen Teil werden die Datenbank und die Tabelle ausgewählt, von der die Daten ermittelt werden sollen. Im unteren Teil wird dann zusätzlich eine externe Tabelle angelegt, durch die mittels der USING-Anweisung die Datei deklariert wird (siehe Abbildung 5). Abschließend folgt das insert-Statement, das die Daten der Quelltabelle in die externe Tabelle und somit in die Datei schreibt. Fazit Der Table Level Restore kann im Bereich des Backup und Recovery von sehr großem Nutzen sein. Insbesondere dann, wenn von einer Datenbank nur einzelne Tabellen inkonsistente Daten aufweisen oder durch Anwenderfehler verloren gegangen sind und somit wieder hergestellt werden müssen. Für den DBA kann der TLR eine enorme Zeitersparnis bedeuten, da nicht erst eine komplette Datenbank wieder hergestellt werden muss, aus der dann die benötigten Daten der betroffenen Tabellen zusammengesucht werden müssen. Jedoch sollte man nicht nur den Bereich der Wiederherstellung der Daten nach einem Datenverlust betrachten. Auch bei der Erstellung einer Testumgebung zum Beispiel, in der nur bestimmte Tabellen benötigten werden, kann man mit diesem Feature viel Zeit und Ressour­ cen sparen. Somit stellt TLR auch eine Alternative zu den bestehenden Import- und Export Tools dar. Haben Sie Fragen? Dann fordern Sie uns! Thorsten Schuhmacher ([email protected]). Seminar: Informix Backup & Recovery mit ON-Bar Der Teilnehmer lernt, Sicherungen und Restaurierungen des Informix Dynamic Servers (IDS) mit ON-Bar und einem Storage Manager zu erstellen. Seminarinhalte Voraussetzungen • Restaurierung unter Vermeidung von Tiefgehende Kenntnisse des Betriebssystems Unix oder Windows. Tiefgehende Kenntnisse des Datenbanksystems Informix Dynamic Server oder Teilnahme am Seminar „Informix Dynamic Server Administration“. Kenntnisse über Storage Manager. • Sicherung von IDS mit ON-Bar • Erstellung von Sicherungsplänen für den Zielgruppe • • • Informix Werkzeuge zum Sichern des IDS • Sicherungskonzepte: Vollsicherung, Log­ sicherung, Online-/Offline Sicherung Datenbankadministratoren, Softwareentwickler, Systembetreuer. Datenverlust (Was tue ich, wenn ...?) IDS mit Storage Manager Systemen (z. B. NetWorker, Hiback, ISM) Restaurierung eines IDS Ausführliche Übungen zu allen Punkten Termine Kursgebühr/Teilnehmer: 1090,00 Euro zzgl. MwSt. Dauer: 3 Tage 12 04.10.2006 - 06.10.2006in Wiesbaden 19.03.2007 - 21.03.2007in Wiesbaden 30.07.2007 - 01.08.2007in Wiesbaden 05.11.2007 - 07.11.2007 in Wiesbaden ORDIX News 3/2006 Unix/Linux/Open Unix/Linux/Open Source - Titelthema Source Vergleich der Open Souce Lösung XEN mit anderen Virtualisierungslösungen XEN – Ein neuer Stern am Himmel? In früheren ORDIX News berichteten wir des Öfteren über die Virtualisierungslösung ESX-Server von VMware. Das Thema Virtualisierung wird aber nicht nur durch VMware bedient. Mittlerweile gibt es auch von anderen, kommerziellen Anbietern vergleichbare Lösungen sowie auch Lösungen aus dem Open Source Umfeld. Wir geben Ihnen einen Überblick über die Open Source Lösung XEN im Vergleich zu anderen Virtualisierungslösungen. Virtualisierung in aller Munde Die Firma VMware [1] bietet Produkte aus dem Virtualisierungsbereich an, die für verschie­de­ne Bereiche eingesetzt und genutzt werden können. Diese Art der gleichzeitigen Nutzung einer Hardware durch mehrere Betriebssys­teme ist erst in den letzten Jahren ak­tuell geworden. Grund hierfür ist unter anderem, dass die aktuell zur Verfügung stehenden Prozessoren wesentlich leistungsfähiger und Arbeitsspeicher deutlich günstiger gewor­den sind. Dieser Artikel richtet sich an Berater, Systemadministratoren und Entscheider, die sich mit dem Thema Virtualisierung auseinandersetzen. Was bietet XEN in der aktuellen Version? • Unterstützung virtualisierender Intel- und AMD-Prozessoren • Unterstützung von Symmetric Multiprocessing (SMP) im Gastbetriebssystem • Unterstützung von 64 Bit CPUs • Dynamische Verteilung der Gastsysteme auf die vorhandenen CPUs Verwaltung von bis zu 100 Betriebssystemen Sichere Trennung der Gastsysteme untereinander Online-Ressourcenzuweisungen (RAM, Prozessoren, etc.) Online-Migration von Gastsystemen auf andere XEN-Server Neben VMware hat auch Microsoft mit dem Virtual PC 2004 und Virtual Server 2005 [2] Produkte für den Heim- und Enterprise-Bereich ins Rennen geschickt. • • • • Auch im Open Source Bereich verschläft man die Aktualität dieses Themas nicht und schickt mit XEN [3] Kernelpatch und Verwaltungstools in Richtung Zielgerade. Was fehlt XEN momentan (noch)? • XEN arbeitet in der aktuellen Version kommandozeilenorientiert. Es fehlen die GUIs zur Administration. • Die Emulation ist noch auf bestimmte Betriebssysteme als Kann XEN den kommerziellen Produkten Paroli bieten? Ein tabel­larischer Vergleich zu anderen Virtualisierungs­lösungen gibt Abbildung 2. Hallo! Mein Name ist XEN, der Neue im Bunde XEN ist eine Open Source Virtualisierungslö­ sung, die unter der General Public License (GPL) steht und von der Universität Cambrid­ge entwickelt wird. XEN läuft auf 32 und 64 Bit Intelund AMD-Prozessoren (siehe Abbildung 1). Die­se werden für die darauf laufenden Gastsysteme paravirtualisiert. Gast beschränkt. • XEN ist standardmäßig noch nicht im Linux-Kernel enthalten. Der Kernel erfordert einen entsprechenden Patch. Das wahrscheinlich größte Manko Da XEN nicht mit kommerziellem Hintergrund entwickelt wird, fehlen aktuell noch Tools, die die administrative Arbeit erleichtern. Dabei wird eine sehr hohe Performance erzielt, weil die Hardware nicht emuliert werden muss. Diese wird den Gastsystemen mit einem sehr kleinen Overhead zur Verfügung gestellt. Als Gastsysteme (Domains) können momentan Linux, FreeBSD, NetBSD und OpenSolaris eingesetzt werden. Im Zuge der neuen Prozessorgenerationen Vanderpool (Intel) und Pacifica (AMD) werden auch Microsoft Windows Betriebssysteme in den Genuss des Gastes kommen. ORDIX News 3/2006 Abb. 1: Vier virtuelle Maschinen in Aktion. 13 Unix/Linux/Open Source Produkt Hersteller / Version Wirtsbetriebssystem Gastsystem Virtuelle Hardware Leistungsverlust Gast Support für Vanderpool, Pacifica Kommandozeilenunterstützung GUI Administration Sicherung der Gäste Snapshots Max. Anzahl Prozessoren Max. virtuelle Prozessoren / Gast Max. virtueller RAM NICs / Gast Installation Gast Onlinemigration auf andere Wirtsbetriebssysteme Vervielfältigung der Gastbetriebs­systeme (Cloning) Ressourcenüberwachung der Gäste Lizensierung ESX-Server VMware / 3 Redhat Linux Wirtsbetriebssystem ist im ESX Server enthalten. Windows, Linux, Novell, Solaris NIC, SCSI, IDE, Parallel, Seriell 3 – 18 % Ja Ja Ja Imagebasiert Ja 16 4 Virtual Server Microsoft / 2005 R2 Windows XEN www.xen.org / 3.0 Linux Windows (Linux inoffiziell) Windows, Linux, BSD, OpenSolaris NIC, SCSI, IDE, Parallel, Seriell, USB bis 5 % Ja Ja Nein / in Entwicklung Imagebasiert Nein 32 max. 32 16 GB 4 CDrom Ja NIC, SCSI, IDE, Parallel, Seriell 12 – 25 % Nein Ja Ja Imagebasiert Ja 32 1 / momentan kein SMP der Gäste möglich 3 GB 4 CDrom Nein Manuell, Drittanbieter­produkte Ja Pro CPU Manuell, Drittanbieterprodukte Ja 199 $ / je Virtual Server Wie Host-OS >4 CDrom, Templates Ja Manuell Ja GPL / Open Source Abb. 2: Übersicht über die aktuellen Virtualisierungslösungen. XEN wird ohne grafisches Managementtool ausgeliefert, so dass die Verwaltung und Installation der Gastbetriebssysteme auf die Kommandozeilenebene beschränkt ist. Zum Beispiel kann man mit dem Befehl xentop Informationen über die verwendeten Ressourcen anzeigen lassen (siehe Abbildung 3). Die Open Source Gemeinde ist dabei, Lösungen zu entwickeln, die eine grafische Administration und Überwachung der virtuellen Gäste ermöglichen. Auch der Distributor Novell liefert in der aktuellen SUSE Linux Version eine Möglichkeit, XEN-Gäste mit Hilfe von YaST zu installieren. Einstiegsschwierigkeiten Momentan befindet sich XEN noch nicht im Vanillakernel. Dadurch ist man auf die Hilfe der Distributoren oder auf eigenes Geschick angewiesen. Der Kernel muss „gepatcht“ und kompiliert werden. Abb. 3: Ressourcenmanagement mit XEN. Links ► [1] http://www.vmware.com ► [2] http://www.microsoft.com/windowsserversystem Es ist aber in naher Zukunft abzusehen, dass XEN Teil des stabilen Kernels wird. Auch die Installation eines Gastbetriebssystems ist nicht trivial und benötigt tiefgreifende Linux-Kenntnisse. Ein Linux muss beispielsweise entweder in einer Chroot-Umgebung ins­ talliert oder ein vorhandenes Linux geclont und verändert werden. Fazit XEN muss sich im Vergleich zu den kommerziellen Produkten nicht verstecken. Dafür, dass es im Vergleich zu den bekannten Produkten noch ein recht junges Produkt ist, leistet es Erstaunliches. Viele Internetanbieter stellen momentan auf XEN um, um so genannte RootServer anzubieten. Und die ersten Distributo­ ren bringen Linux-Komplettpakete mit XENUnterstützung heraus. Auch die kommerziellen Hersteller sind durch den Neuling „alarmiert“ und reagieren mit kostenlosen Download-Varianten ihrer Produkte auf die Open Source Lösung XEN. Viel wird davon abhängen, wie sich die Qualität und Flexibilität der Lösung zukünftig entwickelt. In einer der nächsten Ausgaben werden wir die Lösung XEN näher beleuchten. /virtualserver/default.mspx ► [3] http://www.cl.cam.ac.uk/Research/­SRG/netos/xen/ 14 Christian Fertsch ([email protected]). ORDIX News 3/2006 Java/XML Vorstellung der Ajax JSP Tag Library Web-Entwicklung mit den Ajax-Tags Mit Hilfe von Ajax können Web-Anwendungen so programmiert werden, dass die Bedienbarkeit ähnlich komfortabel wie bei klassischen Desktop-Anwendungen wird. Dies liegt daran, dass der Browser in der Lage ist, mit dem Server zu kommunizieren, ohne dass die Web-Seite vollständig neu geladen werden muss. Das Ergebnis kann eine in der Handhabung beschleunigte und intuitivere Web-Anwendung sein. Dieser Artikel richtet sich an Java-Entwickler, die ihre Web-Anwendungen mit Ajax-Funktionalität ausstatten möchten. bei Verwendung von JSP 1.x der Tag Library Descriptor in der web.xml der Anwendung bekannt gegeben werden. Wo finde ich Ajax-Anwendungen im Web? Schließlich werden noch (mindestens) zwei JavaScript-Dateien benötigt: Eines der bekanntesten und umfangreichsten Beispiele einer AjaxAnwendung ist wohl Google Maps [1]. Weitere Google-Beispiele, wie z. B. Google Suggest, lassen sich über [2] aufrufen. Aber auch in kleinerem Rahmen lässt sich Ajax einsetzen, um die Bedienung von Webseiten komfortabler zu gestalten. Einige solcher Beispiele sind unter [3] oder auf der Ajax-Tags-Seite [4] zu finden. 1. prototype.js, da die Ajax-Tags auf dem Prototype Framework [7] basieren. 2. ajaxtags.js, die eine Reihe von Ajax-Funktionalitäten bereitstellt. Ajax in Form von Tags Im Folgenden wird beispielhaft gezeigt, wie die Ajax-Tags in eine JSP-Seite integriert werden, um eine automatische Vervollständigung zu realisieren. Um Web-Anwendungen mit Ajax umzusetzen, benötigt man ein fundiertes JavaScript-Wissen. Möchte der Entwickler die clientseitige JavaScript-Programmierung vermeiden und seine Webseiten trotzdem mit Hilfe von Ajax dynamisieren, lohnt sich ein Blick auf das AjaxTags-Projekt [5]. Ein Beispiel: Automatische Vervollständigung Mit Hilfe der dort bereitgestellten Tag Library lassen sich Java Server Pages um einige interessante Ajax-Funktionalitäten erweitern. Dieser Artikel zeigt beispielhaft die Verwendung der Ajax-Tags und macht auf Probleme bei der Umsetzung aufmerksam. Welche Vorbereitungen muss ich treffen? Sämtliche Dateien, die zur Verwendung der Ajax-Tags benötigt werden, sind unter [6] erhältlich. Die eigentliche Taglib muss in Form eines jar-Archivs eingebunden werden. Des Weiteren muss Was ist Ajax? Oft ist es wünschenswert, dass auf Basis einer Eingabe, z. B. in ein Textfeld, verschiedene Auswahlmöglichkeiten angezeigt werden. Folgender Ablauf findet in diesem Fall bei Implementierung mit Hilfe von Ajax statt: Der Benutzer gibt die gewünschten Buchstaben ein. Anschließend wird ein XMLHTTP-Request an den Server geschickt. Der Server verarbeitet den Request, ermittelt die notwendigen Daten und schickt diese an den Client zurück. Anschließend bekommt der Benutzer die Aus­ wahl­mög­lich­kei­ten vom Server zu Gesicht, ohne dass die Web­seite neu geladen werden muss. Ajax steht für Asynchronous JavaScript and XML. Kern von Ajax ist das XMLHTTP-Request Objekt (beziehungsweise das XMLHTTP-Objekt beim Internet Explorer), welches von aktuellen Browsern unterstützt wird. XMLHTTP-Requests können gesendet werden, ohne dass die Webseite neu aufgebaut werden muss. Die Daten werden üblicherweise in Form von XML übermittelt. Auf der Clientseite wird JavaScript benötigt, um zu entscheiden, wann und mit welchen Daten ein XMLHTTP-Request abgeschickt wird und auf welche Weise die angeforderten Daten aus dem Response dann in die Webseite eingebaut werden. 18 Abb. 1: Automatische Vervollständigung mit Hilfe der Ajax-Tags. ORDIX News 3/2006 Java/XML Als Beispiel soll nun ein Textfeld dienen, welches in einem HTML-Formular platziert wird. Gibt der Benutzer in das Textfeld einen Buchstaben ein, z. B. ein „J“ (siehe Abbildung 1), werden alle Seminare angezeigt, die mit diesem Buchstaben beginnen. Über „minimumCharacters=1“ (Zeile 7) wird festgelegt, dass die Auswahlliste schon bei Eingabe eines Buchstabens aufgebaut wird. Schließlich wird noch mitgeteilt, dass der Response des Servers im XML-Format vorliegt (Zeile 8). Das HTML-Formular wird, wie in Abbildung 2 zu sehen ist, definiert. Nachdem die JSP auf diese Weise mit Ajax-Funktionalität ausgestattet wurde, muss sich der Entwickler um die serverseitige Komponente kümmern. Welche Technologie er dort einsetzt, ist ihm überlassen. Abbildung 4 zeigt kurz auf, wie ein Servlet aussehen kann, das die Verarbeitung auf dem Server vornimmt. Um die automatische Vervollständigung mit Hilfe der Ajax-Tags zu realisieren, wird das Tag <ajax:autocomplete> verwendet (siehe Abbildung 3). Bedeutung der einzelnen Attribute In dem Beispiel in Abbildung 3, Zeilen 2 und 3, sind das „source“- und „target“-Attribut auf dasselbe Textfeld innerhalb des HTML-Formulars gesetzt. D. h. der Benutzer bekommt die Auswahl und das Ergebnis im selben Feld angezeigt. Das Attribut „baseUrl“ (Zeile 4) definiert, welche URL zur serverseitigen Verarbeitung des Requests aufgerufen wird. In diesem Fall küm­ mert sich das AjaxServlet um die Verarbeitung. Über „className“ (Zeile 5) wird eine CSS-Klasse zur Generierung der Auswahlliste angegeben. In der mitgelieferten Datei „ajaxtags.css“ befindet sich neben einer Reihe weiterer Stylesheets die entsprechende Klasse „autocomplete“. Mit Hilfe von „indicator“ (Zeile 6) kann optional ein Bild festgelegt werden. Dieses sig­nalisiert dem Benutzer, dass die Auswahlliste aufgebaut wird, bzw. der Response vom Server erwartet wird. Solche Hinweise sollten dem Benutzer generell gegeben werden, da – Ajax wie der Name schon sagt – asynchron arbeitet. Der Anwender würde sonst nicht mitbekommen, dass eine Verarbeitung stattfindet. Die Verarbeitung auf dem Server Die Klasse erbt von der Klasse BaseAjaxServlet, welche Teil der Ajax Tag Bibliothek ist (Zeile 1). Die Methode getXMLContent() (Zeile 3) ermittelt zunächst den übergebenen Parameter. In unserem Beispiel das vom Benutzer eingegebene „J“. Dann werden alle Seminare, die mit dem Buchstaben „J“ beginnen, in einer Liste gespeichert. Schließlich wird aus dieser Liste ein XMLkonformer String generiert und zurückgegeben (Zeile 7). 1 <form action="."> 2 <fieldset> 3 <legend>Seminarauswahl</legend> 4 <p>Bitte wählen Sie ein Seminar aus</p> 5 <label for="seminar">Seminar:</label> 6 <input id="seminar" name="seminar" type="text" size="30" /> 7 <span id="indicator" style="display:none;"> 8 <img src="${contextPath}/img/indicator.gif" /> 9 </span> 10 </fieldset> 11</form> Abb. 2: Definition des HTML-Formulars. 1 <ajax:autocomplete 2 source="seminar" 3 target="seminar" 4 baseUrl="${contextPath}/AjaxServlet" 5 className="autocomplete" 6 indicator="indicator" 7 minimumCharacters="1" 8 parser="new ResponseXmlParser()" /> Abb. 3: Verwendung des Ajax-Tags <ajax:autocomplete> zur automatischen Vervollständigung. 1 public class AjaxServlet extends BaseAjaxServlet { 2 3 public String getXmlContent(HttpServletRequest request, HttpServletResponse response) 4 throws Exception { 5 6 String seminar = request.getParameter("seminar"); 7 Service service = new Service(); 8 List list = service.getSeminareByName(seminar); 8 10 return new AjaxXmlBuilder().addItems(list, "seminar", "result").toString(); 11 } 12} Abb. 4: Beispiel eines Servlets, das die Verarbeitung des Requests auf dem Server vornimmt. ORDIX News 3/2006 19 Java/XML Die zweite Möglichkeit besteht darin, eine Version bereitzustellen, die auch ohne JavaScript und damit auch ohne Ajax auskommt. Links ► ► ► ► ► ► [1] http://maps.google.com [2] http://labs.google.de/ [3] http://wiki.script.aculo.us/scriptaculous/show/Demos [4] http://ajaxtags.no-ip.info/ [5] http://ajaxtags.sourceforge.net/ [6] http://sourceforge.net/project /showfiles.php?group_id=140499 ► [7] http://prototype.conio.net/ ► [8] http://www.mozilla.org/projects/venkman/ Glossar Ajax Asynchronous JavaScript and XML. Ajax ist ein Konzept, das den asynchronen Austausch von XMLNachrichten zwischen Client und Server erlaubt, ohne dass eine Webseite komplett neu geladen werden muss. Tag Library Bestandteil der JSP-Spezifikation zur Erstellung dynamischer Webseiten. JSP Java Server Pages; Technologie von Sun Microsystems zur Erstellung dynamischer Webseiten. XML JavaScript Extensible Markup Language; Standard zur Gliederung von Daten in einer Baumstruktur. Clientseitig vom Browser interpretierte Skriptsprache. Grenzen und Möglichkeiten der Ajax-Tags Das Beispiel zeigt, dass eine Funktion wie die Autovervollständigung mit wenig Aufwand zu erstellen ist. Problematisch kann jedoch die Fehlersuche werden. Ist zum Beispiel das Attribut „baseUrl“ falsch gesetzt und die Serverkomponente kann nicht gefunden werden, wird kein JavaScript-Fehler generiert. Da bleibt dann nur die Möglichkeit, sich dem Fehler mit entsprechenden „alert()“-Ausgaben in der Prototype-Bibliothek zu nähern oder einen JavaScript-Debugger zu verwenden. Für den Mozilla und Firefox gibt es z. B. den Venkman JavaScriptDebugger. [8] Des Weiteren ist es schwierig, die Funktionalitäten der Tags auf spezielle Bedürfnisse anzupassen. So lässt sich z. B. das <ajax: callout> Tag dazu verwenden, ein Pop-Up zu generieren, welches mit Daten vom Server versorgt wird. Zusätzlich ist zu bedenken, dass JavaScript unter Umständen von unterschiedlichen Browsern verschieden interpretiert wird. Deshalb sollte die Web-Anwendung auf mehreren Brow­ sern getestet werden. Performance Ein Entscheidungskriterium zum Einsatz von Ajax können auch Performance-Überlegungen sein. Generell lässt sich festhalten, dass bei der Verwendung von Ajax eine größere Anzahl von (XMLHTTP)-Requests an den Server gesendet werden als bei klassischen Web-An­ wen­dungen. Dies führt zu einer höheren Beanspruchung des Servers. Andererseits können über XML­ HTTP-Requests Daten gezielter angefordert werden, sodass sich das zu übertragene Datenvolumen unter Umständen deutlich reduzieren lässt. Fazit Hat man sich einmal mit den Ajax-Tags vertraut gemacht, lassen sich diese zügig auf andere Anwendungsfälle übertragen. An den passenden Stellen eingesetzt, führt die asynchrone, im Hintergrund ablaufende Kommunikation mit dem Server zu mehr Komfort bei der Bedienung. Das zu übertragende Datenvolumen lässt sich in bestimmten Fällen stark reduzieren, was zu schnelleren Antwortzeiten führt. Ob dies die höhere Last durch eine größere Anzahl von Server-Requests wert ist, muss sicher im Einzelfall entschieden werden. Die Dokumentation der Tags ist – wie häufig bei Open Source Projekten – sehr knapp gehalten. Es lohnt sich ein Blick auf die vorhandenen Beispiele der Ajax-Tags-Seite, da diese gut nachvollziehbar und umzusetzen sind. Ein Blick in die ajaxtags.js Bibliothek verrät, dass dieses Pop-Up über den JavaScript Eventhandler OnMouseOver erstellt wird. Soll dieses Verhalten geändert werden und das Pop-Up z. B. bei einem OnClick erscheinen, muss die Bibliothek verändert werden. Das hat zur Folge, dass sie bei jedem Update auf eine neue Version neu angepasst werden muss. Ein weiterer Aspekt, den der Entwickler bedenken sollte, ist, dass JavaScript im Browser abgeschaltet werden kann. In diesem Fall wäre es vorteilhaft, dem Benutzer mitzuteilen, dass die Webseite JavaScript benötigt. 20 Jens Stahl ([email protected]). ORDIX News 3/2006 Aktuell Rekorde, Rekorde, Rekorde: ORDIX Open mit neuen Höchstleistungen „Rekorde sind zum Brechen da …“ so Organisator Hans-Walter Schmitt zufrieden zu dem ORDIX Open, „dem“ offenen Turnier im Rahmen des diesjährigen Schnellschach-Festivals in Mainz. Vom 15. - 20.08.2006 fanden in der Rheingoldhalle in Mainz die so genannten „Chess Classic“ statt – ein Schachturnier der ungewöhnlichen Art, das von Jahr zu Jahr eine größere Pilgerschaft anzieht. „ORDIX Open: Hol dir den Titel!“ Das ORDIX Open hat sich als Meltingpott von Deutschlands viel­ seitigstem und teilnehmerstärksten Schachfestival auch in diesem Jahr hervorgetan. Neben dem traditionellen Stelldichein der Spit­ zengrößen des Weltschachs fanden sich zahlreiche Nach­wuchs­ schachspieler ein. Abb. 1: Tilo Knott (2. v. l.) im Simultan gegen Welt­ ranglistendritten Levon Aronjan. Im Vordergrund Prof. Eckhard Freise, der durch die Günter Jauch Show als erster Millionengewinner Bekanntheit erlangte. Damit avanciert das ORDIX Open als tra­diti­o­nelles, offenes Schnell­ schachturnier zum Schmelztiegel der Be­gegnungen in der Schach­ welt. Die Teilnehmerzahl klet­terte auf 632 Personen, davon 58 Groß­ meister, 10 Großmeisterinnen, 44 Internationale Meis­ter und 9 weib­ liche Internationale Meis­ter. Unter dem Motto „Hol dir den Titel!“ verloste ORDIX zwei Plätze gegen den Weltranglistenzweiten Anand und den Weltranglistendritten Aron­jan (Armenien). Wir gratulieren den Gewinnern der ORDIX Ver­­­lo­sungen, Herrn Tilo Knott (Schachclub Brett vor‘m Kopp, Frank­furt) und Herrn Andreas Maatz aus Frankfurt, die sich kühn ihren Gegnern stellten. 11 Runden dominierend Abb. 2: „Jung und Alt“ boten sich Paroli, hier Dr. Doris Lübbers gegen Vlada Boyarchenko. Foto: Harald Fietz, Berlin Als Gewinner des ORDIX Open ging letztlich kein geringerer als der Ex-Weltmeister Rustam Kasimdschanow hervor. In elf Runden gab der gebürtige Usbeke nur drei Remis ab. Summa Summarum fand sich eine illustre Gesellschaft zusammen. Weitere Informationen und Links finden Sie im Internet unter http://www.ordix.de/ordixopen/ Die Redaktion ([email protected]). Abb. 3: Siegerehrung des ORDIX Open (v. l.): Chef-Organisator Hans-Walter Schmitt und ORDIX Marketingleiterin Helma Jenniches gratulierten dem ORDIX Open Gewinner und Ex-Weltmeister Rustam Kasimdschanow, der den Weltranglistenzwölften Schachrijar Mamedjarow hauchdünn besiegte. Die Plätze 3, 4 und 5 gingen an den favorisierten Weltranglistenneunten GM Alexander Morosewitsch, GM Pentela Harikrishna und GM Mikhail Mchedlishvili. Foto: Harald Fietz, Berlin ORDIX News 3/2006 21 - herausnehmbare Übersicht - Datenbanken Oracle SQL Oracle SQL für Experten Oracle SQL für Umsteiger Oracle Datenbankprogrammierung mit PL/SQL Oracle PL/SQL Aufbau mit LOB Programmierung Oracle Datenbankadministration Grundlagen Oracle Datenbankadministration Aufbau Oracle Backup und Recovery Oracle Tuning und Monitoring Oracle Troubleshooting Workshop Oracle Real Application Cluster RAC Oracle 10g Neuheiten Oracle Security Workshop Oracle Data Guard Workshop Oracle RMAN Workshop Oracle Grid Control Workshop Oracle Replikation Workshop Oracle Advanced Queuing Workshop Informix SQL Informix Dynamic Server Administration Informix Tuning und Monitoring Informix Backup und Recovery mit ON-Bar IBM DB2 UDB für Unix/Windows SQL Grundlagen IBM DB2 UDB für Unix/Windows Administration Grundlagen IBM DB2 UDB für Unix/Windows Version 9.1 Neuheiten MySQL Administration Microsoft SQL Server Administration Microsoft SQL Server 2005 Neuheiten Microsoft SQL Server Hochverfügbarkeits-Workshop Programmierung Einführung in die objektorientierte Programmierung Perl Programmierung Grundlagen Perl Programmierung Aufbau Einführung in XML XML Programmierung unter Java mit DOM und SAX PHP Programmierung Grundlagen PHP Programmierung Aufbau Shell, Awk und Sed Java-J2EE Java Programmierung Grundlagen Java Programmierung Aufbau Java GUI Entwicklung mit Swing J2EE für Entscheider Einführung in J2EE JSP und Servlet Programmierung EJB Programmierung Webanwendungen mit Java Server Faces (JSF) Java Web Services Entwicklung mit Hibernate Systemmanagement BMC PATROL/Performance Manager Basics BMC PATROL/Performance Manager Customizing and Development 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 Linux Netzwerkadministration Server-Virtualisierung mit XEN Linux Hochverfügbarkeits-Cluster Unix/Linux Security Solaris Systemadministration Grundlagen Solaris Systemadministration Aufbau Solaris 10 für erfahrene Systemadministratoren Solaris Containers Solaris für Unix Umsteiger Multivendor-Systemadministration Projektmanagement IT-Projektmanagement Grundlagen des IT-Controlling Wiesbaden Saarbrücken 1790,00 1190,00 790,00 1790,00 1190,00 1890,00 1890,00 1890,00 1890,00 1890,00 1490,00 1890,00 1190,00 1490,00 1490,00 1090,00 790,00 1090,00 1590,00 1790,00 1890,00 1090,00 1790,00 1890,00 790,00 1090,00 1790,00 790,00 790,00 1090,00 1590,00 1590,00 1090,00 790,00 1590,00 1090,00 1590,00 1590,00 1590,00 1590,00 450,00 1090,00 1590,00 1590,00 1590,00 1090,00 1090,00 1890,00 1490,00 1090,00 1090,00 1290,00 1090,00 1590,00 1590,00 1590,00 1090,00 1190,00 1590,00 1890,00 1890,00 1890,00 790,00 1890,00 1890,00 1890,00 1190,00 *) Preise pro Seminar pro Teilnehmer in Euro. Alle Preise gelten zzgl. ges. MwSt. **) Inhousepreise auf Anfrage. Lippstadt Einige der hier aufgeführten Bezeichnungen sind eingetragene Warenzeichen ihrer jeweiligen Inhaber. Irrtümer vorbehalten. Für weitere Informationen und Fragen zu individuell zugeschnittenen Seminaren, Ausbildungsreihen oder Inhouse Schulungen stehen wir jederzeit gerne zur Verfügung. Auf Wunsch senden wir Ihnen auch unser komplettes Seminarprogramm zu. 22 ORDIX ORDIX News News 3/2006 3/2006 KW 52 KW 51 KW 50 KW 49 KW 48 Dezember KW 47 KW 45 KW 44 November KW 43 KW 42 KW 41 KW 40 Oktober Preis in EURO*)**) KW 46 Aus- & Weiterbildung Seminartermine http://training.ordix.de Online-Anmeldung und stets aktuelle Seminarinhalte und Termine! KW 13 KW 12 KW 11 KW 10 KW 9 März KW 8 KW 7 KW 6 KW 5 Februar KW 4 KW 3 KW 2 KW 1 Januar Aus-Oktober & Weiterbildung 2006 - März 2007 Preis in EURO*)**) 1790,00 1190,00 790,00 1790,00 1190,00 1890,00 1890,00 1890,00 1890,00 1890,00 1490,00 1890,00 1190,00 1490,00 1490,00 1090,00 790,00 1090,00 1590,00 1790,00 1890,00 1090,00 1790,00 1890,00 790,00 1090,00 1790,00 790,00 790,00 1090,00 1590,00 1590,00 1090,00 790,00 1590,00 1090,00 1590,00 1590,00 1590,00 1590,00 450,00 1090,00 1590,00 1590,00 1590,00 1090,00 1090,00 1890,00 1490,00 1090,00 1090,00 1290,00 1090,00 1590,00 1590,00 1590,00 1090,00 1190,00 1590,00 1890,00 1890,00 1890,00 790,00 1890,00 1890,00 1890,00 1190,00 Datenbanken Oracle SQL Oracle SQL für Experten Oracle SQL für Umsteiger Oracle Datenbankprogrammierung mit PL/SQL Oracle PL/SQL Aufbau mit LOB Programmierung Oracle Datenbankadministration Grundlagen Oracle Datenbankadministration Aufbau Oracle Backup und Recovery Oracle Tuning und Monitoring Oracle Troubleshooting Workshop Oracle Real Application Cluster RAC Oracle 10g Neuheiten Oracle Security Workshop Oracle Data Guard Workshop Oracle RMAN Workshop Oracle Grid Control Workshop Oracle Replikation Workshop Oracle Advanced Queuing Workshop Informix SQL Informix Dynamic Server Administration Informix Tuning und Monitoring Informix Backup und Recovery mit ON-Bar IBM DB2 UDB für Unix/Windows SQL Grundlagen IBM DB2 UDB für Unix/Windows Administration Grundlagen IBM DB2 UDB für Unix/Windows Version 9.1 Neuheiten MySQL Administration Microsoft SQL Server Administration Microsoft SQL Server 2005 Neuheiten Microsoft SQL Server Hochverfügbarkeits-Workshop Programmierung Einführung in die objektorientierte Programmierung Perl Programmierung Grundlagen Perl Programmierung Aufbau Einführung in XML XML Programmierung unter Java mit DOM und SAX PHP Programmierung Grundlagen PHP Programmierung Aufbau Shell, Awk und Sed Java-J2EE Java Programmierung Grundlagen Java Programmierung Aufbau Java GUI Entwicklung mit Swing J2EE für Entscheider Einführung in J2EE JSP und Servlet Programmierung EJB Programmierung Webanwendungen mit Java Server Faces (JSF) Java Web Services Entwicklung mit Hibernate Systemmanagement BMC PATROL/Performance Manager Basics BMC PATROL/Performance Manager Customizing and Development 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 Linux Netzwerkadministration Server-Virtualisierung mit XEN Linux Hochverfügbarkeits-Cluster Unix/Linux Security Solaris Systemadministration Grundlagen Solaris Systemadministration Aufbau Solaris 10 für erfahrene Systemadministratoren Solaris Containers Solaris für Unix Umsteiger Multivendor-Systemadministration Projektmanagement IT-Projektmanagement Grundlagen des IT-Controlling Informationen und Anmeldung: ORDIX AG Westernmauer 12-16 33098 Paderborn Tel.: 05251 1063-0 ORDIX AG Kreuzberger Ring 13 65205 Wiesbaden Tel.: 0611 77840-00 ORDIX ORDIX News News 3/2006 3/2006 zentrales Fax: 0180 1 ORDIX 0 bzw. 0180 1 67349 0 E-Mail: [email protected] Online-Anmeldung: http://training.ordix.de 23 Datenbanken - Titelthema Datenkompression unter Oracle Mit der Oracle 9i R2 Enterprise-Version wurde die Möglichkeit der Tabellenkompression, genauer DATA SEGMENT COMPRESSION, eingeführt. Dieser Artikel gibt einen Überblick zum Einsatz dieser Option. bol-Tabelle. Mehrfach auftretende Datenwerte werden ausschließlich in der Symboltabelle gespeichert. Dieser Artikel wendet sich an Datenbankadministratoren und -entwickler, die sich in Data-Warehouse-Umgebungen mit der komprimierten Speicherung von Daten beschäftigen. Data-Warehouse-Umgebungen bestehen sehr häufig aus wenigen großen Tabellen, die teilweise redundante Informationen enthalten. Mit Blick auf Speicherkapazitäten und Zugriffszeiten kommt der Wunsch auf, die Daten in komprimierter Form abzulegen. Mit der Oracle 9i R2 Enterprise-Version wurde die DATA SEGMENT COMPRESSION eingeführt. Um einen Überblick über den Einsatz dieser Option zu bekommen, möchten wir zunächst die Arbeitsweise, die Konfigurationsmöglichkeiten und die Verwendung darstellen. Anschließend geben einige Beispiele aus einem aktuellen Projekt einen ersten Eindruck zu der möglichen, zu realisierenden Platzersparnis und zeigen die Auswirkungen auf die Performance auf. Eine weitere Möglichkeit zur Komprimierung von Daten ist die KEY COMPRESSION. Sie kann bei Indizes bzw. indexorganisierten Tabellen (IOT) verwendet werden. Dieses Feature werden wir in diesem Artikel jedoch nicht behandeln. Im restlichen Platz innerhalb des Blocks werden die eigentlichen Datensätze gespeichert. Diese enthalten für die komprimierten Datenwerte Zeiger auf die Symboltabelle. Die Platz­ersparnis ergibt sich aus der Verwendung der Zeiger, die weniger Speicherplatz als die Datenwerte erfordern. Abbildung 1 zeigt das Prinzip der Datenspeicherung innerhalb eines Blocks einer normalen beziehungsweise einer komprimierten Tabelle. Die dargestellten Datensätze würden in komprimierter Form 291 Byte und unkomprimiert 379 Byte belegen. In einem Block einer komprimierten Tabelle existieren komprimierte und unveränderte Datenwerte und Datensätze nebeneinander. Die wesentlichen Eigenschaften dieser Kompression auf Blockebene sind Folgende: Wie wird komprimiert? • Ein Datenblock enthält die vollständige In­ Die Datenkompression erfolgt auf Blockebene. Beim Einfügen in die Tabelle wird nach mehrfach auftretenden Datenwerten innerhalb eines Blocks gesucht. Für diese wird in jedem Block ein eigener Bereich reserviert. In diesem Bereich liegt die so genannte Sym- Tabelle PODIUM_LE_TOUR Tabelle PODIUM_LE_TOUR_COMP 02 02 02 01 01 01 00 00 00 2005 2005 2005 2004 2004 2004 2003 2003 2003 Jan ULLRICH 3 T-MOBILE TEAM Ivan Basso 2 TEAM CSC 1 DISCOVERY CHANNEL TEAM Lance ARMSTRONG Ivan Basso 3 TEAM CSC 2 T-MOBILE TEAM Andreas KLÖDEN US POSTAL-BERRY FLOOR Lance ARMSTRONG 1 Alexandre VINOKOUROV 3 TEAM TELEKOM Jan ULLRICH 2 TEAM BIANCHI Lance ARMSTRONG 1 US POSTAL-BERRY FLOOR formation über alle Datensätze innerhalb des Blocks. Für einen Zugriff auf die Daten sind keine weiteren Informationen notwendig. 04 08 0A 05 07 0B 03 06 DISCOVERY CHANNEL TEAM 05 08 0B Andreas KLÖDEN 07 0A 03 06 09 Alexandre VINOKOUROV 08 TEAM TELEKOM 04 07 TEAM BIANCHI 03 06 09 S 0B S 0A S 09 S 08 S 07 S 06 S 05 S 04 S 03 S 02 S 01 S 00 TEAM CSC T-MOBILE TEAM US POSTAL-BERRY FLOOR 3 2 1 Ivan Basso Jan ULLRICH Lance ARMSTRONG 2005 2004 2003 DatenTabelle SymbolTabelle Abb. 1: Prinzip der Speicherung von Daten in einer normalen und in einer komprimierten Tabelle. 24 ORDIX News 3/2006 Datenbanken • Für den Anwender ändert sich beim Zugriff • • auf die Daten nichts. Die Kompression ist vollständig unsichtbar. In komprimierter Form enthalten die Blöcke mehr Datensätze. Dadurch sinkt die I/O-Last. Die Daten werden in komprimierter Form im Database-Buffer gehalten. Es können also mehr Datensätze im zur Verfügung stehenden Puffer gehalten werden. -- Anlegen einer komprimierten Tabelle CREATE TABLE podium_le_tour_comp ( jahr DATE, name VARCHAR2(100), platz Number, team VARCHAR2(100) ) COMPRESS; Abb. 2: Anlegen einer komprimierten Tabelle. Wie wird die Datenkompression eingerichtet? Um eine komprimierte Tabelle zu erstellen, wird beim Anlegen die Option COMPRESS angegeben (siehe Abbildung 2). Damit wird die Eigenschaft COMPRESSION der Tabelle auf „ENABLED“ gesetzt. Beim Einfügen von Daten werden dann zunächst die Möglichkeiten einer Komprimierung getestet. Sehr wichtig ist auch, dass der Speicherparameter PCTFREE automatisch den Wert „0“ erhält. Es wird also kein Puffer für eventuelle Updates gelassen. Dies ist jedoch auch nicht notwendig, da Updates dem Konzept der Komprimierung widersprechen. Nachträgliche Änderungen der Daten einer kom­primierten Tabelle führen zunächst zu einer Dekomprimierung. Nach der Änderung wer­ den die Datensätze dann in unkomprimierter Form wieder eingefügt. Dadurch geht die angestrebte Platzersparnis also verloren. Weitere Möglichkeiten der Verwendung der Eigenschaft COMPRESSION sind • die Definition auf TABLESPACE-Ebene. Dann erben alle Tabellen diese Eigenschaft. • die Definition für eine partitionierte Tabel- • le. Die Kompression kann entweder für die gesamte Tabelle oder für einzelne Partitionen eingerichtet werden. die Definition für eine MATERIALIZED VIEW. Diese kann direkt beim Anlegen mit „CREATE MATERIALIZED VIEW ... COMPRESS AS ...;“ erfolgen. Mit „ALTER MATERIALIZED VIEW ... COMPRESS;“ werden die Daten beim nächsten Aktualisieren in komprimierter Form abgelegt. Wann wird die Datenkompression verwendet? Die Datenkompression erfolgt ausschließlich beim Einfügen von Daten in die Tabelle. Das beschriebene Verfahren wird jedoch nur angewandt, wenn mehrere Datensätze in einer Aktion eingefügt werden. Bei Datenmengen, die kleiner als ein Block sind, wird keine Kompres­ ORDIX News 3/2006 -- Umwandeln einer bestehenden Tabelle -- normal -> komprimiert ALTER TABLE tab_name MOVE COMPRESS; -- komprimiert -> normal ALTER TABLE tab_name MOVE NOCOMPRESS; Abb. 3: Befehle zum Umwandeln einer bestehenden Tabelle. sion durchgeführt. Zum Einfügen muss eine der folgenden Blockoperationen (BULK LOAD oder BULK INSERT) verwendet werden: • Verwendung des SQL*Loader mit der Option „direct = true“ • Verwendung des Befehls „CREATE TABLE . . . AS SELECT . . . “ • Einfügen von Daten mit „INSERT /*+ APPEND */ . . . “ • Einfügen von Daten mit „INSERT /*+ PARALLEL( tab_name, n) */ . . . “ Wird keine der hier aufgeführten Möglichkeiten benutzt, werden die Datensätze in normaler Form, also ohne Kompression, eingefügt. Bei der Umwandlung einer bestehenden Tabelle in eine komprimierte mit „ALTER TABLE ... COMPRESS;“ wird nur die Eigenschaft umgeschaltet. Die bestehenden Datensätze werden nicht geändert. Dies erfolgt erst mit den in Abbildung 3 aufgeführten Befehlen mit dem Zusatz „MOVE“. Bei der Ausführung wird eine neue Tabelle mit der Eigenschaft COMPRESSION angelegt. Danach erfolgt das Einfügen der Daten in komprimierter Form, das Löschen der alten Tabelle und das Umbenennen der neuen Tabelle. Was bringt die Datenkompression? Die Auswirkungen der Datenkompression hängen stark von der jeweiligen Tabelle ab. Wir wollen hier beispielhaft mit den Daten aus DBA_OBJECTS allgemeine Trends aufzeigen. In Abbildung 4 sind die Unterschiede beim Anlegen mit „CREATE TABLE ... AS SELECT * FROM dba_objects;“ dargestellt. Die komprimierte Tabelle belegt nur noch 43 Prozent des ursprünglichen Platzes. Daraus ergeben sich weniger Schreiboperationen bei den Daten und beim Redo-LOG. Auf der anderen Seite sind die CPU-Belastung und der PGA-Speicherverbrauch deutlich angestiegen. 25 Datenbanken Wie sieht das nun beim Zugriff auf die Daten aus? Diese Frage ist quantitativ noch schwieriger zu beantworten, da sie entscheidend durch die jeweilige Abfrage beeinflusst wird. Bei einem FULL TABLE SCAN spielt das geringere Datenvolumen eine entscheidende Rolle. Bei wiederholten Zugriffen auf die Daten einer komprimierten Tabelle wird es die Tatsache sein, dass mehr Datensätze im Puffer gehalten werden können. Es ist auf jeden Fall mit einer höheren CPU-Belastung zu rechnen, da die Daten für die Verwendung entkomprimiert werden müssen. Typ CPU used pga memory Physical writes redo size NOCOMPRESS 101 1.123.272 1407 11.649.765 COMPRESS 360 4.203.464 604 4.995.936 Abb. 4: Ergebnisse für das Anlegen einer Tabelle mit NOCOMPRESS bzw. COMPRESS. Anzahl Zeilen Anzahl Blöcke Tabelle T_NO_COMP Tabelle T_COMP 5897468 5897468 64094 13782 CREATE TABLE ... 38 Sekunden 117 Sekunden 1. SELECT Anzahl (alle) 22 Sekunden 5 Sekunden 2. SELECT Anzahl (alle) 9 Sekunden 3 Sekunden 1. SELECT Anzahl (unterschiedliche) 47 Sekunden 35 Sekunden 2. SELECT Anzahl (unterschiedliche) 40 Sekunden 33 Sekunden Abb. 5: Beispiel für die Auswirkungen der Kompression auf die Größe, das Erstellen und typische Abfragen. Die Auswirkungen am Beispiel Die möglichen Auswirkungen der Kompression lassen sich am Besten an einem praktischen Beispiel aus einem aktuellen Projekt verdeutlichen. In Abbildung 5 sind dazu Informationen zu einer Tabelle dargestellt, die sich gut für eine Kompression eignet. Die komprimierte Tabelle belegt nur noch ca. 22 Prozent des ursprünglichen Platzes. Für typische Abfragen sind dann Ausführungszeiten angegeben und zwar 1. für den Fall, dass die Daten vollständig von der Platte geladen werden müssen und 2. für den Fall, dass sich die Daten schon im Puffer befinden. In diesem Fall sind die beiden Ziele „Platzersparnis“ und „Performance-Gewinn“ erfüllt. Kann ich Datenkompression einsetzen? Jetzt kommen wir zu der entscheidenden Frage: Wann eignet sich eine Tabelle für den Einsatz der Datenkompression? Absolut nicht geeignet sind Tabellen, wenn die Daten mit Einzeloperationen eingefügt und/ oder durch UPDATEs verändert werden. Dann bewirkt die Kompression im günstigsten Fall nichts. Bei regelmäßigen UPDATEs wirkt sie sich sogar negativ auf Platzbedarf und Performance aus. Sehr gut geeignet sind Tabellen, die folgende Bedingungen erfüllen: • Die Tabelle enthält redundante Informatio­ nen. • Die Daten werden mit Blockoperationen Glossar Block PCTFREE IOT DBA_OBJECTS PGA-Speicher eingefügt. Physikalische Speichereinheit von Oracle Datenbanken. Freier Bereich im Block für spätere Änderungen. • Die Daten werden einmal geschrieben und Index Organized Tables; Tabellen, die in der Regel nur noch aus einem Index bestehen. Oracle-interne Tabelle mit Data Dictionary Einträgen. Prozessspeicher für Sortierungen. Fazit Links ► [1] Sanjay Mishra: „Compressing Data for Space and Speed“, Oracle Magazine March/April 2004, www.oracle.com/technology/oramag/oracle/04-mar/o24tech_data.html danach nur gelesen. Die Datenkompression ist keine Allzweckwaffe. Sie führt jedoch, wie das Beispiel aus der Praxis gezeigt hat, in Einzelfällen zu enormer Platzersparnis und bringt auch einen Performancegewinn. Vor der Anwendung der Kompression für eine Tabelle ist jedoch eine genaue Analyse der Auswirkungen auf das Einfügen der Daten und die Ausführungszeiten von typischen Abfragen notwendig. ► [2] Meikel Poess, Hermann Baer: „Decision Speed: Table Compression In Action“, www.oracle.com/technology/oramag/webcolumns/2003/techarticles/poess_tablecomp.html Dr. Klaus Uebelgünn ([email protected]). 26 ORDIX News 3/2006 Aktuell Larry Ratlos: Zugriffsrechte unter Unix Frisch aus den Sommerferien zurück, geht Larry frohen Mutes wieder an seine Arbeit. Doch lange bleibt er nicht so entspannt, wie er es von seinem Urlaub auf Mallorca war. Larry hat für einen Kollegen aus dem Marketing das Webserver-Verzeichnis /usr/local/cgi-bin freigegeben, so dass dort nun jeder Kollege seine eigenen Daten ablegen und verwalten kann. Daher erlaubt Larry nun auch der entsprechenden Benutzergruppe Vollzugriff auf das Verzeichnis. Zunächst ist alles in Ordnung und die Mitarbeiter sind auch soweit zufrieden. Doch bereits nach einigen Stunden klingelt das Telefon heiß. Es ist der Kollege Peter Paranoia. „Larry, ich bin schockiert!!!“, brüllt er in die Leitung. „Meine Daten, die ich heute morgen mit Mühe und Sorgfalt auf den Webserver geladen habe, sind plötzlich verschwunden. Ein Skandal!“ Larry versucht Kollege Paranoia zu beruhigen und verspricht ihm, sich sofort um die Lösung des Problems zu kümmern. Zunächst sieht er in die Logdateien, um Aufschlüsse über den Datenverlust zu erhalten. Lösung der Aufgabe 2/2006 Das Rätsel, was Larry in der letzten Ausgabe zu lösen hatte, war die Suche nach einem Paket, mit dem man Daten zu einem System sammeln kann, um diese später auszuwerten. Leider hat Larry aus der ORDIX News Leserschaft dieses Mal keinen Lösungshinweis erhalten. Wahrscheinlich waren die Leser auch alle im Sommerurlaub. Daher hat er kurzerhand einen ORDIX Kollegen gefragt, der ihm freudestrahlend die Lösung präsentierte: Gesucht war das Paket sysstat. Es stellt u. a. die Werkzeuge sadc und sar zur Verfügung. Diese ermöglichen es, verschiedene Messwerte, wie z. B. CPU-Last oder I/O-Werte, zu erfassen und in einen Report zu überführen. Des Weiteren installiert es unter /usr/lib/sa einige Skripte, die eine Überwachung beziehungsweise Auswertung des Systems durchführen. Die Aktivierung des Monitorings kann durch das Kommando rcsysstat start oder aber durch Verlinkung von /etc/init.d/sysstat Die Logdateien zeigen, dass die von Peter Paranoia eingegebenen Daten von Lutz Löscher versehentlich gelöscht wurden. Daraus schließt Larry, dass es sich hier um ein Benutzerrechteproblem handelt. in den Defaultrunlevel erfolgen. Beides erzeugt einen systemweiten Crontab-Eintrag unter /etc/cron.d/sysstat. Larry steht vor einem Rätsel Dieser bewirkt alle zehn Minuten indirekt über das Skript sa1 einen Aufruf von sar. Da die Standardeinstellung von sa1 lediglich eine Momentaufnahme der Systemlast erstellt, empfiehlt sich die Erweiterung des o. g. Crontab-Eintrags um die Messdauer und Häufigkeit, z. B. 10-mal für jeweils 60 Sekunden. Wie kann er es nun erreichen, dass der Vollzugriff weiterhin für alle Kollegen möglich bleibt, aber dass sich die Mitarbeiter nicht gegenseitig die Dateien löschen können? #activity reports every 10 minutes everyday -*/10 * * * * root /usr/lib/sa/sa1 -*/10 * * * * root Können Sie Larry helfen? Dann senden Sie Ihren Lösungsvorschlag bis zum 27.10.2006 an [email protected]. Die drei pfiffigsten Lösungsvorschläge werden wir in der nächsten Ausgabe veröffentlichen. ORDIX News 3/2006 /usr/lib/sa/sa1 60 10 Die Messergebnisse werden binär unter /var/log/sa abgelegt. Mit dem Skript /usr/lib/sa/sa2 (oder direkt mit dem Kommando sar) können die Daten für ein Reporting weiter verarbeitet werden. 27 Datenbanken - Titelthema Reihe Oracle Objekttypen von A - Z (Teil I): Oracle Objekttypen – Von Cluster bis XML Wer eine Oracle Datenbank in der aktuellen Version installiert, findet in der View dba_objects schnell vierzig und mehr unterschiedliche Objekttypen. Für den Datenbankadministrator ist es unabdingbar, einen Überblick über diese unterschiedlichen Typen zu haben, um bei Ex- und Imports, im Fehlerfall oder bei Analysen richtig reagieren zu können. Dieser Artikel wendet sich an Datenbankadministratoren und -entwickler, die einen Überblick über die Objekttypen von Ora­ cle bekommen möchten. • CLUSTER • CONSUMERGROUP • CONTEXT Cluster Ziel der Artikelreihe Diese Reihe erklärt anhand kleiner Beispiele die Verwendung und Funktion der von Oracle zur Verfügung gestellten Objekttypen. Ziel ist es, einen schnellen Überblick über den jeweiligen Typ zu bekommen. Eine tiefgehende Ausarbeitung diverser Objekttypen bleibt anderen ORDIX News Artikeln vorbehalten. Die unterschiedlichen Typen und deren Anzahl in einer Datenbank lassen sich wie folgt ermitteln: SELECT FROM GROUP BY ORDER BY object_type, count(*) AS anzahl dba_objects object_type object_type; Auf Los geht’s los Im ersten Teil dieser Reihe besprechen wir die Objekttypen, die mit dem Buchstaben „C“ beginnen: CREATE CLUSTER geldautomat_clu ( automat_id NUMBER(6) ) SIZE 512; CREATE TABLE geldautomat ( automat_id NUMBER(6), standort VARCHAR2(64) ) CLUSTER geldautomat_clu( automat_id ); CREATE TABLE geldautomat_inhalt ( automat_id NUMBER(6), fach_id NUMBER(2), fach_inhalt NUMBER(6), fach_anzahl NUMBER(4) ) CLUSTER geldautomat_clu( automat_id ); CREATE INDEX geldautomat_idx ON CLUSTER geldautomat_clu; Abb. 1: Befehlssequenz für zwei Tabellen zum Anlegen eines Clusters. 28 Ein Cluster ist ein Objekt, welches die Daten von einer oder mehreren Tabellen in einem Segment speichert. Alle Tabellen eines Clusters müssen eine oder mehrere gemeinsame Spalten enthalten, diese gemeinsamen Spalten heißen Cluster-Schlüssel. Auf dem Cluster-Schlüssel muss zwin­gend ein Index angelegt werden. Dieser Index heißt Cluster-Index und ist vom Objekttyp Index. Der Cluster sorgt dafür, dass Daten aller Tabellen mit gleichem Cluster-Schlüssel in denselben phy­sikalischen Blöcken liegen. Ein Cluster ist besonders dann interessant, wenn die Tabellen im Cluster häufig verknüpft (JOIN) und über den Cluster-Schlüssel angesprochen werden. Technisch gesehen findet also eine Optimierung des Join auf physikalischer Ebene statt, ohne das logische Datenmodell zu ändern. Besonders vorteilhaft ist es, wenn die Größe aller Zeilen zu einem Cluster-Schlüssel bekannt ist, dann kann beim Erstellen des Clusters der entsprechende Speicherplatz reserviert werden. Dies geschieht mit dem Schlüsselwort SIZE. Aus Sicht der Anwendung ist der Cluster also dann interessant, wenn bei der 1:n-Bezie­ hung die Zahl n eine Konstante ist. Im folgen­den Beispiel gehören z. B. zu jedem Geldauto­maten eine feste Anzahl an Fächern für Geld­scheine. Beim Anlegen der Cluster-Tabellen wird nun die Zuordnung zum Cluster und der ClusterSchlüssel der jeweiligen Tabelle angegeben. Die Tabellen sind – ähnlich wie bei einer Index Organized Table – keine Segmente mehr, der Speicherplatz ist dem Cluster zugeordnet. In Abbildung 1 sind die SQL-Kommandos zu finden mit denen ein Cluster angelegt wird. Da- ORDIX News 3/2006 Datenbanken mit können alle Tabellen vollkommen transparent verwendet werden. Die Abbildung 2 zeigt die Tabellen GELDAUTOMAT und AUTOMAT_ INHALT, welche zu einem Cluster zusammengeführt werden. Wie bereits erwähnt, spielt der Cluster ins­be­­ sondere bei ganz bestimmten Performance-Anforderungen seine Stärke aus. Dafür ist die Verwaltung im Detail oft schwieriger. So kommen Cluster-Tabellen beispielsweise beim Löschen nicht in den Recycle Bin. Auch die Komprimierung lässt sich auf Cluster-Tabellen nicht anwenden. Lesen Sie dazu auch den Artikel zum Titelthema „Datenkompression unter Oracle“ auf Seite 24 in dieser Ausgabe. Eine sehr spezielle Form des Clusters ist der Sorted Hash Cluster, dessen Zugriff noch schnel­ ler ist, da dessen interne Struktur sortiert ist. Cluster finden sich in der Praxis ausgesprochen selten. Lediglich im Data Dictionary ist ein halbes Dutzend von ihnen vorhanden. GELDAUTOMAT 1 Kaiserstr. 2 Hauptbahnhof 3 Königsallee .... 1 Kaiserstr. 1 1 200,1 2 50,1 3 10,- 50 73 85 2 Hauptbahnhof 2 1 200,2 2 50,2 3 10,- GELDAUTOMAT 3 Königsallee AUTOMAT_INHALT 1 1 200,1 2 50,1 3 10,2 1 200,2 2 50,.... 30 13 55 ... ... ... 50 73 85 12 88 4 ... Oracle Blöcke ... GELDAUTOMA_CLU AUTOMAT_INHALT Abb. 2: Darstellung eines Clusters mit zwei Tabellen. Consumer Group Eine Consumer Group wird im Zusammenhang mit Ressourcenplänen erstellt. Die Gruppe besteht aus einem Namen, einem Kommen­tar und einem Algorithmus zur CPU-Zuteilung. Der Gruppe können Sessions zugeordnet werden und die Gruppe selbst wird einem Ressourcenplan zugeordnet. Zur Erstellung und Verwaltung dient das Paket dbms_resource_manager. Etwas detaillierter wird dieser Objekttyp zusammen mit dem Objekttyp RESOURCE PLAN besprochen. Context Wer kennt sie nicht, die SYS_CONTEXT Funktion, die als Nachfolger der Funktion USERENV zahlreiche Informationen über die Session zurückgibt. Der erste Parameter der Funktion stellt dabei einen so genannten CONTEXT dar, der zweite Parameter ein Attribut dieses CONTEXT. So gibt z. B. sys_context( 'userenv', 'service_name' ) den Service zurück, über den die Session mit der Datenbank verbunden ist. Was allerdings nicht so viele Administratoren wissen, ist, dass ein CONTEXT auch mit Hilfe von SQL und PL/SQL angelegt werden kann. Dies geschieht im ersten Schritt durch Anlegen des CONTEXT. Hinweis In der Oracle Dokumentation gibt es keine Auflistung aller Objekttypen. Die Informationen zu den diversen Ojekttypen müssen an verschiedenen Stellen nachgelesen werden. Der Oracle Database Administrator‘s Guide gibt im Part IV „Schema Objects“, Kapitel 13 „Managing Schema Objects“ eine Einführung in die wichtigsten Objekte. Im Database Reference Guide werden die verschiedenen Data Dictionary Views erläutert. Dabei gibt dba_objects einen Überblick und meist findet sich auch eine View dba_<object_type>. Für spezielle Objekttypen ist meist eine gesonderte Dokumentation zu verwenden. So findet sich im Application Developer‘s Guide eine gute Einführung in Large Objects und im Data Warehousing Guide eine Einführung in Dimensions und Materialized Views. DBMS_SESSION.SET_CONTEXT initialisieren. Die Prozeduren müssen dabei durch die Applikation aufgerufen werden. Über die Funktion SYS_CONTEXT ('mycontext', 'param1') kann dann der aktuelle Wert ermittelt werden. Ein CONTEXT wird häufig verwendet, um Fine Grained Access Control zu implementieren. Ein interessantes Sicherheitsmerkmal im Zusammenhang mit der so genannten Virtual Private Database. CREATE CONTEXT mycontext USING mypackage; In der nächsten Ausgabe geht es weiter mit „D“ wie Database Link. Das Paket mypackage enthält nur eine oder meh­rere Prozeduren, welche die Parameter des neuen CONTEXT mit Hilfe des Befehles Martin Hoermann ([email protected]). ORDIX News 3/2006 29 Java/XML - Titelthema Lucene unter Last beim Deutschen Rundfunkarchiv Für Recherchen von Medien aus Rundfunk und Fernsehen verwendet das Deutsche Rundfunkarchiv Lucene als Suchmaschine. Wir zeigen die Möglichkeiten der Integration und Grenzen der Leistungsfähigkeit der Suchmaschine Lucene auf. Dieser Artikel richtet sich an Entwickler und Software-Architekten, die sich für das Thema Lucene interessieren. Das Internet zeigt, wie es geht: Suchbegriff eingeben und Suche starten. Wieso sollte also der Anwender von Individualsoftware aufwändige Eingabemasken ausfüllen? Tut es nicht auch eine Eingabezeile für den Suchbegriff? Braucht der Java-Entwickler eine Suchmaschine, so nimmt er einfach Lucene. Braucht die Anwendung eine Suchmaschine? Suchmaschinen werden im Internet verwendet, um Dokumente, die bestimmte Suchbegriffe enthalten, aufzufinden. Aber auch bei datenbankbasierten Anwendungen kann der Wunsch nach einer Suchmaschine aufkommen. Überall dort, wo nicht nur atomare Informationen wie etwa Name, Geburtsjahr oder Personalnummer abgespeichert werden, ist möglicherweise eine Suchmaschine von Nutzen. In dieser Situation ist auch das Deutsche Rundfunkarchiv, das Me­dien aus Rundfunk und Fernsehen archiviert. Ein wesentlicher Schlüs­sel zu diesen Medien stellt der beschreibende Text dar. Über diesen lassen sich Medien in Zusammenhang mit Personen, Orten oder Themen finden. So ist der Einsatz einer Suchmaschine für die Anwendungen des Deutschen Rundfunkarchivs kein Neuland: Seit Jahren wird diese Aufgabe mit Hilfe einer Großrechneranwendung erledigt. In Zusammenhang mit der bevorstehenden Ab­lösung des Großrechners wurde für eine Anwendung Lucene als Suchmaschine ein- gesetzt. Das Projekt wurde beim Hessischen Rund­funk unter Beteiligung der ORDIX AG durchgeführt. Technische Details der Anwendungs­ architektur Die Archivanwendung zur Recherche von Bildmaterial ist als reine Web-Anwendung realisiert worden. Die eingesetzten Komponenten sind der Abbildung 1 zu entnehmen. Tomcat wird als Web-Container verwendet. Das Struts-Framework unterstützt die Ver­arbeitung eingehender HTTP-Requests und die Erzeugung der Response. In dieses Framework sind die Controller- und Anzeigelogik eingebettet. Suchanfragen werden in erster Linie an die Lu­ cene-Komponente weitergeleitet. Diese greift auf ein Verzeichnis mit Index-Dateien zu, das in der Abbildung als Lucene-Index dargestellt ist. Dabei wurden neben Volltextsuchen auch so ge­nannte Filter implementiert: Das Suchergebnis wird aufgrund von Feldinhalten einge­ schränkt. Das Ergebnis der Suche sind einerseits Schlüs­ sel für die gesuchten Medien. Darüber hinaus sind im Lucene-Index andererseits aber auch Daten zu den Medien abgelegt, die bei der Über­­sicht der Suchergebnisse dargestellt wer­ den. Media-Server Datenbank Tomcat : Hibernate : HttpClient : Inverter : Lucene Lucene-Index Abb. 1: Architektur der Archivanwendung. 30 : Struts Detailinformationen zu einzelnen Medien werden aus der Datenbank ermittelt. Als Persistenz­ schicht kommt Hibernate zum Einsatz. Ein Web­ Server liefert die Mediendaten. Der Zu­griff wird über die Anwendung autorisiert und erfolgt über die Komponente HttpClient des Jakarta Commons-Projektes. Eine eigenständige Anwendung, die als Komponente „Inverter“ in der Abbildung 1 auftaucht, sorgt für die Aktualität des Lucene-Index. In festgelegten Intervallen wird diese Anwendung gestartet. Sie aktualisiert den Lucene-Index anhand der protokollierten Veränderungen in der Datenbank. ORDIX News 3/2006 Java/XML : JCAClient 1: ConnectionSpecLucene() 2: getConnection() : ConnectionSpecLucene 3.1: ConnectionRequestInfoLucene() : ConnectionFactoryLucene : ConnectionRequestInfoLucene 3.2: allocateConnection() : ConnectionManagerLucene 3.2.1a: matchManagedConnection() Kontrolle über • Ressourcen-Verbrauch • Timeout 3.2.1b: createManagedConnection() : ManagedConnectionFactoryLucene 3.2.1a.1: isConnectionRequestForMe() 3.2.1b.1: AbstractManagedConnectionLucene() : AbstractManagedConnectionLucene 3.2.1b.2.1: ConnectionLuceneQuery() : ConnectionLuceneQuery Abb. 2: Kollaborationsdiagramm für den Zugriff auf eine Lucene Connection. Erste Erfahrungen JCA: Gute Connections zu Managern mit Factories In der vorgestellten Archivanwendung erweist sich Lucene als zuverlässig. Sowohl parallel durchgeführte Suchen als auch die gleichzeitig ablaufende Indexierung sind unproblematisch. Die Performance ist zufriedenstellend. Zur Kapselung des Suchdienstes wird das von Sun vorgeschlagene Architekturmodell JEE Connector Architecture eingesetzt. Diese Architektur wird von Sun empfohlen, um Dienste an einen Application Server anzubinden. Auch wenn diese Architektur nicht gerade als übersichtlich zu bezeichnen ist, gibt es doch einige überzeugende Gründe. Zunächst handelt es sich um einen Standard: Die Erfahrungen während der Entwicklung zeig­ ten aber auch, dass Lucene in einem instabilen Umfeld problematisch sein kann: Kommt es zu Ausnahmesituationen, so muss be­rücksichtigt werden, dass Lucene File Hand­ ler Betriebssystem-Ressourcen beanspruchen. Werden diese nicht freigegeben, so führt dieser Mangel zu einem zeitweiligen Stillstand der Anwendung. Dabei ist es nicht ausreichend, dass in Zusammenhang mit der Garbage Collection die Ressourcen automatisch wieder freigegeben werden. Eine Garbage Collection findet nämlich nur dann statt, wenn die Ressource „verfügbarer Hauptspeicher“ (Heap) knapp wird. Dann kann es aber bereits zu spät sein und die Ressource File-Handler ist aufgebraucht. Die ge­samte Anwendung kommt zum Stillstand. Da­­ mit ist trotz aller Hilfestellung durch Java der Entwickler gefordert. Sorgfältig muss dieser mit den Ressourcen umgehen. Um die weitere Entwicklung zu unterstützen, ist das nächste Ziel, die Suche mit Lucene so zu kapseln, dass eine zentrale Kontrolle über den Ressourcen-Verbrauch durchgeführt werden kann. ORDIX News 3/2006 Es ist davon auszugehen, dass diese Architektur mehrfach erprobt wurde. Eine Dokumentation für die Implementierung und Verwendung ist dadurch verfügbar. Aber auch die Perspektive, die Suchfunktionalität zukünftig durch einen JEE Application Server zur Verfügung zu stellen, spricht für diesen Ansatz. Für die Implementierung werden die Schnittstellen, die zu diesem Architekturmodell gehören, in Form des Pakets connector.jar heruntergeladen. Abbildung 2 zeigt in einem Kollaborationsdiagramm die wesentlichen Klassen im Einsatz. Auf den ersten Blick wimmelt es nur so von Managern und Factories. Alle haben jedoch – genau wie in einer gut organisierten Behörde – ihre abgesteckten Verantwortlichkeiten. Da ist die Schnittstelle zum JCA-Client, die ConnectionFactory. Nur über sie kommt ein Client an die begehrte Connection heran. Die ConnectionFactory nimmt nur Anträge für die Ausgabe einer Connection über ein Antragsformular, die ConnectionSpec, entgegen. Hier trägt der Antragsteller sein Begehren ein und spezifiziert damit den Suchdienst. Beauftragt wird dann der ConnectionManager, eine Connection zu organsieren. Dieser nimmt aber nur Formulare vom Typ ConnectionRequestInfo an. Diese werden „freundlicherweise“ von der ConnectionFactory erstellt. Der ConnectionManager prüft, ob er eine Connection aus einem Pool herausgeben kann oder ob eine neue Connection zu erstellen ist. 31 Java/XML wird diese Aufgabe von einer Connection­Fac­ tory erledigt, die eine ManagedConnection er­ stellt. 1.1: getRecordFactory() : ConnectionFactoryLucene : RecordFactory 1: getRecordFactory() : Interaction 2: createMappedRecord() : JCAClient : InputRecord 5: execute() 3: put() 5.1: IndexedRecord() : IndexedRecord 4: createInteraction() Bei der ausgeführten Implementierung werden Connections nur einmalig verwendet. D. h., dass sie nach ihrer Erzeugung, Verwendung und Freigabe unmittelbar zerstört werden. : Connection 6: get() Der ConnectionManager wird intern informiert, wenn eine Connection freigegeben oder ungültig wird. Dazu ist der ConnectionManager direkt als ConnectionEventListener imple­mentiert. Abb. 3: Kollaborationsdiagramm für die Suche. Das Erstellen einer neuen Connection ist mit geringem Aufwand möglich und eine neue Connection hat unmittelbar auch Zugriff auf die aktuellsten Daten. Der Gebrauch einer Connec­ tion ist der Abbildung 3 zu entnehmen. 600 500 Zeit (ms) 400 1 2 2 1 2 300 200 Suchbegriff Suchbegriffe Suchbegriffe mit AND Suchbegriff Fuzzy Suchbegriffe, proximity 100 0 1 10 100 1000 10000 100000 Treffer Abb. 4: Antwortzeiten der Suche bei unterschiedlichen Suchanfragen. 25000 20000 Antwortzeit [ms] Zur Ausführung einer Suche fordert ein JCAClient eine Interaction von der Connection an. Über die Methode execute wird die Suche ausgeführt. Durch eine Interaction­Spec und durch Records werden die Parameter zur Spezifikation der Art der Suche angegeben. Die InteractionSpec definiert dabei die auszuführende Funktion, die übergebenen Records enthalten die erforderlichen Argumente. Das Ergebnis der Suche sind Records, im konkreten Fall als List implementiert. Nichts als Suchen 15000 Mittelwert Maximalwert 10000 5000 Durch die Kapselung des Suchdienstes ist es nun möglich, die Suche allein hinsichtlich ihres Lastverhaltens zu untersuchen. Selbstverständlich hängen die konkreten Ergebnisse eines solchen Lasttests wesentlich von der eingesetzten Hardware und dem Betriebssys­tem ab. 0 0 10 20 30 40 50 60 Anzahl Benutzer Abb. 5: Antwortzeiten der Suche bei parallelen Suchanfragen. Der ConnectionManager ist Herr über die Ressourcen. Einerseits wird die Anzahl der herausgegebenen Connections von ihm beschränkt. Andererseits wird ihm die wichtige Aufgabe zugeteilt, zu prüfen, ob herausgegebene Connections vom Benutzer vergessen wurden. Diese werden aktiv beseitigt. Der ConnectionManager kann damit eventuell auftretende Ressourcen-Lecks stopfen. Ein ConnectionManager wird oftmals mit dem Application Server mitgeliefert. Er kann aber auch ohne großen Aufwand selbst implementiert und dann auch auf einem Application Server eingesetzt werden. Faktisch hält der ConnectionManager eine Liste von Connections in einem Pool vor. Muss eine neue Connection erstellt werden, so 32 Darüber hinaus wird die eingesetzte Java Virtual Machine die Ausführungsgeschwindigkeit beeinflussen. Die Lasttests werden auf einem Entwicklungs­ rechner unter dem Betriebssystem Micro­soft Windows XP durchgeführt. Ziel des hier durchgeführten Lasttests ist in erster Linie, die Einflussgrößen zu ermitteln, die bei der Auslegung der Suchmaschine berücksichtigt werden müssen: • Hat die Anzahl der Treffer einen Einfluss? • Spielt die Komplexität der Suchanfrage ei­ ne Rolle? • Wie wirken sich parallel ausgeführte Such­ anfragen aus? • Welchen Einfluss hat die Größe des Index? ORDIX News 3/2006 Java/XML Zielgröße ist die Antwortzeit. Wie lange muss ein Benutzer auf die Suchergebnisse warten? 200 einfache Suche In einem ersten Versuch werden die Parameter „Anzahl der Treffer“ und „Komplexität der Suchanfrage“ untersucht. Dazu werden Suchanfragen gestellt, die zu einer unterschiedlichen Ergebnismenge führen (siehe Abbildung 4). Antwortzeit [ms] 180 160 140 120 100 80 60 40 20 Die Versuchsreihen unterscheiden sich in diesem Fall nur durch die Suchanfragen. In der ersten Reihe wird nach einem ein­zelnen Suchbegriff gefragt. Durch die Variation des Suchbegriffs werden unterschiedlich viele Treffer gefunden. In diesem Fall 10, 1000 und 10000. Auch wenn sich die Trefferzahlen um Größenordnungen unterscheiden, hat dieses keinen Einfluss auf die Antwortzeit. Diese schwankt zwischen 0,15 und 0,25 Sekunden. Die Anzahl der Treffer stellt damit keinen Parameter dar, der die Antwortzeit beeinflusst. Auch die Komplexität der Anfrage spielt in der Regel keine Rolle. Untersucht wurde dabei die Angabe von 2 Such­ begriffen, die logische Verknüpfung von Suchanfragen und die durch Lucene angebotene Pro­ xi­mity-Bedingung. Bei dieser Bedingung kann angegeben werden, wie weit zwei Suchbegriffe voneinander entfernt vorkommen müssen. Nur die Fuzzy-Suche erhöht die Antwortzeit sig­ nifikant. Bei dieser Suche wird nach dem Suchbegriff und nach ähnlichen Begriffen gesucht. Dabei werden ähnliche Begriffe mit einem Fuzzy-Algorithmus gesucht. Diese Art der Suche führt ungefähr zu einer Verdoppelung der Antwortzeiten. Einen unbestreitbaren Einfluss auf die Antwort­ zeit hat die Anzahl der parallel durchgeführten Suchen. Dadurch, dass bei der Implementierung des Suchdienstes für jede Suche neue Ressourcen verwendet werden, ist nicht zu erwarten, dass parallele Suchen zu einer Verringerung der Antwortzeit führen. Im günstigsten Fall kann mit einem linearen Ver­ lauf der Antwortzeit gerechnet werden: Dop­pelt so viele parallele Suchanfragen führen zu einer doppelt so langen Antwortzeit für jede einzelne Suchanfrage. Die Antwortzeiten (siehe Ab­bildung 5) kommen diesem Idealverhalten sehr nahe. In der Untersuchung wird die Anzahl der gleich­ zeitigen Suchanfragen von 1 bis 50 variiert. Auf­ getragen sind einerseits die Mittelwerte und die zugehörige Standardabweichung. Zusätzlich sind die Maximalwerte angegeben. ORDIX News 3/2006 0 5.000 10.000 15.000 20.000 25.000 30.000 35.000 Anzahl Dokumente Abb. 6: Einfluss der Dokumentenanzahl. Dem Diagramm ist zu entnehmen, dass die Ant­wortzeiten leicht überproportional ansteigen. Die Ursachen für diesen Anstieg lassen sich möglicherweise durch den Verwaltungs­aufwand der Threads erklären. Auffällig ist das Verhalten bei 30 parallelen Such­anfragen. Hier kommt es zu einem erheblichen Anstieg der Antwortzeiten. Dieser Anstieg ist auf das Speichermanagement der Virtuellen Maschine zurückzuführen. Hier findet parallel zur Suche mit großer Sicher­heit eine Garbage Collection statt. Für die weiteren Versuche musste der verfügbare Hauptspeicher vergrößert werden. Als letzter Parameter wird die Anzahl der zu durchsuchenden Dokumente von 30.000 auf 10.000 reduziert. Die Abbildung 6 zeigt, dass dieser Parameter einen erheblichen Einfluss auf die Antwortzeiten hat. Die Abbildung verdeutlicht, dass sich ausgehend von einem linearen Verhalten pro Dokument die Antwortzeit um 0,002 Millisekunden verlängert. Dieser Wert wirkt zunächst einmal klein. Muss jedoch davon ausgegangen werden, dass die Anzahl der Dokumente vielleicht die Millionengrenze überschreitet, so wird die Antwortzeit für eine einzelne Abfrage bereits um die 2 Sekunden betragen! Fazit Die Lasttests bestätigen zunächst den ersten Eindruck, dass Lucene eine zuverlässige und robuste Suchmaschine ist. Die Kapselung von Lucene in eine Java-Connector-Architektur vereinfacht den programmiertechnischen Umgang mit der Suchmaschine. Die Ergebnisse zeigen, dass für den gegebenen Anwendungsfall die Antwortzeiten ausreichend sind. Zur Einordnung der Ergebnisse ist zu berücksichtigen, dass 50 gleichzeitige Suchprozesse in der Realität durch ungefähr 200 Benutzer (concurrent user) verursacht werden. Dennoch dürfen die wesentlichen Parameter, die Einfluss auf die Antwortzeiten nehmen, nicht vernachlässigt werden: „Anzahl der parallelen Suchprozesse“ und „Anzahl der Dokumente“. Beide Parameter gehen linear in die Berechnung der Antwortzeiten ein. Für Anwendungen mit einer großen Datenmen­ge (einige 100.000 Datensätze) oder mit einer sehr großen Zahl an Benutzern sind die Grenzen durch die Geduld der Benutzer definiert. Um den Einsatzbereich von Lucene zu erweitern, sollten neben der Universalstrategie, leistungsfähigere Hardware einzusetzen, noch die folgenden Strategien geprüft werden: 33 Java/XML Links ► ► ► ► ► ► ► [1] Hibernate: http://www.hibernate.org/ [2] JCA: http://developers.sun.com/sw/building/codesamples/integration_jca.html [3] JCA: http://java.sun.com/j2ee/connector/ [4] HttpClient: http://jakarta.apache.org/commons/httpclient/ [5] Lucene: http://lucene.apache.org/ [6] Struts: http://struts.apache.org [7] Tomcat: http://tomcat.apache.org/ Glossar Concurrent Benutzer, die gleichzeitig mit einer Web-Anwendung user arbeiten. DBMS Datenbank Management System. Programme für den Umgang mit Datenbanken (z. B. Oracle, Informix, DBS). Garbage Vorgang der Java Virtual Machine, bei dem nicht mehr Collection benötigte Objekte zerstört werden, um ihren Speicherplatz erneut nutzen zu können. Heap Speicherbereich eines Programms, der vom Programm selbst verwaltet werden kann. JCA Java Connector Architecture. Standardisiertes Entwurfs­muster zur Einbindung von Informationssystemen in eine JEE-Umgebung. JEE Java Enterprise Edition. Erweiterung von Java für Server-Anwendungen. Thread Teilprozess eines Programms. Mehrere Teilprozesse können parallel ausgeführt werden. Durch eine Verteilung der Last auf mehrere WebContainer, die jeweils ihren eigenen Index haben, skaliert die Antwortzeit mit der Anzahl der Web-Container-Instanzen. Bei Unix/Linux-Servern steht die Möglichkeit zur Verfügung, den Index auf ein RAM-basiertes Dateisystem zu legen. Damit kann die Ausführungszeit erheblich beschleunigt werden. Der Lucene-Index kann auch in einer Datenbank abgelegt werden. Hierdurch ist ein Vorteil durch Caching-Mechanismen des DBMS zu erwarten. Braucht auch Ihre Anwendung eine Volltextfunktionalität? ORDIX berät Sie gern. Dr. Stefan Koch ([email protected]). Impressum Herausgeber: ORDIX AG Aktiengesellschaft für Software­ent­wick­lung, Beratung, Schulung und Systemintegration, Paderborn Redaktion: Helma Jenniches, Sascia Brinkmann V.i.S.d.P.: Wolfgang Kögler Anschrift der Redaktion: ORDIX AG Westernmauer 12 - 16 33098 Paderborn Tel.: 05251 1063-0 Fax: 0180 1673490 Gestaltung/Layout: Sascia Brinkmann, Stefanie Heither Auflage: 8.600 Druck: Druckerei Reike GmbH, Paderborn Autoren dieser Ausgabe: Holger Bartnick, Christian Fertsch, Klaus Günther, Stefanie Heither, Michael Heß, Martin Hoermann, Helma Jenniches, Dr. Stefan Koch, Wolfgang Kögler, Roger Niemeyer, Markus Schreier, Thorsten Schuhmacher, Jens Stahl, Dr. Klaus Uebelgünn 34 Copyright: ORDIX AG. Alle Rechte vorbehalten. Eine Haftung für die Richtigkeit der Veröffentlichungen kann trotz sorgfältiger Prüfung durch die Redaktion vom Herausgeber nicht übernommen werden. Die Zeitschrift ORDIX News wird von der ORDIX AG an ausgesuchte 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­regungen, Kritik und Anmerkungen zu den Themen, aber auch für interessante Ideen sind wir immer offen und dankbar. Sie erreichen die Redaktion auch per E-Mail unter [email protected]. Wir freuen uns auf Ihr Feedback. ORDIX News 3/2006 Datenbanken Auditing für die Datenbank Die Sicherheit der Datenbank soll durch die Nutzung von AUDITING-Optionen erhöht werden. Der Artikel zeigt einen Überblick über die bisher zur Verfügung stehenden Auditing-Möglichkeiten. Darüber hinaus werden auch die Neuigkeiten des Oracle 10g Release 2 in diesem Umfeld diskutiert. Häufig ist es nicht nur wichtig zu wissen, wie eine Zugriffskontrolle auf firmensensitive Daten zu gestalten ist, sondern auch, wie eine sinn­ volle Protokollierung von Zugriffen und Aktio­ nen innerhalb der Datenbank erfolgt. Hierbei hilft das Auditing. Das klassische Auditing unterscheidet vier Formen: • Mandatory Auditing • SYS Auditing (Das sind alle Aktionen, die vom User SYS durchgeführt werden.) • Standard Auditing • Fine Grained Auditing (FGA) Auf die beiden letztgenannten Formen, das Standard Auditing und das FineGrained Auditing (FGA), kann man einen besonderen, programmiertechnischen Einfluss nehmen. Mandatory Auditing Das Mandatory Auditing wird vom System au­ tomatisch ausgeführt. Es kann nicht vom Ad­­mi­ nistrator unterdrückt werden. Unter Unix werden die Informationen per Default in das Verzeich­nis $ORACLE_HOME/rdbms/audit geschrieben. Microsoft zeigt diese Information in seiner Ereignis-Anzeige an. Dabei werden sämtliche Startup- und Shutdown Aktionen bei Benutzern mit SYSDBA- oder SYSOPER-Privilegien mit­ pro­tokolliert. Unter Unix kann ein anderes Verzeichnis als Aufbewahrungsort dieser Informationen genutzt werden, sobald der Datenbankparameter AUDIT_FILE_DEST verändert wird. Ebenso kann nun durch das Setzen von AUDIT_ TRAIL=XML die Ausgabe als XML-Datei in das Betriebssystem erfolgen. Mit der neuen View V$XML_AUDIT_TRAIL können die DBAs diese Informationen mit einer Abfrage lesen. SYS Auditing Bei dieser Form des Auditing werden alle Aktionen des Users SYS und der Benutzer mit SYSDBA- und/oder SYSOPER-Privilegien mitprotokolliert. Die Aktivierung erfolgt durch das Setzen des statischen init.ora Parameters AUDIT_SYS_OPERATIONS. Die Speicherung erfolgt analog zu der beim Mandatory Auditing. Für diese Form ist das Setzen des Parameters AUDIT_TRAIL nicht erforderlich! ORDIX News 3/2006 Der Artikel richtet sich an Datenbankadministratoren, die sich besonders mit den Schutz beziehungsweise der Kontrolle des Zugriffs auf firmensensitive Daten beschäftigen. Bei diesen beiden Formen des Auditing besteht die Gefahr darin, dass geeignete Vorkehrungen für die Vermeidung des Plattenüber­ laufs getroffen werden müssen. Ebenfalls besteht die Möglichkeit, dass Benutzer mit entsprechen­ den DBA-Rechten auf Betriebssystemseite die gesammelten Informationen verändern oder löschen. Zur Behebung dieser Möglichkeit der Manipulation dient nun bei Unix-basierten Systemen die Nutzung der SYSLOG() Funktionalität als neues Feature. Das Besondere daran ist, dass diese Information beliebig (z. B. auf einem Remote Server) in einer syslog.conf Datei abgelegt werden kann, ohne dass die DBAs eine Zugriffsmöglichkeit besitzen. Der Informationsfluss erfolgt hier über die Zuweisung zu einem Daemonprozess. Standard Auditing Das Einschalten des Standard Auditing erfolgt über den Parameter AUDIT_TRAIL. Das Standard Auditing zielt dabei auf die Protokollierung von: • Privilegien: Auditing von Systemprivilegien • Schemaobjekte: SELECT, DML-Statement, GRANT, REVOKE auf • Tabellen, Views, Sequenzen, Standalone Stored Procedures oder Functions und Packages Statements: DDL- oder DML-Statements Für das Standard Auditing mittels Statements, Privilegien und Schemaobjekten kann eine Klausel über erfolgreiches Ausführen (WHEN­ EVER SUCCESSFUL), nicht erfolgreiches Ausführen (WHENEVER NOT SUCCESSFUL) oder für beide Auditing Zustände (both) gesetzt werden. Hinzu kommt beim Statement Auditing noch die Option, ob das gleiche Statement innerhalb einer Session nur einmal (BY SESSION) oder jedesmal bei Ausführung in derselben Session (BY ACCESS) einen Audit-Eintrag erzeugen soll. Es ist dabei zu beachten, dass das Auditing über die Privilegien da­bei etwas detaillierter ist als ein Auditing über Schemaobjekte. Zum Beispiel wird beim Statement Auditing mit der TABLE Klausel auf CREATE TABLE, DROP TABLE und ALTER TABLE Bezug genommen. Beim Privileg Auditing (z. B. DROP TABLE) wird nur auf eines von diesen drei Privilegien abgezielt. Die Speicherung der hiermit generierten Informationen kann entweder im Betriebssystem stattfinden oder innerhalb der Datenbank. 35 Datenbanken Das Standard Auditing arbeitet bei der Speicherung der Informationen innerhalb der Datenbank mit der Tabelle SYS.AUD$ und die Abfrage der dort gespeicherten Informatio­nen wird mit der View DBA_AUDIT_TRAIL durchgeführt. Fine Grained Auditing (FGA) Im Gegensatz dazu beruht das Fine Grained Auditing (FGA) auf der Protokollierung von Transaktionen, die auf einer Tabelle oder View ausgeführt werden und eine entsprechende Policy besitzen. Die Informationen für ein Auditing mit FGA werden aus der Tabelle SYS.FGA_LOG$ mittels der Data Dictionary View DBA_FGA_ AUDIT_TRAIL gewonnen. Darüber hinaus kann ab Oracle 10g Release 2 nun auch die View DBA_COMMON_AUDIT_TRAIL genutzt werden, die Informationen aus dem Standard Auditing und aus dem FGA aufnimmt. Das FGA kann im Gegensatz zum Standard Auditing ohne das Setzen der Oracle Datenbankparameter AUDIT_TRAIL und AUDIT_ SYS_OPERATIONS initialisiert werden: Es ist besonders beim FGA zu beachten, dass es in früheren Releases nur dann funktionierte, wenn der Optimizer auf cost-based und nicht auf rule-based eingestellt war. Bei der rule-based Methode kann ein unnötiger Audit Event Trigger ausgelöst werden und die Audit-Informationen unnötig anwachsen lassen. FGA und Trigger Im Gegensatz zum Einsatz von Triggern ermöglicht das FGA, neben den DML- auch abgesetzte SELECT-Statements gegen die zugrunde liegende Tabelle oder View mitzuprotokollieren. Vorteile von FGAs gegenüber Triggern sind: • Trigger lösen bei jedem DML-Statement • • • aus. Das FGA veranlasst nur ein einmaliges Audit bei einer Policy. Durch die nur einmalige Auslösung kommt es zu einem Performancevorteil! Das FGA ist auch für SELECT-Statements möglich; bei Triggern sind SELECT-Statements nicht möglich. Trigger können keinen weiteren Insteadof-Trigger beobachten, der an demselben Objekt feuert. Das FGA beobachtet alle Policies einer Basistabelle. FGA und Standard Auditing Das FGA bietet folgende Vorteile gegenüber dem Standard Auditing: DBMS_FGA Package • Es werden feiner granulierte Informatio­nen Mit dem DBMS_FGA-Package können die FGA-Einträge sehr einfach verwaltet werden. Hierbei wird zuerst eine Audit Policy erstellt, mit der dann weiter gearbeitet werden kann. Diese Policy sammelt Audit-Informationen. Die mit Oracle 10g Release 2 eingeführte Neuerung der spaltenbasierten Beschränkung bei Tabellen und Views lässt das FGA für einzelne, sicherheitsrelevante Spalten zu. Hierdurch werden nun weniger Auditing-Informationen generiert als in den vorhergehenden Releases. generiert. • Ausschluss unnützer oder sogar falscher Informationen. • Das FGA ist jederzeit zu implementieren. • Es ist kein Ändern von Datenbankparametern wie z. B. AUDIT_TRAIL nötig. Durch die innerhalb der Datenbank integrierte Funktionalität ist ein Umgehen des Auditings unmöglich. Auslösemechanismen Für das Auslösen einer Policy reicht es aus, wenn die Audit-Bedingung auf NULL gesetzt wird bzw. ganz fehlt. Dadurch wird gewährleistet, dass auf jeden Fall ein Audit-Eintrag erzeugt wird, sobald die entsprechende Aktion (Statement-Typ) auf einer Spalte durchgeführt wird. Die Audit-Funktion wird immer als autonome Transaktion ausgeführt, die damit keinerlei Einfluss auf das eigentliche Statement hat. Das bedeutet, dass auch die eigentliche Policy immer einen Audit-Datensatz generiert. Auch das Protokollieren eines Merge-Kommandos ist damit möglich. Dazu müssen nur die entsprechenden Update und Insert Statements in einer Policy vorhanden sein. Für das Auditing wird dann hierbei nur ein Satz gebildet. Glossar FGA DML Fine Grained Auditing. Fein granuliertes Auditing. Data Manipulation Language. Über DML-Kommandos werden Daten (Zeilen) eingefügt, gelöscht oder geändert. DDL Data Defnition Language. Über DDL-Kommandos werden Datenstrukturen gepflegt (z. B. Tabellen anlegen oder löschen). Policy Sicherheitsregel Durch die feiner zu granulierende Informations­ generierung wird es dem DBA durch das FGA erleichtert, auf Zugriffe von sensitiven Daten entsprechend zu reagieren. Er kann sich zum Beispiel sofort informieren lassen, wenn ein Zugriff erfolgt. Des Weiteren werden Informationen nicht unnötig gesammelt, sondern es kann ganz gezielt protokolliert werden, wie und von wem die sensitiven Informationen innerhalb der Datenbank genutzt werden. Fazit Die dargestellten Möglichkeiten helfen, die Zugriffe und Aktionen auf eine Datenbank und auf firmensensitive Daten gezielt zu protokollieren. Sie sind nicht zur Schaffung von „Datenfriedhöfen“ gedacht! Deshalb ist ein sehr sorgsamer Umgang mit diesen Funktionalitäten notwendig. Denn eine übertriebene Datensammlung geht immer mit einem Performanceverlust einher. Klaus Günther ([email protected]). 36 ORDIX News 3/2006 Java/XML Gut gepuffert ist halb gewonnen – Reihe Hibernate (Teil III) Caching in Hibernate Im dritten Artikel unserer Reihe zum Hibernate-Framework widmen wir uns dem Thema Caching. Neben einem theoretischen Einstieg liefert dieser Artikel auch praktische Tipps für den Gebrauch und die Anpassung des Hibernate-Caches an die eigenen Bedürfnisse. Warum puffern? Das Puffern (engl.: Caching) von Daten ist in der EDV ein „alter Hut“. Die Vorgehensweise basiert darauf, dass häufig benötigte Daten von einem langsamen Medium (z. B. Festplatte) in den Hauptspeicher kopiert werden. Dieser Artikel richtet sich an Softwareentwickler und -architekten, die Hibernate in ihren Projekten einsetzen (wollen). Gleichzeitig werden Zugriffe auf diese Daten über eine Zwischenschicht geleitet. Diese prüft zunächst immer den Puffer auf die angeforderten Daten. Der 1st Level Cache ist kurzlebig und mehrfach vorhanden. Er wird von der aktuellen Hibernate-Session selbst implementiert und ist immer aktiv. Alle Objekte, die eine Session geladen hat, werden bis zum Ende der Session auch von dieser in ihrem 1st Level Cache abgelegt. Mit dem Schließen der Session werden auch die Referenzen aus dem zugehörigen 1st Level Cache entfernt. Sind diese dort vorhanden, so werden die Daten aus dem schnellen Puffer geliefert und nicht vom langsamen Quellmedium geladen. Man spricht von „Cache-Hits“ im positiven Fall und „Cache-Misses“, wenn die Daten erst in den Puffer eingelesen werden müssen. Der 2nd Level Cache ist optional, langlebiger und nur einmal pro Applikation vorhanden. Er wird durch die SessionFactory über die Schnittstelle „CacheProvider“ lediglich gesteuert, aber nicht direkt durch Hibernate implementiert. Hibernate liefert das Interface „CacheProvider“, welches die Schnittstelle zwischen der SessionFactory und einer Cache-Implementierung definiert. Diese Art von Caching ist allgegenwärtig: egal, ob es der Inhalt eines BIOS-Bausteins im PC ist, oder ob es die Bilder einer häufig besuchten Website sind – sie alle werden gepuffert. Von letzterer gibt es verschiedene Ausprägungen, insbesondere wird zwischen JVM-Level und Cluster-wide unterschieden. Clusterweite Cache-Implementierungen können über JVM-Grenzen hinaus auch Verbunde mit einem gemeinsamen Cache versorgen. In Hibernate dient das Puffern dazu, die Anzahl an benötigten Datenbankzugriffen zu reduzieren. Ohne Puffer müsste Hibernate bei jedem Laden eines Objekts durch eine Session oder Query auf die Datenbank zugreifen. Hebel hier, ... Generell erfolgt die Konfiguration des 2nd Level Caches zweigleisig. Hibernate selbst hat keinen direkten Einfluss auf die Konfiguration des Puffers, also z. B. auf dessen Größe. Dies erfolgt spezifisch für die jeweilige CacheProvider-Implementierung. Ein Bei- Dies würde unweigerlich zu einer starken Belastung der Datenbank und einer spürbar langsameren Ausführungszeit der auf Hibernate basierenden Anwendung führen. Um diese K.O.-Kriterien zu umgehen, legt Hibernate-Objekte, die initial von einer Session geladen werden, im Puffer ab. Bei einem erneuten Zugriff wird das Objekt dann bei aktuellem Pufferstatus aus diesem geliefert und die zeitaufwändige Datenbankabfrage entfällt. Andernfalls wird das Objekt neu aus der Datenbank abgefragt, und dabei auch der Puffer aktualisiert. Und das auch noch gleich doppelt! Intern verwendet Hibernate zum Puffern ein zweistufiges Verfahren in Form von 1st und 2nd Level Caches (siehe Abbildung 1). ORDIX News 3/2006 Abb. 1: Aufbau des Hibernate-Caches. 37 Java/XML Cache Mode Beschreibung read only Für Objekte, deren Attribute niemals verändert wer­ den. nonstrict read/write Sollte verwendet werden, wenn eine parallele Ände­ rung eines Datensatzes unwahrscheinlich ist. In diesem Modus ist nicht garantiert, dass die vom Cache gelieferte Version des Objekts auch die aktuell in der Datenbank vorhandene ist. read/write Sichert die Konsistenz zwischen dem Puffer und den Sätzen in der Datenbank zu („read committed“). transactional Sichert für den gesamten Lauf einer Transaktion zu, dass die darin enthaltenen Daten gültig sind („repeat­ able read“). Abb. 2: Konfigurationsparameter für den Cache Mode. <class name="de.ordix.Fixwert" mutable="false"> <cache usage="read-only"/> .... </class> Abb. 3: Konfiguration des Cachings für eine Klasse. <ehcache> <diskStore path="java.io.tmpdir"/> <defaultCache maxElementsInMemory="5000" eternal="true" overflowToDisk="true" /> <cache name="de.ordix.BigObject" maxElementsInMemory="10" eternal="false" timeToIdleSeconds="300" timeToLiveSeconds="600" /> </ehcache> Abb. 4: Konfigurationseinstellungen aus ehcache.xml. spiel für den CacheProvider Easy Hibernate Cache (EHCache) zeigen wir im weiteren Verlauf des Artikels. Auf der Hibernate-Seite wird lediglich definiert, dass und wie der 2nd Level Cache genutzt werden soll. In der Standardeinstellung ist der 2nd Level Cache selbst bereits aktiv, so dass lediglich das Caching für einzelne Klassen aktiviert werden muss. Innerhalb der Mapping-Dateien (*.hbm.xml) wird pro Klasse die zu verwendende Art des Caching definiert. Hibernate steuert damit das Verhalten bei konkurrierenden Zugriffen und kennt die in Abbildung 2 gezeigten Ausprägungen. Die Einstellung wird im Mapping unterhalb von <class> mit dem Element <cache> vorgenommen. Das in Abbildung 3 gezeigte Beispiel definiert, dass alle Instanzen des Typs Fixwert über einen read-only 2nd Level Cache vorgehalten werden. Andere Cache-Modi würden analog eingetragen, indem man das Attribut usage mit einem anderen Wert als readonly versieht. 38 ... Stellschrauben dort Wenn Hibernate auf die Zusammenarbeit mit dem 2nd Level Cache vorbereitet wurde, gilt es noch, den Cache selbst zu konfigurieren. Der EHCache ist der bekannteste Vertreter der JVM-Level Cache­Provider, weil dieser zusammen mit Hibernate ausgeliefert wird und auch in der Standardeinstellung bereits aktiv ist. Abbildung 4 zeigt eine einfache Beispielkonfiguration für EHCache. Damit die Konfiguration beim Start automatisch eingelesen wird, muss sie lediglich unter dem Namen ehcache.xml im Klassenpfad der Anwendung liegen. Die Datei definiert Default-Einstellungen für alle Puffer und konfiguriert spezifische Pufferregionen. Hibernate bedient EHCache so, dass es zu puf­fernde Klassen jeweils in eine Pufferregion legt, die dem voll qualifizierten Namen der Klas­ se entspricht. Sollte eine solche Pufferregion nicht konfiguriert sein, wird beim Start eine Warnung ausgegeben und die Standardwerte aus dem Default-Cache kommen zur Anwendung. Das Beispiel aus Abbildung 4 legt für den DefaultCache fest, dass maximal 5000 Objekte in einer Puf­ferregion im Speicher gehalten werden sollen (max­ElementsInMemory). Bei Überschreiten dieser Grenze werden – je nach erforderlichem Platzbedarf – Objekte auf die Disk in das temporäre Verzeichnis der JVM ausgelagert (overflowToDisk, diskstore path). Außerdem werden Objekte niemals automatisch aus dem Cache entfernt (eternal). Für die Klasse BigObject wird die Pufferregion so eingestellt, dass maximal 10 Instanzen gepuffert werden. Die Instanzen werden, sofern sie unbenutzt sind, nach 300 Sekunden, spätestens jedoch nach 600 Sekunden aus dem Cache entfernt. Für den Default-Cache sind im Gegensatz dazu keine Zeitwerte angegeben. „Dieselbe Anfrage nochmal?“ ;-) Neben dem gezielten Einlesen von ganzen Ob­ jektgraphen werden oft auch Objektmengen mit Hilfe von Queries ermittelt. Wird eine bestimmte Query wiederholt durchgeführt und verändert sich die Ergebnismenge nur selten, ist sie ein Kandidat für den Query ORDIX News 3/2006 Java/XML Cache. Dieser verhindert die wiederholte Ausführung einer Datenbankabfrage, indem er sich die Ergebnismenge für eine bestimmte Query intern merkt. Der Query Cache selbst speichert nur die IDs der Objekte innerhalb der Ergebnismenge. Die Instanzen selbst werden dann, wie bei einem Session.get(), über den 2nd Level Cache bezogen. Der Query Cache bedingt also folglich den Einsatz eines 2nd Level Caches. Ob die Ergebnismengen innerhalb des Query Caches noch aktuell sind, prüft Hibernate intern anhand eines Zeitstempels. Ist die letzte Änderung an einer Tabelle älter als das aktuell im Cache vorhandene Abfrageergebnis, so wird die Ergebnismenge aus dem Puffer geliefert. Andernfalls wird eine neue Abfrage gegen die Datenbank durchgeführt und der Query Cache aktualisiert. Der Query Cache ist standardmäßig abgeschaltet und muss daher über den Schalter hibernate.cache.use_query_cache true in der Hibernate-Konfiguration aktiviert werden. Dies erstellt zwei neue Pufferregionen für die Abfrageergebnisse (org.hibernate.cache. StandardQueryCache) und die Zeitstempel (org.hibernate.cache.UpdateTimestampsCache), die innerhalb der Datei ehcache.xml konfiguriert werden (zur Syntax siehe Abbildung 4). Da ein Puffern der Ergebnismenge nur für bestimmte Abfragen Sinn macht, muss dies explizit im Code angefordert werden. Dazu bietet die Klasse Query die Methode setCacheable(). Wenn vor der Ausführung der Query [z. B. mit .list()] das cacheableAttribut auf true gesetzt wird, veranlasst dies die Nutzung des Query Caches für diese Abfrage. Glossar Cache Erhöht die Leistung einer Anwendung, indem wiederholte Zugriffe auf langsame Datenstrukturen durch Zwischenspeicherung im Hauptspeicher beschleunigt werden. JVM Java Virtual Machine. Programm, in dem Java-Programme ausgeführt werden. Eine JVM ist vom Betriebssystem abhängig, während das Java-Programm unabhängig vom Betriebssystem ist. Wer Zahlenmaterial benötigt (z. B. Cache Hit / Miss Ratio), sei auf die Methode SessionFactory.getStatistics() verwiesen. Alternativ kann man die Zahlen auch via JMX über ein MBean beziehen. Darum prüfe, wer sich ewig bindet So schön das Puffern auch ist, so sollte eines nie außer Acht gelassen werden: Ein Puffer erkennt niemals von selbst Veränderungen in der darunterliegenden Datenschicht. Wenn neben Hibernate eine weitere Anwendung schreibend auf der gleichen Datenbank arbeitet, ist es nicht ohne weiteres möglich, die Konsistenz des Puffers zu gewährleisten. Achtung auch bei manuellen Eingriffen! Im Zweifel sollte zumindest im direkten Anschluss an ein externes Update der 2nd Level Cache geleert werden. Eine Garantie, dass man mit dieser Methode wirklich alle Instanzen erwischt (insbesondere die in 1st Level Caches), gibt es nicht. Im Zweifel sollte daher die Anwendung angehalten und neu gestartet werden, da man sonst Gefahr läuft, dass die gerade geänderten Daten direkt wieder durch einen alten Hibernate-Stand überschrieben werden. Nun ist das Anhalten und Starten einer Anwendung vielleicht in Ausnahmefällen ein probates Mittel, dieser Gefahr zu entgehen. Bei einem alltäglichen, parallelen, schreibenden Zugriff einer anderen Anwendung ist aber eine andere Lösung notwendig. Auch dafür kann Hibernate etwas aus dem Hut zaubern: „Optimistic concurrency control“ ist hier das Schlagwort, über das wir in einer der nächsten Ausgaben berichten werden. Weitere Möglichkeiten Hibernate bietet noch einiges mehr an Möglichkeiten im Bereich Caching. Über die SessionFactory lässt sich z. B. das gezielte Entleeren bestimmter oder aller Pufferregionen anstoßen. Die Beschreibung der Methode Session­ Factory.evict() erklärt, wie es funktioniert. Über Query.setCacheMode(CacheMode. REFRESH) lässt sich auch für eine Query gezielt das erneute Laden der Ergebnismenge anfordern. ORDIX News 3/2006 Dies ist aber auch der einzige Nachteil. Ansonsten gilt: Wenn die Puffer gut auf die Applikation abgestimmt sind, verhelfen der Object Cache und der Query Cache zu einer enormen Leistungssteigerung. Fazit: Sehr empfehlenswert. Michael Heß ([email protected]). 39 Unix/Linux/Open Source Tiefe Einblicke in Solaris 10 mit Dtrace (Teil III): Geisterhafte Technik oder Technik, die begeistert? Teil II der Serie zeigte auf, welche Dinge sich mit Dtrace ausleuchten lassen. Diesmal betrachten wir Dtrace selbst - auf der Grundlage des Skriptes dexplorer aus dem DtraceToolkit. dexplorer Dieser Artikel richtet sich an erfahrene Systemadministratoren und Entwickler, die umfassende Analysetechniken unter Solaris 10 nutzen möchten. Aus dem ersten Teil der Reihe in Ausgabe 4/2005, S. 12, kennen wir die prinzipielle Funktionsweise von DTrace und den rudimentären Aufbau eines D-Skriptes. So wurde unter anderem truss nachgebildet. In Teil II (Ausgabe 1/2006, S. 36) haben wir die vorhandenen Mess­ punkte kategorisiert und somit einen Überblick über mögliche Messungen erlangt. Im Folgenden wollen wir uns der Sprache D genauer widmen und dabei das DtraceToolkit kennenlernen. Take the easy way Dtrace bietet unzählige Analysemöglichkeiten, sofern entsprechen­ de Skripte vorhanden sind. Der Aufwand, ein eigenes Analyseskript zu schreiben, lässt sich vermeiden, indem vorgefertigte Skripte ge­ nutzt werden. Als wichtige Skriptsammlung ist das DtraceToolkit von Brendan Gregg zu nennen [1] . Es bietet etwa 70 verschiedene Skripte, womit Fragestellungen zu den unterschiedlichen Themen (Netzwerk, Prozesse, CPU, IO, ...) analysiert werden können. 170 header='dtrace:::BEGIN { 171 printf("%Y, ", walltimestamp); 172 printf("%s %s %s %s %s, ", `utsname.sysname, `utsname.nodename, 173 `utsname.release, `utsname.version, `utsname.machine); 174 printf("%d secs\n",'$interval'); 175 } 176 profile:::tick-'$interval'sec { exit(0); } 177 ' Abb. 1: Der Programmcode für die Überschrift in dexplorer nutzt externe Variablen. 2006 May 18 23:48:56, SunOS jupiter 5.10 Generic_ 118844-26 i86pc, 5 secs Abb. 2: Die Ausgabe der Überschrift in dexplorer. 40 Das Skript dexplorer sammelt die unterschiedlichen Messdaten. Jede Fragestellung wird in einer separaten Datei beantwortet und alle zusammen werden in ein Tar-Archiv gepackt. Tatsächlich ist dexplorer ein Shell­ skript, das nacheinander unterschiedliche DSkripte zur Ausführung bringt. Diese einzelnen Skripte bie­ten sich an, um daran Dtrace-spezifische Einzelheiten aus dexplorer kennenzulernen. Das gesamte Skript und alle weiteren DtraceToolkit-Skripte finden sich unter [1] . Externe Variablen Um die Ausgaben der unterschiedlichen DSkripte innerhalb von dexplorer mit einer einheit­lichen Überschrift zu versehen, wird in der Shell-Variable header der Beginn der dtrace-Skripte inklusive Ausgabe der Überschrift definiert. Abbildung 1 zeigt den Programmcode, während Abbildung 2 die dadurch entstehende Überschrift darstellt. Es wird deutlich, dass neben dem Datum (walltimestamp), der Betriebssys­ temname, der Rechnername, die Kernelversion und die Prozessorarchitektur dargestellt werden. Das Skript greift dazu auf Externe Va­ riablen zu. Externe Variablen sind Variablen des zu analysierenden Programms (z. B. des Kernels). Sie erhalten im Skript den Accent grave (`) als Präfix. Häufig kann in Header-Dateien die Defini­ tion der Variablen ermittelt werden. Der Aufbau der Struktur utsname ist z. B. in der Datei / usr/include//sys/utsname.h definiert. Durch die Zeile 176 wird nach einem vordefinierten Messzeitraum das Programm beendet. Ist die Shellvariable $interval z. B mit dem Wert 5 belegt, so wird der Messpunkt profile:::tick-5sec nach 5 Sekunden exit 0 ausführen. Dies führt zur Beendigung der Messung, wobei ein möglicher dtrace::: END Messpunkt noch ausgeführt wird. ORDIX News 3/2006 Unix/Linux/Open Source Aggregate Dtrace kennt assoziative Arrays, worin, ähnlich wie bei AWK, Werte gespeichert werden können. Weitaus häufiger als Arrays werden so genannte Aggregate verwendet. Im Unterschied zu den Arrays, wird in einem Aggregat nicht ein einmalig aufgetretener Wert zu einem speziellen Index dargestellt, sondern meist eine Zusammenfassung häufig aufgetretener Wer­te zu einem bestimmten Index (z. B. der Mit­telwert oder die Anzahl). Gleich das erste Dtrace-Skript „Interrupts by CPU...“ innerhalb dexplorer greift zu Aggre­ gaten und ermittelt die Anzahl aufgetretener Interrupts pro CPU (Aggregat: Anzahl pro CPU). 242 dstatus "Interrupts by CPU..." 243 $dtrace -qn "$header"' 244 sdt:::interrupt-start { @num[cpu] = count();} 245 dtrace:::END 246 { 247 printf("%-16s %16s\n", "CPU", "INTERRUPTS"); 248 printa("%-16d %@16d\n", @num); 249 } 250 ' | $clean > Cpu/interrupt_by_cpu Abb. 3: Um die Interrupts pro CPU zu ermitteln, werden Aggregate genutzt. Funktionsname Argument Ergebnis Count keines Anzahl Aufrufe In Abbildung 3 Zeile 244 wird das Aggregat @num[cpu] mit Hilfe der Aggregatsfunktion count() gefüllt. Das Aggregat wird durch das Präfix @ als solches kenntlich. Rechts vom Zuweisungszeichen = darf nur eine Aggregatsfunktion stehen. Einfache Aggregatsfunktionen sind in Abbildung 4 dargestellt. Sum Zahl Gesamtsumme der angegebenen Zahlen. Avg Zahl Arithmetisches Mittel der angegebenen Zahlen. min Zahl Kleinster Wert unter den angegebenen Zahlen. Die Ausgabe eines Aggregats erfolgt implizit am Ende des Skriptes, ohne dafür eine Zeile Programmcode investieren zu müssen. Will der Skriptentwickler die Ausgabe bzw. das Aus­ gabeformat beeinflussen, so kann er dies mit der Funktion printa tun. max Zahl Größter Wert unter den angegebenen Zahlen. In Abbildung 3 wird in Zeile 248 das gesamte Aggregat mit allen gesammelten Werten ausgegeben. Die dadurch entstehende Ausgabe ist auf dem hier dargestellten Einprozessorsystem nicht sonderlich spektakulär. Sie ist in Abbildung 5 dargestellt und zeigt, wie erwähnt, die Anzahl der aufgetretenen Interrupts pro CPU. Lokale Variablen und bedingte Zuweisung Schon das nächste Skript „Interrupt times ...“ nutzt alle bisher kennengelernten Techniken und noch weitere. Da Interrupts durch Geräte verursacht werden, soll pro Gerät die Dauer der Interrupt-Behandlung ermittelt werden. In Zeile 254 wird die Zeit zu Be­ginn der Interrupt-Bearbeitung mittels vtimestamp ermittelt (Abbildung 6). In Zeile 262 wird die verstrichene Zeit der Interrupt-Bearbeitung durch Subtraktion ermittelt und in einem Aggregat festgehalten. Damit die Interrupt-Bearbeitung unterschiedlicher Threads unabhängig voneinander analysiert werden kann, wird die Startzeit durch Angabe des Präfixes self-> als Thread-lokaler Wert, und damit unabhängig von allen ORDIX News 3/2006 Abb. 4: Einfache Aggregatsfunktionen. CPU 0 INTERRUPTS 516 Abb. 5: Die Ausgabe des Aggregats gibt an, wie viele Interrupts pro CPU eintraten. 252 dstatus "Interrupt times..." 253 $dtrace -qn "$header"' 254 sdt:::interrupt-start { self->ts = vtimestamp; } 255 sdt:::interrupt-complete 256 /self->ts && arg0 != 0/ 257 { 258 this->devi = (struct dev_info *)arg0; 259 self->name = this->devi != 0 ? 260 stringof('devnamesp[this->devi->devi_major] .dn_name) : "?"; 261 this->inst = this->devi != 0 ? this->devi ->devi_instance : 0; 262 @num[self->name, this->inst] = sum (vtimestamp - self->ts); 263 self->name = 0; 264 } 265 sdt:::interrupt-complete { self->ts = 0; } 266 dtrace:::END 267 { 268 printf("%11s %16s\n", "DEVICE", "TIME (ns)"); 269 printa("%10s%-3d %@16d\n", @num); 270 } 271 ' | $clean > Cpu/interrupt_time Abb. 6: Zur Ermittlung der Interrupt-Dauer werden Thread-lokale Variablen verwendet. 41 Unix/Linux/Open Source anderen Threads, gespeichert. Die Messwerte sind somit eindeutig getrennt. Über das Argument arg0 in Zeile 258, welches durch den Mess­ punkt sdt:::interrupt-complete bereitgestellt wird, wird auf eine externe Struktur zugegriffen und in der Variablen this->­devi hinterlegt. In Zeile 260 wird die Majornumber des Interrupt-auslösenden Gerätes genutzt, um letztlich den Treibernamen zu ermitteln. Dieser wird in der Variablen self->name hinterlegt. DEVICE ata1 ata0 TIME (ns) 1342875 9300243 Abb. 7: Die Interrupt-Dauer wird aufgelistet nach Geräten ausgegeben. 273 dstatus "Dispatcher queue length by CPU..." 274 $dtrace -qn "$header"' 275 profile:::profile-1000 276 { 277 this->num = curthread->t_cpu->cpu_disp ->disp_nrunnable; 278 @length[cpu] = lquantize(this->num, 0, 100, 1); 279 } 280 dtrace:::END { printa(" CPU %d%@d\n", @length); } 281 ' | $clean > Cpu/dispqlen_by_cpu Abb. 8: Die Aggregatsfunktion lquantize ermöglicht die Ausgabe von His­togrammen. CPU 0 value ------- Distribution ------- count < 0 | 0 0 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 4829 1 | 54 2 | 8 3 | 1 4 | 1 5 | 1 6 | 0 Abb. 9: Das Histogramm gibt Aufschluss über die Verteilung der Messwerte. Funktionsname Argument Ergebnis Quantize Zahl Liefert ein logarithmisches Verteilungsdiagramm der angegebenen Ausdrücke. Alle Werte, die kleiner oder gleich dem in der Zeile angegebenen, aber größer als der eine Zeile darüber angegebene Wert sind, wurden bei der Anzahl beachtet. Lquantize Zahl, untere Grenze, obere Grenze, Schrittweite Liefert ein lineares Verteilungsdiagramm der angegebenen Ausdrücke. Die Staffelung erfolgt entsprechend der Schrittweite von der Ober- bis zur Untergrenze. Abb. 10: Aggregatsfunktionen zur Erzeugung von Histogrammen. 42 Für den genauen Aufbau der hier verwendeten Strukturen müssen wiederum die entsprechenden Header-Dateien ermittelt und analysiert werden. Bitte beachten Sie, dass die Zuweisungen in Zeile 259, 260 und in Zeile 261 bedingte Zuweisungen sind. Zeile 261 meint: Wenn die Variable this->devi nicht den Wert 0 hat, dann nutze den Wert this->devi->devi_ instance, sonst nutze den Wert 0. Auf diese Weise werden Treibername und Instanzname als 0 angenommen, wenn die entsprechenden Parameter nicht vorhanden sind. Nun sind alle Parameter bekannt, um sich der Zeile 262 zu widmen. Die verstrichene Zeit wird berechnet und in einem Aggregat festgehalten, welches die Gesamtzeit der InterruptBearbeitung in Abhängigkeit vom Treibernamen (self->name) und vom Instanznamen (this->inst) ermittelt. Durch die Zuordnung des Wertes 0 in Zeile 263 wird in der Sprache D der Speicher für die Variable self->name deallockiert. Die Ausgabe wird durch die Zeilen 268 und 269 erzeugt und ist in Abbildung 7 dargestellt. Histogramme Das nächste Skript „Dispatcher queue length by CPU ...“ ist wieder etwas kürzer, bietet jedoch ein Highlight. In Zeile 277 (Abbildung 8) wird über die Dtrace-Built-In Struktur cur­ thread die Anzahl wartender Threads für eine CPU ermittelt. Das Aggregat @length[cpu] wird in Zeile 278 mit diesem Wert durch die Ag­gregatsfunktion lquantize gefüllt. Dadurch wird bei der Ausgabe pro CPU ein His­ to­gramm erstellt. In Abbildung 9 sehen wir, dass während des Messzeitraums 4829 mal 0 Threads auf CPUZeit gewartet haben. 54 mal war genau ein Thread in der Warteschlange des Prozessors 0. 8 mal warteten 2 Threads. Einmal warteten 3, einmal 4 und einmal 5 Threads. 6 oder mehr Threads und weniger als 0 Threads warteten nie auf die CPU 0. Da es sich bei dem fraglichen System um eine Einprozessormaschine handelt, werden keine weiteren Histogramme angezeigt. Beim Aufruf der Funktion lquantize() in Zei­ le 278 wurde neben dem zu messenden Wert noch der Bereich (0 bis 100) und die Stufenweite (1) angegeben. Die Funktion quantize liefert demgegenüber ein logarithmisches His­ togramm. Die Angabe der Schrittweite beziehungsweise der Bereichsgrenzen ist dabei nicht notwendig (siehe Abbildung 10). ORDIX News 3/2006 Unix/Linux/Open Source Link Glossar ► [1] http://www.opensolaris.org/os/ com­munity/dtrace/dtracetoolkit/ Die weiteren D-Skripte Die weiteren D-Skripte innerhalb von dexplorer sind ähnlich aufgebaut und bieten uns keine grundlegend neuen Erkenntnisse. Für die detaillierte Analyse der verwendeten KernelStrukturen müssen häufig der „Solaris Dynamic Tracing Guide“ und die Header-Dateien im Verzeichnis /usr/include als Informa­ tionsquelle herangezogen werden. Aggregat Eine Einheit, die durch Zusammensetzung ein­ zelner, relativ selbstständiger Teile zustande kommt. Hier: Statistische Größen, die sich durch einzelne Messwerte ergeben. Assoziatives Array Sonderform eines Arrays. Statt eines numerischen Indexes wird ein Schlüssel zur Indizierung und damit zur Adressierung eines Elementes verwendet. AWK Programmiersprache zur Bearbeitung und Aus­ wertung von Textdateien. Sie ist benannt nach den Initialen ihrer Programmierer: Alfred V. Aho, Peter J. Weinberger und Brian W. Kernighan. dexplorer Skript aus der DtraceToolkits Skriptsammlung. Externe Variablen Variable, die extern, also außerhalb des fraglichen Programms definiert wurde. Fazit Header-Datei C-Quellcode, der typischerweise Definitionen von Variablen und Strukturen enthält. Es wird deutlich, wie mächtig Dtrace ist und welche Techniken zur Analyse angewendet werden können. Ein Blick auf das DtraceToolkit lohnt sich, denn auch die weiteren Skripte sind lesenswert und ermöglichen Erkenntnisse über das System, die sich ohne Dtrace wahrscheinlich nur vermuten ließen. Histogramm Graphische Darstellung der Häufigkeitsverteilung von Messwerten. Thread Elementaraufgabe. Die Befehle eines Threads sind in sich so abgeschlossen, dass sie auf einer CPU zusammenhängend ausgeführt werden können. Um Programme mehrprozessorfähig zu gestalten, müssen die Abläufe in Threads untergliedert sein. Threadlocal zu einem Thread gehörend Markus Schreier ([email protected]). Messe-Rückblick: JAX 2006 „Lucene unter Last“ auf der JAX 2006 in Wiesbaden ORDIX war in diesem Jahr zum ersten Mal aktiv mit einem Vortrag und einer Infoinsel auf der JAX Konferenz vertreten. Die JAX ist die führende IT-Konferenz für Enterprise Technologien (Java, XML, WebServices) in Europa. Die fünftägige Messe fand in den Rhein-MainHallen in Wiesbaden statt. Die JAX Ausstellung 1.600 Teilnehmer konnten sich im Mai in den über 150 Vorträgen rund um die Themen Java, XML und WebServices informieren. In den Pausen bot sich die Gelegenheit, die paral­le­ le Ausstellung zu besuchen und sich direkt mit Fachleuten der mehr als 50 Firmen auszutauschen. Dr. Stefan Koch, Senior Consultant der ORDIX AG (Foto oben), präsentierte in seinem Vortrag das Thema „Lucene unter Last“. Lucene ist eine Open Source Java-Bibliothek, die eine Vollt- ORDIX News 3/2006 extrecherche unterstützt. Die Recherche ist dateibasiert und ersetzt eine entsprechende Datenbankrecherche. In einer Tomcat Web-Anwendung für das Intranet wurde das Lastverhalten von Lucene bei parallelem Zugriff untersucht. Die Inhalte des Vortrags finden Sie in dem gleich­namigen Artikel (Seite 30). Allgemeine Informationen zur JAX Konferenz finden Sie im Internet unter http://www.jax.de. Sie haben weiterführendes Interesse am Thema „Lucene“? Sprechen Sie uns an. Wir beraten Sie gern! Stefanie Heither ([email protected]). 43 Halten Sie Schritt mit dem Puls der Zeit! Neue ORDIX Seminare 2007 Datenbanken Java/J2EE • • • • • • • • • Java GUI Entwicklung mit Swing • Java 5.0 Neuheiten • Webanwendungen mit Java Server Oracle SQL für Umsteiger Oracle PL/SQL Aufbau mit LOB Programmierung Oracle Grid Control Workshop Oracle Advanced Queuing Workshop Oracle Replikation Workshop IBM DB2 UDB für Unix/Windows 9.1 Neuheiten Microsoft SQL Server 2005 Neuheiten Microsoft SQL Server HochverfügbarkeitsWorkshop System Management Faces (JSF) • Java Web Services • Entwicklung mit Hibernate Betriebssysteme • Server-Virtualisierung mit XEN • Solaris 10 für erfahrene System­ administratoren • BMC PATROL/Performance Manager Base Reporting • Solaris Containers • Multivendor Systemadministration Weitere Informationen finden Sie im ORDIX Trainingsshop unter http://training.ordix.de oder in unserem Seminarprogramm, was ab Oktober druckfrisch zur Verfügung steht.