Diplombericht - Berner Fachhochschule

Werbung
Diplombericht
Nr. MAS-06-01.15
Grafischer Transaktionssimulator
MAS-IT-06-01, 11. September 2008
Abstract
Der Transaktionssimulator simuliert Datenbank-Benutzer, und lässt diese in
gegenseitiger Konkurrenz auf eine reale Datenbank zugreifen. Simulationen sind
parametrisierbar: Anzahl gelesener und geschriebener Datensätze, Isolationsgrad,
Häufigkeit und Nebenläufigkeit der User usw. sind einstellbar. Gemessen werden
u.a. Anzahl Transaktionen, Phantoms, Deadlocks und Lost Updates. Die
Parametereingabe und Resultatdarstellung erfolgt im GUI. Simulationsmodelle
werden in XML erfasst.
Schlüsselwörter
Simulation, Transaktion, Datenbank
Autor:
Paul Klarenberg
Sandrainstrasse 60a
3007 Bern
+41 31 372 92 82
Betreuer:
Dr. Arno Schmidhauser
Wankdorffeldstrasse 102
Postfach 325
CH-3000 Bern 22
+41 31 84 83 275
Experte:
Max Kleiner
Kasernenstrasse 41
3001 Bern
Versionskontrolle
Datum
Version
Autor
Beschreibung
2008-08-27
0.1
P. Klarenberg
Initialversion
2009-09-07
0.2
P. Klarenberg
Überarbeitung, Diagramme
2009-09-08
0.3
P. Klarenberg
Korrekturen
2009-09-11
1.0
P. Klarenberg
Zum uploaden zur SWS
Seite 2 von 66
Inhaltsverzeichnis
1
EINLEITUNG ............................................................................................. 5
1.1
1.2
1.3
1.4
1.5
2
ZWECK DES DOKUMENTS ..................................................................................... 5
ZIELPUBLIKUM ..................................................................................................... 5
VORBEMERKUNGEN ............................................................................................. 5
DEFINITIONEN UND ABKÜRZUNGEN ..................................................................... 5
REFERENZEN ........................................................................................................ 6
ANALYSE .................................................................................................. 7
2.1
ALLGEMEINE BESCHREIBUNG .............................................................................. 7
2.2
ZUSAMMENHANG ZWISCHEN SIMULATION UND WIRKLICHKEIT .......................... 7
2.3
FACHKLASSEN ..................................................................................................... 8
2.4
ARCHITEKTUR ...................................................................................................... 9
2.5
GUI ................................................................................................................... 10
2.6
PRODUKT PERSPEKTIVE ..................................................................................... 11
2.6.1
WICHTIGSTE ANFORDERUNGEN ................................................................. 11
2.6.2
BENUTZER ................................................................................................. 11
3
ARCHITEKTUR/DESIGN ......................................................................... 13
3.1
ARCHITEKTUR .................................................................................................... 13
3.2
PACKAGES ......................................................................................................... 13
3.3
SOURCING .......................................................................................................... 14
3.4
ÜBERSICHT ........................................................................................................ 15
3.4.1
PACKAGE NET.CLEARMOUNTAIN.TRANSIM ................................................ 16
3.4.2
PACKAGE NET.CLEARMOUNTAIN.TRANSIM.GUI .......................................... 16
3.4.3
PACKAGE NET.CLEARMOUNTAIN.TRANSIM.OPTIONSPANEL ........................ 17
3.4.4
PACKAGE NET.CLEARMOUNTAIN.TRANSIM.SIMULATOR ............................. 18
3.4.5
PACKAGE NET.CLEARMOUNTAIN.TRANSIM.MODEL .................................... 18
3.4.6
PACKAGE NET.CLEARMOUNTAIN.TRANSIM.DATABASE .............................. 19
3.4.7
PACKAGE NET.CLEARMOUNTAIN.TRANSIM.STATISTICS .............................. 20
3.5
ABLÄUFE ........................................................................................................... 20
3.5.1
HAUPTABLÄUFE ......................................................................................... 20
3.5.1.1 Screen Refresh Zyklus
21
3.5.1.2 Transaction Statistics Zyklus
21
3.5.2
KOMMUNIKATION ZWISCHEN GUI UND ANDERE MODULE......................... 22
4
IMPLEMENTATION ................................................................................. 23
4.1
GUI ................................................................................................................... 23
4.1.1
SIMULATIONS-HAUPTFENSTER .................................................................. 23
4.1.2
MYMENUBAR............................................................................................ 24
4.1.3
OPTIONSPANEL .......................................................................................... 24
4.1.3.1 Simulatoroptionen
24
4.1.3.2 Datenbankoptionen
24
4.1.3.3 Skalierungsoptionen
25
4.1.3.4 Farboptionen
25
4.2
SIMULATOR ........................................................................................................ 26
4.3
KONFIGURATOR ................................................................................................. 29
4.3.1
MODEL.XML ............................................................................................... 29
4.3.1.1 parameterSets
31
4.3.1.2 transactionModels
31
4.3.1.3 userModels
32
Seite 3 von 66
4.3.1.4 simulationModels
33
4.3.1.5 shows
35
4.3.2
DATABASES.XML ........................................................................................ 37
4.3.3
ACCOUNTS.XML ......................................................................................... 38
5
TESTS ..................................................................................................... 40
5.1
5.2
5.3
6
UNITS TESTS ...................................................................................................... 40
INTEGRATIONSTESTS .......................................................................................... 40
ABNAHMETEST .................................................................................................. 40
BESPRECHUNG ....................................................................................... 42
6.1
BEURTEILUNGSRELEVANTE KRITERIEN ............................................................. 42
6.2
ABWEICHUNGEN ZUM PFLICHTENHEFT .............................................................. 42
6.2.1
ANFORDERUNGSABDECKUNG .................................................................... 42
6.2.2
NICHT UMGESETZTE ANFORDERUNGEN ..................................................... 46
6.3
VORGEHEN......................................................................................................... 46
6.3.1
VORGEHENSMODELL.................................................................................. 46
6.3.2
ZEITPLAN ................................................................................................... 48
6.4
ERFAHRUNGEN .................................................................................................. 49
6.4.1
ANALYSE PHASE ........................................................................................ 49
6.4.2
DESIGN / ENTWICKLUNGSPHASE ................................................................ 49
6.4.3
REALISIERUNGSPHASE ............................................................................... 49
6.4.4
GRÖSSTE PROBLEME .................................................................................. 50
6.4.5
GRÖSSTE AUFSTELLER ............................................................................... 51
6.5
AUFWANDSCHÄTZUNG....................................................................................... 51
6.6
AUSBLICK .......................................................................................................... 51
ANHANG A. UML DIAGRAMME ................................................................... 52
ANHANG B XML-SCHEMAS ......................................................................... 60
Seite 4 von 66
1 Einleitung
1.1 Zweck des Dokuments
Dieses Dokument beschreibt das Projekt "Grafischer Transaktionssimulator". Das
Dokument dient dem Experten als Grundlage für die Beurteilung der der Diplomarbeit
des Autors.
1.2 Zielpublikum
Das Dokument soll insbesondere auch interessierten Kreisen, wie z.B.
Unterhaltsentwickler, aufzeigen, wie die Software aufgebaut ist.
Als Vorkenntnisse werden empfohlen:
•
•
•
Übung in der Verwendung von GUIs und technischen Anwendungen
XML Anwenderkenntnisse
Kenntnis der Datenbank-Theorie, insbesondere der Themen Transaktion und
Nebenläufigkeit
1.3 Vorbemerkungen
Das vorliegende Dokument wiederholt aus dem Pflichtenhefts [1] nur wenige,
wichtige Inhalte. Für eine vollständige Darlegung der Anforderungen wird auf das
Pflichtenheft verwiesen.
Das vorliegende Dokument dient ebenfalls nicht als Benutzeranleitung, welche in
einem separaten Dokument [4] erfasst wurde.
Die Software ist als binäre Distribution (bedingt zum Laufen eine Java VM), sowie als
Source in der Form von ZIP Dateien erhältlich.
1.4 Definitionen und Abkürzungen
Begriff / Abkürzung
Definition
Application
Der Transaktionssimulator
DBConnection
Die aktuelle Verbinding via JDBC mit einer Datenbank.
DatabaseConnectionProfile
Die produktspezifische Spezifikation für eine DatenbankVerbindung (u.a. User Account Daten, Treiber-Name,
usw.)
Isolation Level / Isolationsgrad
Isolationsgrad gemäss SQL Standard: 0 = read
uncommitted, 1 = read committed, 2 = repeatable read, 3
= serializable
Operation
Primitive Datenbankoperation Read (R), Update (U),
Delete (D) und Insert (I). Werden mit SQL-Befehle
implementiert.
Show
Eine Menge benannte Simulationsmodelle samt
Simulationsparameter welche als ganzes konfiguriert und
geladen werden kann.
Simulation
Das ausgeführte Simulationsmodell (auch:
Seite 5 von 66
Begriff / Abkürzung
Definition
Simulationslauf).
Simulationsmodell
Ein lauffähiges Modell einer Simulation, bestehende aus
einem oder mehreren Transaktionsmodellen und relativen
Mengen. z.B. "2*RR1 + 1*RU1"
Simulationsparameter
SimulationThread
Ein Thread der, stellvertretend für einen User, gemäss
einem Transaktionsmodell auf die Datenbank zugreift.
Software Design Description
(SDD)
Spezifikation des Software-Designs gemäss IEEE 1016.
Die SDD beschreibt die Lösung, die SRS dagegen die
Anforderungen.
Software Requirements
Specification (SRS)
Spezifikation der Software Anforderungen gemäss IEEE
830. Die SRS beschreibt die Anforderungen, die SDD
dagegen die Lösung.
TransactionModel
Transaktionmodell, welche den Verlauf einer Transaktion
beschreibt. Elemente: Transaktionsmuster und
Transaktionsparameter unf Isolationsgrad.
Transaktionsmuster
Eine Reihe von Operationen (z.B. RR oder RU)
Transaktionsparameter
- Anzahl gelesene Datensätze in Prozent (R%)
- Anzahl geänderte Datensätze in Prozent von R% (U%)
- Absolute Anzahl geänderte Datensätze (I)
- Anzahl der gelöschten datensätze in Prozent (D%)
- Pausezeit (P) vor und zwischen den Operationen
Usage Pattern
User Type
Tabelle 1: Begriffe und Abkürzungen
1.5 Referenzen
[1]
"Pflichtenheft Diplomarbeit Grafischer Transaktionssimulator", P. Klarenberg,
22. April 2008
[2]
"Der Transaktionssimulator", Dr. Arno Schmidhauser, Dezember 2004
[3]
Transaktionssimulator Java Code, Dr. Arno Schmidhauser
[4]
"Benutzeranleitung Transaktionssimulator 1.0"
[5]
Dokumentation zum Swing Application Framework,
https://appframework.dev.java.net/
[6]
Dokumentation zu SwingX, https://swingx.dev.java.net/
[7]
Dokumentation zum JFreeChart, http://www.jfree.org/jfreechart/
[8]
Dokumentation zum MiGLayout, http://www.miglayout.com/
[9]
"Core Java 2", Band 1. Grundlagen (Zur Java 2 Standard Edition Version 5.0),
von Cay S. Horstmann, Gary Cornell
[10] "Core Java 2", Band 2. Expertenwissen (Zur Java 2 Standard Edition Version
5.0), von Cay S. Horstmann, Gary Cornell
[11] "Java Swing", Marc Loy, Brian Cole, Jim Elliot, und Robert Eckstein, O'Reilly
Media
Seite 6 von 66
2 Analyse
Die Ergebnisse der Analysephase (-> siehe Vorgehensmodell 6.3.1) wurden im
Pflichtenheft [1] dokumentiert. In diesem Kapitel werden die wichtigsten und teilweise
überarbeitete Ergebnisse der Analyse aufgeführt, und wo nötig kommentiert.
2.1 Allgemeine Beschreibung
Der Transaktionssimulator soll die Performance und das Auftreten möglicher
Inkonsistenzen simulieren, wenn viele Transaktionen gleichzeitig auf eine Datenbank
zugreifen. Diagramm 1 zeigt die Analogie zwischen der Simulation und der
simulierten Wirklichkeit.
Der Transaktionssimulator soll nicht die Mechanismen demonstrieren wonach diese
Inkonsistenzen entstehen, sondern statistische Daten über deren Auftreten erheben
und Visualisieren.
Der Transaktionssimulator soll im Rahmen des Unterrichts des Fachs Datenbanken
eingesetzt werden. Primär vom Dozenten (Frontalunterricht) und möglicherweise
auch von Studenten (Praktikum).
2.2 Zusammenhang zwischen Simulation und Wirklichkeit
Diagramm 1 zeigt auf, wie der Transaktionssimulator versucht die Wirklichkeit
abzubilden. Jeder Benutzer-Typ wird mittels eines seinem Verhalten entsprechenden
User-Models definiert. Ein Simulationslauf besteht aus einen oder mehreren
Instanzen von einen oder mehreren Benutzer-Typen. Jeder Benutzer-Instanz wird
einen eigenen Simulations-Thread samt Datenbank-Verbindung zugeteilt. Der
Simulations-Thread führt die im User-Model definierten Operationen samt
benutzerspezifischen Parametern auf der Datenbank aus.
Im Pflichtenheft wurde den vereinfachten Ansatz präsentiert, die Benutzer über ein
mathematisches Verfahren abzubilden. Diese Methode wurde in der Design-Phase
jedoch verworfen.
Seite 7 von 66
Diagramm 1: Analogie zwischen Simulation und simulierter Wirklichkeit
2.3 Fachklassen
Diagramm 2 zeigt ein Fachklassendiagramm mit den wichtigsten fachlichen Begriffen
und deren Zusammenhängen.
Seite 8 von 66
class Fachklassenmodell Transaktionssimulator
Application
Die Simulationsproperties können auf Ebene
Application, Show und Simulation spezifiziert
werden. Application ist die "höchste" Stufe,
Simulation die "tiefste". Es wird von hoch nach
tief vererbt. Die tiefere Ebene kan
"überschreiben". Hiermit wird z.B. den
Vergleich eine und derselbe Simulation auf
zwei verschiedenen DB ermöglicht.
SimulationProperties
has
1
1
0..*
0..*
loads
0..*
refers to
Show
DatabaseConne ctionProfile
1
1
1
1
has
composed of
0..*
Simula tionsm odell
0..*
1
Simul ation
runs
1
Simulati onThread
uses
0..*
1
DBConnection
uses
0..*
1
1
0..*
composed of
1. .*
TransactionModel
Isola tionLev el
has
1
0..* -
R%
U%
I
D%
P
applies
1
0..*
refers
0..*
Während der Simulation können die
Isolationsgrade, die Pausezeit, sowie
die R%, U%, I und D% der
verwendeten Thread-Modelle
übersteuert werden.
Re ad
Operation
Update
Ins ert
Del ete
Diagramm 2: Fachklassendiagramm
Dieses Fachklassendiagram diente in der Analysephase als Hilfsmittel zur Klärung
der Fachterminologie. Der gegenwärtige Massstab für die Klassennamen und
Fachbegriffe des Transaktionssimulators sind die Klassendiagramme in Kapitel 3.4
und Anhang A.
2.4 Architektur
Die im Pflichtenheft vorgeschlagene Grobarchitektur in Diagramm 3:
Systemübersicht" ist nach wie vor gültig. Das Package-Diagramm in Kapitel 3.2 zeigt
wie die Architektur in die aktuelle Package-Struktur übernommen und ergänzt wurde.
Seite 9 von 66
Transaktionssimulator
Dozent
GUI
Simulator
RDBMS
Konfigurator
Studenten
Filesystem
Diagramm 3: Systemübersicht
2.5 GUI
Aufgrund der während der Analyse festgestellten Wichtigkeit des GUI, wurde in der
Analysephase ein LoFi-Prototyp entwickelt, um frühzeitig diesbezügliche
Anforderungen zu erheben.
Diagramm 4: Visio Zeichnung eines möglichen GUI
Seite 10 von 66
Diagramm 4 zeigt eine Visio-Zeichnung, welche Bestandteil dieses Prototyps war.
Diagramm 7 zeigt die Umsetzung der Anforderungen im realisierten Programm.
2.6 Produkt Perspektive
2.6.1 Wichtigste Anforderungen
Der Transaktionssimulator bietet folgende Hauptfunktionen:
•
•
•
Verwalten von Simulationsmodellen
Durchführen von Simulationen
Visualisieren und Präsentieren von Simulationsergebnissen
Der Transaktionssimulator soll folgende Informationen anzeigen:
a)
b)
c)
d)
e)
f)
Anzahl Transaktionen
Anzahl Deadlocks
Anzahl Lost-Updates
Anzahl Phantoms
Transaktionszeit
Deadlock-Zeit
Der Transaktionssimulator soll folgende Einstellungen erlauben
a)
b)
c)
d)
e)
f)
g)
Transaktionsmuster (z.B. RR oder RU)
Isolationsgrad (0-3)
Anzahl gelesene Datensätze in Prozent (R%)
Anzahl geänderte Datensätze in Prozent von R% (U%)
Absolute Anzahl geänderte Datensätze (I)
Anzahl der gelöschten Datensätze in Prozent (D%)
(Optional) Flag ob Transaktion mit Commit abgeschlossen wird
Es ist keine Funktionalität zum kreieren von Reports vorgesehen.
Der Transaktionssimulator soll als Rich-Client implementiert werden, der (evt. über
ein Netzwerk) auf eine Datenbank zugreift.
Die Simulationsmodelle und andere Konfigurationsdaten werden als XML Dateien
lokal gespeichert.
2.6.2 Benutzer
Der Transaktionssimulator soll von zwei Benutzergruppen verwendet werden:
Dozenten und Studenten.
Dozent
Der Dozent bedient den Transaktionssimulator, um Simulationsmodelle zu definieren
und Präsentationen vorzubereiten, sowie die Simulationen durchzuführen. Er arbeitet
mit Mouse, Keyboard und PC-Bildschirm. Die Zweckmässigkeit des GUI-Entwurfs für
diese Arbeiten muss anhand eines Prototyps erhoben und vom Kunden beurteilt
werden.
Student
Der Transaktionssimulator-Rechner kann zum Zweck der Präsentation in einem
Unterrichts-Raum an einen Beamer angeschlossen sein. Die Studenten sitzen im
Vorlesungszimmer und verfolgen die Simulationen auf der Projektionsfläche. Die
Seite 11 von 66
Qualität der Darstellung, insbesondere die Anordnung von Inhalten, Kontrast und
Helligkeit, Schriftart und -grösse müssen experimentell anhand eines Prototyps
erhoben und vom Kunden beurteilt werden.
Optional können Studenten im Rahmen eines Praktikums individuell oder in kleinen
Gruppen mit dem Transaktionssimulator experimentieren.
Seite 12 von 66
3 Architektur/Design
3.1 Architektur
Es gilt die in Diagramm 3: Systemübersicht" abgebildete Top-Level Architektur, mit
den drei Hauptmodulen GUI, Simulator und Konfigurator, sowie den Umsystemen
RDBMS (Datenbank) und lokales Filesystem.
3.2 Packages
Im Design wurden die Modulen der Top-Level Architektur mittels Packages
entsprochen. Siehe Diagramm 5: Packagediagramm" sowie
pkg Komponenten 2
gui
statistics
«visualise»
(from transim)
«visualise &
edit»
(from transim)
«control»
mode l
«produce»
simulator
«execute»
(from transim)
(from transim)
«use»
ma in
database
(from transim)
(from transim)
Diagramm 5: Packagediagramm
Seite 13 von 66
Modul / Schnittstelle
Package
GUI
net.clearmountain.transim.gui
Simulator
net.clearmountain.transim.simulator
Konfigurator
net.clearmountain.transim.model
Schnittstelle zum RDBMS
net.clearmountain.transim.database
zusätzlich
net.clearmountain.transim.statistics
Tabelle 2: Modulen und Packages
3.3 Sourcing
Aufgrund der Anforderungen [1] wurde untersucht welche - möglichst Open Source Komponenten für das Projekt in Frage kämen. Mittels Internet-Recherche wurden
viele Pakete gefunden, und schlussendlich folgende Pakete ausgewählt:
Paket
Erwartung
Swing Application Framework [5]
Soll die Entwicklung von Swing-Anwendungen für den
Anfänger einfach ermöglichen.
swingX [6]
Soll das gewünschte zuklappbare Panel, welches im
Standard Swing-Bibliothek fehlt, beitragen.
JFreeChart [7]
Soll eine fixfertige Lösung für das zeichnen von Grafiken
bieten.
MiGLayout [8]
Wurde erst später zugefügt: Soll eine benutzerfreundliche
Alternative zu den Standard Swing Layout-Managern
bieten.
Tabelle 3: Extern bezogene Komponenten
Für eine (subjektive) Bewertung dieser Pakete siehe 6.4 "Erfahrungen". Das Design
dieser Komponenten ist kein Bestandteil dieses Berichts.
Seite 14 von 66
3.4 Übersicht
class IntegratedView
«interface»
SimulationVisualizer
Stac kedP anel
1
2
1
1
«use»
«use»
1
Task
TranSim
ModelSta tistics
StatisticsTra nsferProcess
1
«use»
0..*
1
0..*
+userModelStatistics +TransactionModelStatistics
1
1
«use»
ModelFactory
DisplayValues
1
«create»
1
«use»
2
ArrayList<SimulationModel>
SimulationContext
Show
1
1
Simulation Statistics
1
1
1
«use»
1
TransactionStatistics
simulationContext
+simulationModel
0..*
+dataTierFactory
1
ArrayList<UserModel> +simulationModel
Simul ationModel
1
1
«interface»
Simulator
1
«interface»
DataTierFactory
«create»
1
DefaultS imulator
«create»
JDBCDataTierFactory
0..*
+simulation
0..*
0..*
ArrayList<TransactionModel> +userModel
Use rMo del
1
1
Simulati onThread
+dataTier
0..*
1
«interface»
DataTier
1
0..*
JPADataTier
ArrayList<Operation>
TransactionModel
JDBCDa taTier
«create»
«use»
1
1
1
DatabaseConne ctionProfile
«use»
1
0..*
«enumeration»
Opera tion
Conne ction
Database Profile
«use»
Diagramm 6: Übersichts Klassendiagramm
Seite 15 von 66
3.4.1 Package net.clearmountain.transim
Klasse
Verantwortlichkeit
ApplicationGlobals
Diese Singleton Klasse enthält Variablen
welche in verschiedenen Teilen des Programms
benötigt werden. Änderungen werden als
PropertyChange Events an Subscribers
propagiert. So wird z.B. die Kommunikation
zwischen GUI und anderen Objekte realisiert.
SimulationContext
Bietet eine Umgebung für alle für eine
Simulation benötigten Objekte. Der
Transaktions-simulator verfügt über zwei
unabhängige SimulationContext, je eine für die
linke und rechte Hälfte des Simulatorfensters.
StatisticsTransferProcess
Diese Klasse läuft in einem separaten Thread,
und transferiert im Takt (Transfer Rate)
statistische Werte aus dem SimulationStatistics
Objekt in das StackedPanel Objekt, das die
Grafiken umfasst.
TranSim
Die Applikations-Klasse.
TranSimException
Die Spezialisierung von Exception für TranSim.
Utils
Verschiedene allgemeine Methoden.
3.4.2 Package net.clearmountain.transim.gui
Klasse
Verantwortlichkeit
AboutDialog
Copyrights präsentieren.
BarChartPanel
Mehrere unabhängige Bar Charts horizontal
neben einander präsentieren. Ist die
Basisklasse für ResultsPerUserModelPanel und
ResultsPerTransactionModelPanel.
ControlPanel
Dem Benutzer ermöglichen, ein
Simulationsmodell auszuwählen, sowie ein
Simulationslauf zu starten, anzuhalten oder zu
stoppen.
DefaultSimulationVisualizer
Als Top-Level GUI-Objekt alle andere GUIElemente enthalten. Ist die DefaultImplementierung des Interface
SimulationVisualizer.
LegendPanel
Die Messwerte (Anzahl Transaktionen,
Phantome usw.), mit ihren aktuellen Farben
Seite 16 von 66
präsentieren.
MyMenuBar
Der JMenuBar der Anwendung.
ParameterPanel
Dem Benutzer ermöglichen, die Parameter aller
Transaktions-Modelle des aktuell selektierten
Simulationmodells zu ändern.
ResultsPerTransactionModelPanel Die Messwerte für alle Transaktions-Modelle
des aktuellen Simulationsmodells präsentieren
(Subklasse von BarChartPanel).
ResultsPerUserModelPanel
Die Messwerte für alle User-Modelle des
aktuellen Simulationsmodells präsentieren
(Subklasse von BarChartPanel).
SimulationPanel
Sammelt alle graphische Objekte für eine Hälfte
(links oder rechts) des Hauptfensters.
SimulationVisualizer
(Interface) Den Einsatz verschiedener
Implementierungen ermöglichen.
StackedBox
Zuklappbare Container (mit entsprechenden
Bedienungselemente) für die graphischen
Komponenten zur Verfügung stellen.
(Bestandteil des externen SwingX Package)
StackedPanel
Container für sämtliche StackedBox Objekte.
Kapselt die externe SwingX Komponente.
TotalResultsPanel
Die aggregierten Messwerte über die ganze
Simulation hinweg präsentieren.
3.4.3 Package net.clearmountain.transim.optionspanel
Klasse
Verantwortlichkeit
AbstractCard
Eine abstrakte Klasse, welche die
gemeinsamen Eigenschaften einer Card
implementiert. Eine Card ist der Teil des
Optionspaneel, welcher die Felder und Buttons
für eine Gruppe von Optionen umfasst.
ColorsCard
Spezialisierung der Klasse Card für die
Farbeinstellungen.
DatabaseCard
Spezialisierung der Klasse Card für die
Datenbankeinstellungen.
DatabaseConfiguration
Bestandteil der DatabaseCard, je ein Objekt pro
SimulationContext. (Jeder SimulationContext
verfügt über eigene Datenbankeinstellungen.)
Seite 17 von 66
FilePathCard
Spezialisierung der Klasse Card für die
Dateipfadeinstellungen. (Nicht implementiert.)
ICard
Interface welches vom AbstractCard
implementiert wird.
OptionsPanel
Ein Dialog in welcher mehrere Gruppen von
Optionen verwaltet werden können.
ScalesCard
Spezialisierung der Klasse Card für die
Skalierungseinstellungen (der Achsen der
Grafiken).
SimulatorCard
Spezialisierung der Klasse Card für die
Simulatoreinstellungen.
SimulatorConfiguration
Bestandteil der SimulatorCard, je ein Objekt pro
SimulationContext. (Jeder SimulationContext
verfügt über eigene Simulatoreinstellungen.)
3.4.4 Package net.clearmountain.transim.simulator
Klasse
Verantwortlichkeit
Simulator
Interface, welches verschiedene
Implementierungen von Simulator ermöglicht.
DefaultSimulator
Eine Simulator Implementierung, welche aber
so generisch ist, dass sie für alle
Implementierungen vom Interface DataTier
verwendet werden kann.
SimulationThread
Eine Spezialisierung der Klasse Runnable,
welches ein zugewiesenes Benutzermodell in
einer Endlosschleife "ausführt".
3.4.5 Package net.clearmountain.transim.model
Klasse
Verantwortlichkeit
ModelChangeEvent
Event für ModelChangeListener.
ModelChangeListener
Observer Implementierung für Objekte, welche
Änderungen im Simulationsmodell
nachvollziehen müssen.
ModelFactory
Factory zum produzieren von Modellen auf allen
Ebenen der Aggregation (Show, SimulationsModell, Benutzermodell usw.)
ModelParseException
Exception Spezialisierung für Probleme beim
Seite 18 von 66
Parsen einer Modell-Datei.
ModelParser
Eine Spezialisierung der Klasse DefaultHandler,
für das Parsen der XML Modell-Datei.
Operation
Eine Enumeration von Datenbank-Operationen
(d.h. Read, Update usw.)
ParameterSet
Tiefste Stufe des Modells. Ermöglicht das
einmalige definieren mehrfach verwendeter
Parameter für Transaktionsmodelle.
Show
Die höchste Stufe des Modells. Fasst eine oder
mehrere Simulationsmodelle zusammen in
einem "Show".
Showparameters
Erlaubt das Setzen von mehreren showbezogenen Parametern im ApplicationGlobals
auf ein Mal.
SimulationModel
Die Stufe des Modells, welche als ganzen vom
Simulator simuliert wird. Es kann eine oder
mehrere Benutzermodelle umfassen.
TransactionModel
Die Stufe des Modell, welche eine Reihefolge
von Datenbankoperationen festlegt.
UserModel
Die Stufe des Modells, welche eine Menge
Benutzertypen definiert, jeder bestehende aus
einer Menge von Transaktionsmodellen.
3.4.6 Package net.clearmountain.transim.database
Klasse
Verantwortlichkeit
AccountProfile
Enthält alle für ein Benutzer-Account auf einer
Datenbank notwendigen Angaben.
AccountProfileParser
Eine Spezialisierung der Klasse DefaultHandler,
für das Parsen der XML Accounts-Datei.
DatabaseProfile
Enthält alle für ein bestimmtes
Datenbankprodukt spezifische (also nicht
JDBC-Standard entsprechende) Angaben.
DatabaseProfileParser
Eine Spezialisierung der Klasse DefaultHandler,
für das Parsen der XML Databases-Datei.
DataTier
Ein Interface, welche von der Art der
Datenablage abstrahiert. Bietet Methoden wie
read(), update(), commit() usw. Kann für eine
Klasse von Datenablagen, z.B. RDBMS oder
eine Persistenzschicht implementiert werden.
Seite 19 von 66
Jede Simulation verfügt über eine eigene
DataTier-Instanz, welche eine eigene
Verbindung mit der Datenbank unterhält.
DataTierFactory
Ein Interface für die Factory, welche DataTierInstanzen kreiert.
JDBCDataTier
Implementation von DataTier für eine JDBC
Datenablage.
JDBCDataTierFactory
Implementation von DataTierFactory für das
Kreieren von JDBCDataTier Instanzen.
3.4.7 Package net.clearmountain.transim.statistics
Klasse
Verantwortlichkeit
DisplayValues
Datenobjekt, welches genau die Werte enthält,
welche im GUI angezeigt werden können.
ModelStatistics
Datenobjekt, welche die Werte Definiert worin
die statistischen Transaktionsdaten gespeichert
und verwaltet werden können.
SimulationStatistics
Interface für das Objekt, welches für ein
SimulationContext die statistischen
Transaktionsdaten speichert und verwaltet. Es
kreiert auf Anfrage des
StatisticsTransferProcess DisplayValuesInstanzen.
SlidingAverageSimulationStatistics Implementation von SimulationStatistics welche
den gleitenden Durchschnitt aller statistischen
Transaktiondaten errechnen kann.
TransactionStatistics
Datenobjekt, dass die statistischen
Transaktiondaten umfasst. Wird von einem
DataTier-Instanz auf Anfrage eines
SimulationThread erzeugt.
3.5 Abläufe
3.5.1 Hauptabläufe
Das Kernstück des Transaktionssimulators bilden die zwei Hauptabläufe "Screen
Refresh Zyklus" und "Transaction Statistics Zyklus".
Die beiden Zykli greifen also über das SimulationStatistics Objekt in einander, haben
aber sehr unterschiedliche Frequenzen. Der Screen Refresh Zyklus wird durch einen
Timer getaktet, und so regelmässig angestossen. Der Transaction Statistics Zyklus
wird dagegen vom Abschluss einer Transaktion, der in nicht deterministischer Zeit
abläuft, angestossen.
Seite 20 von 66
3.5.1.1 Screen Refresh Zyklus
Der Screen Refresh Zyklus wird getrieben vom StatisticsTransferProcess, welches in
einem separaten Thread und von einem Time getaktet, DisplayValue-Objekte beim
SimulationsStatistics Objekt anfordert, und sie an das StackedPanel des GUI (zur
unvermittelter Ausgabe weitergibt. Die Refresh Rate kann vom Benutzer eingestellt
werden. Weil mehrere Transfers pro Sekunde verarbeitet werden können, entsteht
ein "live" Effekt bei der Simulation.
sd Display-Zyklus
main::StatisticsTransferProcess
statistics::SimulationStatistics
«interface»
lang::Thread
gui::SimulationVisualizer
getSnapshot() :DisplayValues
:DisplayValues
processStatistics(SimulationStatistics)
sleep()
getSnapshot() :DisplayValues
:DisplayValues
processStatistics(SimulationStatistics)
sleep()
3.5.1.2 Transaction Statistics Zyklus
Der Transaction Statistics Zyklus wird getrieben vom SimulationThread, wovon es für
jede Benutzer-Instanz eine gibt. Ein SimulationThread arbeitet in einer
Endlosschleife alle Transaktionsmodelle seines Benutzermodells ab. Am Ende jeder
Transaktion fordert der SimulationThread bei seinem DataTier-Instanz die
statistischen Transaktionsdaten in Form eines TransactionStatistics Objekts an.
Danach liefert er das TransactionStatistics Objekt an das SimulationStatistics ab,
welches damit seine Administration von Messwerte aktualisiert.
Seite 21 von 66
sd Simulationszyklus
simulator::SimulationThread
model::SimulationModel
model::UserModel
model::TransactionModel
database::JDBCDataTier
statistics::SimulationStatistics
next() :UserModel
:UserModel
next() :Tran sactionModel
execute(DataTier)
read(int)
update(int)
etc...()
getTransactionStatistics() :TransactionStatistics
processTransactionStatistics(TransactionStatistics)
3.5.2 Kommunikation zwischen GUI und andere Module
Die Abläufe der interaktiven Steuerung finden sequentiell auf dem s.g. EDT (Event
Dispatch Thread) von Java's Swing statt. Die Betätigung von Controlls wird in Form
von ActionEvents an andere Objekte weitergegeben. Langdauernde Aktionen
müssen zwingend in separaten Thread ablaufen, weil sie sonst den EDT blockieren
und das GUI dadurch nicht mehr flüssig bis gar nicht mehr reagiert.
Eine wichtige Entkopplung zwischen GUI und andere Komponenten, deren
Parameter mittel GUI geändert werden, ist die Singleton Klasse ApplicationGlobals,
welche als Schaltzentrale für die Kommunikation des GUI mit dem Rest dient.
Seite 22 von 66
4 Implementation
4.1 GUI
4.1.1 Simulations-Hauptfenster
Diagramm 7: Simulations-Hauptfenster
Seite 23 von 66
4.1.2 MyMenuBar
XYZ
4.1.3 OptionsPanel
Der Umgang des OptionsPanel rechtfertigt ein eigenes Package.
4.1.3.1 Simulatoroptionen
4.1.3.2 Datenbankoptionen
Seite 24 von 66
4.1.3.3 Skalierungsoptionen
Die Skalierungsoptionen ermöglichen das Einstellen von globalen Werten für die
Skalen der Achsen aller Grafiken. In der Modell-Datei können entsprechende Default
Werte konfiguriert werden.
4.1.3.4 Farboptionen
Für die Farbe-Optionen gibt es keine entsprechenden Anforderungen. Es wurde als
Prototyp entwickelt für die Simulator-, Datenbank- und Skalierungseinstellungen.
Seite 25 von 66
4.2 Simulator
Zusammenfassung von [1] und [2].
Die Testtabelle TrxTable, auf der alle Transaktionen operieren, hat folgende
Attribute:
name
typ
Beschreibung
pkey
numeric(10,0)
autoincrement
Primärschlüssel. Wir in der Applikation für den Update
benötigt.
searchKey
double
Nach diesem Attribut wird beim Lesen gesucht. Die Werte
sind zufällig zwischen 0 und 100 verteilt. Auf diesem Feld
besteht ein Index.
data
int
Dieses Feld wird gelesen und in nachfolgenden UpdateBefehlen jeweils um 1 inkrementiert.
tranCount
int
Dieses Attribut wird unmittelbar bei jedem Update-Befehl
um 1 inkrementiert.
Bemerkungen
Standardmässig wird die Testtabelle mit 100 Datensätze initialisiert. Wesentlich mehr
oder weniger Datensätze erhöhen oder erniedrigen die Wahrscheinlichkeit für
Deadlocks, Phantoms, Lost Updates in nicht-linearer Weise: Um didaktisch
anschauliche Resultate zu demonstrieren, müssen entsprechende Tests gefahren
werden.Jeder Thread-Instanz akkumuliert die Ergebnisse jeder einzelne Transaktion
in seine TransactionStatistics
Seite 26 von 66
Die Klasse SimulationStatistics akkumuliert die TransactionStatistics
Erste R-Operation (in den Transaktionsmodellen R, RR und RU)
Sollen beispielsweise 10% der Datensätze gelesen werden, sucht die Simulation
einen zufälligen Startwert für searchKey zwischen 0 und 90. Ausgehend von diesem
Startwert werden die nächsten 10% gelesen, d.h.
SEL_PRCNT = 10
lowSelBound = Random * (100 - SEL_PRCNT)
maxSelBound = lowSelBound + SEL_PRCT
(lowSelBound, maxSelBound) werden in folgendem SQL-Statement für die
Fragezeichen substituiert
SELECT primKey, data, tranCount FROM TrxTable
WHERE searchKey >= ? AND searchKey < ?
das Statement ausgeführt, und die Daten in einen RecordSet rs eingelesen.
U-Operation
Die Simulation nimmt nur eine einzige Art Änderung auf dem Wert von data vor: Der
Wert wird in der Applikation um 1 erhöht und anschliessend zurück geschrieben. Der
Wert von tranCount wird im Update-Befehl um 1 erhöht (wenn der Datensatz also
bereits mit einer exklusiven Sperre belegt ist).
Der in der R-Operation eingelesene RecordSet rs wird jetzt durchlaufen. Wenn für
einen Datensatz gilt:
Random * 100 <= UPD_PRCNT
denn werden die gelesenen Werte für (data, primKey) in folgendem SQL Statement
UPDATE TrxTable
SET data = ? + 1, tranCount = tranCount + 1
WHERE primKey = ?
substituiert und schliesslich das Statement ausgeführt.
Das UPDATE Statement gibt die Anzahl mutierte Datensätze zurück. Es wird im
Normalfall den Wert 1 zurück erwartet. Wenn aber der Wert 0 zurück kommt heisst
das, dass der Datensatz nicht mehr vorhanden ist, weil eine D-Operation diesen
vorher gelöscht hat. Diesen Fall wird als «Missed Update» d.h. ein Lost Update
gezählt und in totalMissedUpdates totalisiert.
Seite 27 von 66
Die zweite und weitere R-Operation (in Transaktionsmodellen RR...)
Die Datensätze im RecordSet rs werden mit rs.next() gezählt und die Summe in
count1 gespeichert. Danach wird denselben SQL-Code wie in der ersten ROperation ausgeführt, wobei (lowSelBound, maxSelBound) wieder substituiert
werden
SELECT primKey, data, tranCount FROM TrxTable
WHERE searchKey >= ? AND searchKey < ?
und die Datensätze in einen neuen RecordSet rs eingelesen und anschliessend mit
rs.next() gezählt, und die Summe in count2 gespeichert. Und so weiter für 3 und
mehrere R-Operationen.
I-Operation
INSERT TrxTable
WHERE searchKey >= ? AND searchKey < ?
D-Operation
DELETE FROM TrxTable
WHERE serachKey >= ? AND searchKey < ?
Es wird ein Prozentsatz der in der vorangegangenen R-Operation gelesenen
Datensätze gelöscht.
Lost Updates
Lost Updates können auftreten, wenn mehrere Transaktionen denselben Wert lesen,
bearbeiten, und später das Ergebnis zurück schreiben bzw. einen Datensatz
löschen, also beim Transaktionsmuster RU und einer Mischung von RU und D.
Die Differenz zwischen data und tranCount entspricht der Anzahl Lost-Updates.
SELECT SUM(tranCount - data)
FROM TrxTable
hinzugezählt werden müssen aber noch die totalMissedUpdates.
Phantoms
Phantome treten nur bei wiederholtem lesen, also bei Transaktionsmuster RR auf in
Kombination mit einer I-Operation. Die Zahl ergibt sich aus abs(count2 - count1).
Seite 28 von 66
Deadlocks
Die Deadlocks werden gezählt nach der entsprechende Anzahl SQLExceptions
welche geworfen werden mit SQLState = 40001.
4.3 Konfigurator
Der Konfigurator besteht aus folgenden XML Dateien:
Datei
Zweck
TRANSIM_HOME\model.xml
Definiert die Simulationsmodelle
TRANSIM_HOME\databases.xml
Definiert datenbank-produkspezifische Angaben
TRANSIM_HOME\accounts.xml
Definiert Datenbankbenutzer-Accounts
Die Modellhierarchie ist im
Diagramm 8: Modellhierarchie
Der Transaktionssimulator verwendet für alle Modelle eine einzige
Konfigurationsdatei, welche standardmässig TRANSIM_HOME\model.xml ist. In der
Anwendung kann im Menü Datei -> Öffnen eine andere XML-Datei geladen werden.
4.3.1 model.xml
Die Datei model.xml definiert das Modell in fünf Ebenen auf:
Tag
Ebene
parameterSets
Mit Parametersets können oft verwendete Parameterwerte für
ein Transaktions-Modell einmal definiert und mehrfach
Seite 29 von 66
Tag
Ebene
referenziert werden.
transactionModels
Das Transaktionsmodell (transaction model) repräsentiert eine
Reihefolge von Datenbank-Operationen aus welcher eine
bestimmter Transaktions-Typ besteht. Die mögliche
Operationen sind: Read, Update, Insert, Delete und Commit.
So bedeutet die Notation "RR" Read-Read, also zwei LeseOperationen nach einander.
userModels
Das Benutzermodell (user model) repräsentiert ein
Benutzertyp. Es besteht aus eine Reihefolge von
Transaktionsmodellen. So bedeutet die Notation "Benutzertyp
A: 2 x RR + 1 x RU", dass ein Benutzer vom Typ A zweimal
eine Transaktion vom Typ "RR" und danach eine Transaktion
vom Typ "RU" ausführt.
simulationModels
Das Simulationsmodell (simulation model) ist das, was der
Simulator während einer Simulation "ausführt", d.h. eine oder
mehrere Instanzen von einem oder mehreren Benutzertypen.
Der Benutzer der Transaktions-simulators kann in jeder Hälfte
des Simulations-Fensters ein Simulationmodell selektieren
und simulieren. Das Simulationsmodell besteht aus einem
oder mehreren Benutzermodelle. So bedeutet die Notation 1 x
A + 2 x B, dass die Simulation Benutzertypen A und B in
einem Mengenverhältnis 1:2 enthält. Wenn der Simulation z.B.
über 30 Simulations-Threads verfügt, gäbe dies 10 simulierte
Instanzen von Benutzertyp A und 20 von Benutzertyp B.
shows
Eine Show fasst eine oder mehrere Simulationsmodelle
zusammen. Eine model.xml Datei kann mehrere Shows
umfassen, welche über das Datei-Menu selektierbar sind.
Eine Model muss nur einmal definiert werden, und kann über seinen id von anderen
Modellen mehrfach referenziert werden.
Beispiel: Das Simulationsmodell mit dem Namen "Demo 3" hat die id "Demo3".
<simpleSimulationModel id="Demo3">
<name>Demo 3</name>
<transactionModelRef ref="RU_2" qty="2"/>
<transactionModelRef ref="RR_2" qty="1"/>
</simpleSimulationModel>
Das Simulationsmodell referenziert u.A. das Transaktionsmodell mit dem id "RU_2",
das anderswo wie folgt definiert wurde
<transactionModel id="RU_2">
<name>RU2</name>
<isolationLevel>2</isolationLevel>
<parameterSetRef ref="default_RU"/>
</transactionModel>
Die ids und Namen sind frei wählbar.
Seite 30 von 66
4.3.1.1 parameterSets
Im Element parameterSets können null oder mehrere Elemente vom Typ
parameterSet definiert werden. Ein parameterSet verfügt über ein id Attribut
anhand wovon es von einem oder mehreren Transaktionsmodellen referenziert
werden kann. Folgende Angaben gelten immer für eine Transaktion. Der
parameterSet kann folgende Elemente beinhalten:
Element
Verwendung Steuert
Bereich
pattern
obligatorisch
Das Transaktionsmuster, d.h. die
Sequenz von DatenbankOperationen.
Der Syntax in
EBNF: (R | RU | RD
| I )+
readPercent
optional
Wie viel Prozent der Datensätze
eine R-Operation in der Datenbank
liest
0-100
updatePercent
optional
Wie viel Prozent der in der
vorangegangenen R-Operation
gelesenen Datensätze von der UOperation geändert wird
0-100
insertAmount
optional
Wie viele Datensätze in die
Datenbank eingefügt werden
deletePercent
optional
Wie viel Prozent der in der
vorangegangenen R-Operation
gelesenen Datensätze von der DOperation gelöscht wird
0-100
operationDelay obligatorisch
Wie gross der Zeitabstand in
Millisekunden zwischen zwei
Operationen durchschnittlich sein
soll. Der Transaktionssimulator
erzeugt Zufallswerte mit uniformer
Verteilung.
nicht-negative
Ganzzahl
commitDelay
Wie gross der Zeitabstand in
Millisekunden zwischen der letzten
Operation und dem COMMIT ist. Ein
negativer Wert repräsentiert das
Ausbleiben eines COMMIT, d.h.
führt i.d.R. zu einem Timeout.
obligatorisch
nicht-negative
Ganzzahl
Ganzzahl
4.3.1.2 transactionModels
Im Element transactionModels können null oder mehrere Elemente vom Typ
transactionModel definiert werden. Ein Transaktionsmodell verfügt über ein id
Attribut, anhand wovon es von Benutzermodellen referenziert werden kann.
Ein transactionModel, dass ohne Hilfe eines parameterSet definiert wird, kann
dieselbe Elemente enthalten wie ein parameterSet, und zusätzlich die folgenden
Elemente:
Element
Verwendung Steuert
Bereich
name
obligatorisch
Syntax in EBNF: [AZa-z_]+[A-Za-z_0-9
Den Namen, unter welche das
Transaktionsmodell im GUI sowie
Seite 31 von 66
Element
Verwendung Steuert
in den Statistiken bekannt ist.
Wenn mehrere
Transaktionsmodelle in einer
Simulation denselben Namen
haben, werden sie bezüglich
Anzeige und statistischen Werten
nicht unterschieden.
isolationLevel
obligatorisch
parameterSetRef optional /
mehrfach
Bereich
\-]*
Der Isolationsgrad unter welchem
die Transaktion auf der Datenbank
läuft.
0-3
Die Referenz auf ein
parameterSet, welches die
weiteren des Transaktionsmodells
Elemente enthält.
Attribut "ref" mit
Syntax in EBNF: [AZa-z_]+[A-Za-z_0-9
\-]*
Beispiel:
<transactionModel id="RI_10">
<name>RI1_1</name>
<isolationLevel>1</isolationLevel>
<pattern>RI</pattern>
<readPercent>1</readPercent>
<operationDelay>10</operationDelay>
<commitDelay>0</commitDelay>
</transactionModel>
Ein Transaktionsmodell, dass die Werte eines parameterSets verwendet, hat neben
den Attributen in Tabelle XYZ mittels des Elements parameterSetRef eine
Referenz auf den parameterSet:
Beispiel:
<transactionModel id="I_0">
<name>I0</name>
<isolationLevel>0</isolationLevel>
<parameterSetRef ref="default_I"/>
</transactionModel>
4.3.1.3 userModels
Im Element userModels können null oder mehrere Elemente vom Typ userModel
definiert werden. Ein Benutzermodell verfügt, wie alle Modelle, über eine id anhand
wovon es von Simulationsmodellen referenziert werden kann.
Das userModel hat folgende Elemente:
Seite 32 von 66
Element
Verwendun
g
Steuert
Bereich
name
obligatorisc
h
Den Namen, unter welche das
Benutzermodell im GUI sowie in
den Statistiken bekannt ist.
Wenn mehrere Benutzermodelle
in einer Simulation denselben
Namen haben, werden sie
bezüglich Anzeige und
statistischen Werten nicht
unterschieden.
Syntax in EBNF:
[A-Za-z_]+[A-Zaz_0-9 \-]*
interTransactionDela
y
obligatorisc
h
Wie gross der Zeitabstand in
Millisekunden zwischen Transaktionen desselben Benutzers
durchschnittlich sein soll. Der
Transaktionssimulator erzeugt
Zufallswerte mit uniformer
Verteilung.
transactionModelRef
optional /
mehrfach
Die Referenz auf ein
transactionModel. Das
Attribut "ref" enthält die id des
referenzierten
Transaktionsmodells. Das
Attribut "qty" definiert die relative
Menge des Transaktionsmodells
innerhalb des Benutzermodells.
nicht-negative
Ganzzahl
Attribut "ref":
Syntax in EBNF:
[A-Za-z_]+[A-Zaz_0-9 \-]*
Attribut "qty": nichtnegative Ganzzahl
Beispiel:
<userModel id="oltp">
<name>OLTP-Benutzer</name>
<interTransactionDelay>100</interTransactionDelay>
<transactionModelRef ref="RR_10" qty="2"/>
<transactionModelRef ref="RU_10" qty="1"/>
<transactionModelRef ref="RD_10" qty="1"/>
<transactionModelRef ref="RI_10" qty="1"/>
</userModel>
4.3.1.4 simulationModels
Simulationsmodelle gibt es in zwei Varianten: das simulationModel und das
simpleSimulationModel. Das simpleSimulationModel lässt die
Modellierungsebene des userModel aus, und besteht somit lediglich aus
Transaktionsmodellen. Die Anwendung schiebt später automatisch das
Benutzermodell "default" zwischendrin. Das simpleSimulationModel erlaubt eine
einfache Modellierung für Fälle worin nur das Verhalten von Transaktionsmodellen
interessiert.
Im Element sumlationModels können null oder mehrere Elemente vom Typ
simulationModel oder simpleSimulationModel definiert werden. Ein
Seite 33 von 66
Simulationsmodell verfügt wieder über eine id anhand wovon es von Shows
referenziert werden kann.
Das simpleSimulationModel hat folgende Elemente:
Element
Verwendung Steuert
Bereich
name
obligatorisch
Den Namen worunter das
Simulation in der
Anwendung aus einer Liste
gewählt werden kann.
Syntax in
EBNF: [A-Zaz_]+[A-Za-z_09 \-]*
transactionModelRef
optional /
mehrfach
Die Referenz auf ein
transactionModel. Das
Attribut "ref" enthält die id
des referenzierten
Transaktionsmodells. Das
Attribut "qty" definiert die
relative Menge des
Transaktionsmodells
innerhalb des
Simulationsmodells.
Attribut "ref":
Syntax in
EBNF: [A-Zaz_]+[A-Za-z_09 \-]*
Attribut "qty":
nicht-negative
Ganzzahl
Beispiel:
<simpleSimulationModel id="Demo3">
<name>Demo 3</name>
<transactionModelRef ref="RU_2" qty="2"/>
<transactionModelRef ref="RR_2" qty="1"/>
</simpleSimulationModel>
Das simulationModel hat folgende Elemente:
Element
Verwendung Steuert
Bereich
name
obligatorisch
Den Namen worunter das
Simulation in der
Anwendung aus einer Liste
gewählt werden kann.
Syntax in EBNF:
[A-Za-z_]+[A-Zaz_0-9 \-]*
userModelRef
optional /
mehrfach
Die Referenz auf ein
userModel. Das Attribut
"ref" enthält die id des
referenzierten
Benutzermodells. Das
Attribut "qty" definiert die
relative Menge des
Benutzermodells innerhalb
des Simulationsmodells.
Attribut "ref":
Syntax in EBNF:
[A-Za-z_]+[A-Zaz_0-9 \-]*
Attribut "qty":
nicht-negative
Ganzzahl
Beispiel:
<simulationModel id="sim1">
<name>Simulation 1</name>
<userModelRef ref="olap" qty="1"/>
Seite 34 von 66
<userModelRef ref="oltp" qty="1"/>
</simulationModel>
4.3.1.5 shows
Eine model.xml Datei kann mehrere Shows umfassen, welche über das DateiMenu selektierbar sind. Das Element shows umfasst null oder mehrere Elemente
vom Typ show. Das show Element kann null oder mehrere Simulationsmodelle
umfassen. Folgende Elemente sind definiert:
Element
Verwendung Steuert
Bereich
name
obligatorisch
Den Namen worunter das
Simulation in der
Anwendung aus einer Liste
gewählt werden kann.
Syntax in
EBNF: [A-Zaz_]+[A-Za-z_09 \-]*
simulationModelRef
optional /
mehrfach
Die Referenz auf ein
simulatonModel. Das
Attribut "ref" enthält die id
des referenzierten
Simulationsmodells.
Attribut "ref":
Syntax in
EBNF: [A-Zaz_]+[A-Za-z_09 \-]*
Zusätzlich diesen Elementen können im showParameters Element Einstellungen für
diverse Parameter gemacht werden. Diese sind unterteilt in drei Gruppen:
scalesParameters, simulatorParameters und databaseParameters.
scalesParameters
resultsTotalInNumberPerSecond
Höhe der Achse der 1. Grafik "Resultate
Total"
resultsTotalInMilliseconds
Höhe der Achse der 2. Grafik "Resultate
Total"
resultsPerUserModelInNumberPerSecond
Höhe der Achse der Grafik "Resultate pro
Benutzermodell"
resultsPerTransactionModelInNumberPerSecond Höhe der Achse der Grafik "Resultate pro
Transaktionsmodell"
numberOfUserModelGraphPositions
Anzahl Bar Charts welche in der Grafik
"Resultate pro Benutzermodell"
nebeneinander Platz haben
numberOfTransactionModelGraphPositions
Anzahl Bar Charts welche in der Grafik
"Resultate pro Transaktionsmodell"
nebeneinander Platz haben
simulatorParameters
concurrentThreadsInNumber
Die Anzahl gleichzeitige Threads. Jeder
Thread simuliert einen konkreten
Benutzer. Die userModel werden
gemäss ihrer durch "qty" spezifizierten
relativen Mengen an die Threads
zugeteilt (Maximum 1'000).
refreshRateInNumberPerSecond
Die Frequenz womit die gesammelten
Seite 35 von 66
Statistik-Daten im GUI erneuert werden
(Maximum 20).
simulationTimeInSeconds
Die Zeitdauer bevor die Simulation
automatisch beendet wird. NICHT
IMPLEMENTIERT.
windowLengthInSeconds
Das Zeitfenster worüber der gleitende
Durchschnitt über alle Messgrössen
berechnet wird. Bei einem Wert 0, d.h.
null, wird der aggregierte Durchschnitt
über die ganze Simulationszeit
berechnet.
databaseParameters
numberOfRecords
Die Anzahl Datensätze in der
Simulations-Datenbank. Nach jedem
Stopp der Simulation wird die Datenbank
wieder neu aufgebaut und mit dieser
Anzahl Datensätze abgefüllt.
defaultAccountProfile
Das zu verwendete Account-Profil,
welches in accounts.xml definiert sein
muss.
Alle Parameter sind optional und wenn sie nicht spezifiziert sind, werden
einprogrammierte Defaults verwendet.
Die scalesParameters gelten für beide Simulatoren. Die simulatorParameters und die
databaseParameter können jedoch für jeden Simulator separat eingestellt werden.
Dies bietet die Möglichkeit z.B. verschiedene Datenbanksystem zu vergleichen.
Beispiel:
<show>
<name>1. Demo-Ablauf</name>
<simulationModelRef ref="Demo1"/>
<simulationModelRef ref="Demo2"/>
<simulationModelRef ref="Demo3"/>
<simulationModelRef ref="Demo4"/>
<simulationModelRef ref="Demo5"/>
<simulationModelRef ref="Demo7"/>
<showParameters>
<scalesParameters>
<resultsTotalInNumberPerSecond>100</
resultsTotalInN...>
<resultsTotalInMilliseconds>600</resultsTotalInMill...>
<resultsPerUserModelInNumberPerSecond>80</resultsPe...>
<resultsPerTransactionModelInNumberPerSecond>80</re...>
Seite 36 von 66
<numberOfUserModelGraphPositions>6</numberOfUserMod...>
<numberOfTransactionModelGraphPositions>6</numberOf...>
</scalesParameters>
<simulatorParameters>
<concurrentThreadsInNumber>10</concurrentThreadsInN...>
<refreshRateInNumberPerSecond>5</refreshRateInNumbe...>
<simulationTimeInSeconds>0</simulationTimeInSeconds>
<windowLengthInSeconds>10</windowLengthInSeconds>
</simulatorParameters>
<databaseParameters>
<numberOfRecords>100</numberOfRecords>
<defaultAccountProfile>My
Account</defaultAccountPr...>
</databaseParameters>
</showParameters>
</show>
4.3.2 databases.xml
Damit der Transaktionssimulator mit verschiedenen Datenbankprodukten
funktioniert, sind gewisse Konfigurationsdaten in der Datei databases.xml
ausgelagert. Diese sind:
Konfigurationselement
Zweck
createTrxTableStatement
Der SQL-Befehl womit die Simulationstabelle
erzeugt wird.
createTrxIndexStatement
Der SQL-Befehl womit der Index für die
Simulationstabelle erzeugt wird.
perConnectionOptionsStatements SQL-Befehle womit pro JDBC-Session Optionen
in der Datenbank eingestellt werden.
driverClass
Der vollständige Klassename des zu
verwendenden JDBC-Drivers. Zusätzlich muss in
der Umgebungsvariable CLASSPATH der
Verzeichnispfad zur .class oder .jar Datei
des JDBC-Treibers angegeben sein.
Beispiel:
<?xml version="1.0" encoding="UTF-8"?>
<databases>
<database name="Sybase SQL Anywhere 9">
<createTrxTableStatement> CREATE TABLE TrxTable_$ID$ (
primKey NUMERIC( 10,0) NOT NULL DEFAULT AUTOINCREMENT,
Seite 37 von 66
searchKey DOUBLE NOT NULL CHECK ( searchKey >= 0 AND searchKey <=
100 ),
data INT NOT NULL DEFAULT 0,
tranCount INT NOT NULL DEFAULT 0,
PRIMARY KEY ( primKey ) )
</createTrxTableStatement>
<createTrxIndexStatement>CREATE INDEX i_TrxTable_$ID$_SearchKey ON
TrxTable_$ID$( searchKey )
</createTrxIndexStatement>
<perConnectionOptionsStatements>
<option>SET OPTION COOPERATIVE_COMMITS = OFF</option>
<option>SET OPTION DELAYED_COMMITS = OFF</option>
</perConnectionOptionsStatements>
<driverClass>com.sybase.jdbc2.jdbc.SybDriver</driverClass>
</database>
<database name="MySQL 5.0">
<createTrxTableStatement> CREATE TABLE TrxTable_$ID$ (
primKey INTEGER NOT NULL AUTO_INCREMENT,
searchKey DOUBLE NOT NULL CHECK ( searchKey >= 0 AND searchKey <=
100 ),
data INT NOT NULL DEFAULT 0,
tranCount INT NOT NULL DEFAULT 0,
PRIMARY KEY ( primKey ) )
</createTrxTableStatement>
<driverClass>com.mysql.jdbc.Driver</driverClass>
</database>
</databases>
Das Format der Simulationstabelle sowie die Funktionsweise des Simulators ist
ausserhalb des Rahmens dieser Benutzeranleitung.
4.3.3 accounts.xml
Damit der Transaktionssimulator Zugriff auf eine Datenbank erhält muss mindestens
ein Account in der Datei accounts.xml konfiguriert sein. Ein Account kann als Default
markiert sein, ansonsten wird nach Starten der Anwendung das erste Account als
Default gewählt.
Beispiel:
<?xml version="1.0" encoding="UTF-8"?>
<accounts>
<account name="My local SQL Anywhere 9 Server" default="yes">
<databaseRef ref="Sybase SQL Anywhere 9"/>
<userName>dba</userName>
<password>sql</password>
<connectionURL>jdbc:sybase:Tds:localhost:2638?ServiceName=asademo</conne...>
Seite 38 von 66
</account>
<account name="My network SQL Anywhere 9 Server">
<databaseRef ref="Sybase SQL Anywhere 9"/>
<userName>dba</userName>
<password>sql</password>
<connectionURL>jdbc:sybase:Tds:localhost:2638?ServiceName=asademo</conne...>
</account>
<account name="My local MySQL 5.0 Server">
<databaseRef ref="MySQL 5.0"/>
<userName>root</userName>
<password>sql</password>
<connectionURL>jdbc:mysql://localhost/test</connectionURL>
</account>
</accounts>
Seite 39 von 66
5 Tests
5.1 Units Tests
Aufgrund des visuellen Charakters des GUI müssen alle Tests manuell
vorgenommen werden. Aufgrund des nicht-deterministischen Charakters (multithreading) des Simulators, können auch hier nur manuelle Tests vorgenommen
werden. Weil somit kein automatisierter Integrationstest möglich ist, wurde für die
übrigen Module auf flächendeckende Unit-Tests verzichtet.
Beim Konfigurator wurden die toString() implementiert, womit auch komplexe
hierarchische Strukturen, wie die Modelle sind, zur Kontrolle auf der Konsole
ausgedruckt werden können.
5.2 Integrationstests
In einer ersten Phase wurde das GUI weitgehend entwickelt, und danach der
Konfigurator. Dies erlaubte das Testen des Konfigurators, durch die Visualisierung
des Modells im GUI. Die verwendeten Szenarien sind im Beispiel model.xml definiert.
Die Kontrolle fand handmässig bzw. mit dem Auge statt. Mit der GUIDebugger
Klasse konnte jeweils die gesamt Objektstruktur des GUI erzeugt und kontrolliert
werden.
In einer zweiten Phase sollte ein Simulator eingebaut werden. Dies geschah in einem
ersten Schritt mit einem Dummy, der MockSimulator, welche mit Zufallszahlen
funktioniert. Zum vergleich wurde einen zweiten Dummy beigezogen, welche mit
deterministischen Zahlen funktioniert, der ConstantMockSimulator. So konnten GUI
und Kondigurator weiter entwickelt und getestet werden.
In der dritten Phase wurde der Simulator entwickelt, und mit dem lauffähigen GUI
und Konfigurator integriert. Es stellte sich heraus, dass der Simulator völlig frei von
Datenbank-Details aufgebaut, und der Datenbankzugriff an eine DataTier-Instanz
delegiert werden konnte. Zuerst wurden der DataTier und seine DataTierFactory
durch die Dummies MockDataTier und MockDataTierFactory vertreten. Als der
Simulator weit genug entwickelt war, indem er vom GUI steuerbar war, und die
Modelle "ausführen" konnte, wurde effektive Implementierungen entwickelt und in
den Rest integriert.
Mit dem mittlerweile funktionsfähigen Gesamtprogramm wurde mehrmals zusammen
mit dem Auftraggeben experimentiert, und die Simulationsergebnisse verifiziert.
5.3 Abnahmetest
CON.6 Für den Abnahmetests müssen folgende zwei Konfigurationen (Szenarien)
konfiguriert werden können:
a)
Szenario "OLTP-Benutzer"
Seite 40 von 66
Anteil
Transaktionsmuster
gelesen
2
R
10%
1
RU
10%
10
1
RD
1%
10
1
RI
1%
10
b)
Pause (ms)
Szenario "OLAP-Benutzer"
Anteil
Transaktionsmuster
gelesen
Pause (ms)
3
RR
10%
100
2
RRR
70%
500
1
RRRR
100%
1000
Die Simulationsergebnisse wurden vom Betreuer als plausibel eingeschätzt und das
Programm abgenommen. Weitere Feedbacks werden aus der Nutzung im Unterricht
erwartet.
Seite 41 von 66
6 Besprechung
6.1 Beurteilungsrelevante Kriterien
Kriterium
Grundlagen
Projektdefinition, Pflichtenheft
Pflichtenheft [1]
Aufwandschätzung, Zeitplanung
- Kap. 6.5 Aufwandschätzung
- Kap. 6.3.2 Zeitplan
Implementation
- Kap. 3 Architektur/Design
- Kap. 4 Implementation
- Code
Verifizierung, Test
- Diverse Workshops mit dem Betreuer
(Auftraggeber)
- Kap. 5 Tests
Projektmanagement
6.3.2 Zeitplan
Kreativität, Initiative, Selbständigkeit
Übereinstimmung Produkt /
Anforderungen
Kap. 6.2 Abweichungen zum
Pflichtenheft
Dokumentation
- Benutzeranleitung [4]
- Kap. 3 Architektur/Design
- Code (Bezeichner), Kommentar im
Code
Abnahme
Diverse Meetings mit dem Betreuer bzw.
dem Auftraggeber und dem Experten,
sowie Abnahme durch den Auftraggeber.
Schlusspräsentation der Diplomarbeit
Findet nach Abgabe diesen Berichts statt
6.2 Abweichungen zum Pflichtenheft
6.2.1 Anforderungsabdeckung
AnforderungsID
PRO.1 #1
PRO.1 #2
PRO.1 #3
PRO.2
Formulierung
Umsetzung
Der Transaktionssimulator soll als Rich-Client implementiert
werden, ...
... der über ein Netzwerk auf eine Datenbank zugreift.
Im Trivialfall muss die Datenbank auf demselben Rechner wie
der Transaktionssimulator laufen können.
Die Simulationsmodelle und andere Konfigurationsdaten
werden auf einer Dateiablage des Benutzers gespeichert.
100%
100%
100%
100%
Seite 42 von 66
SCH.1
Folgende Software Schnittstellen sind zu unterstützen:
SCH.1 a
a) Java Runtime Environment Version ab 1.4 (kapselt u.a. den
Zugriff auf das Filesystem)
b) JDBC für die Kommunikation mir der Datenbank (JDBC
kapselt den Zugriff auf die Datenbank)
Der Transaktionssimulator muss mit 1 GB RAM oder mehr
[sic!] im Rechner laufen können.
Der Transaktionssimulator muss weniger als 30 GB
Festplattenspeicher benötigen.
Die Installation soll für den Benutzer einfach sein, z.B. mittels
eines einzigen jar-File zum auspacken, oder on-the-fly Laden
und Starten über Internet via Java Webstart.
Der Transaktionssimulator muss in Java programmiert werden.
Die Schnittstelle zur Datenbank soll so konzipiert werden, dass
eine spätere Einbindung eines auf Java Persistence Framework
(JPA) basierten Persistence Layer ohne grosse Änderungen am
Design zwischengeschoben werden kann.
Das GUI muss die Resultate von zwei Simulationen
nebeneinander («sideby-side») anzeigen können.
Das GUI muss die Resultate einer Simulation in einem BalkenDiagramm visualisieren.
Die Achsen der Resultat-Grafiken dürfen fix eingestellt sein, d.h.
müssen sich nicht dynamisch an die Messwerte anpassen.
Das GUI muss dem User ermöglichen die Maximalwerte der
Achsen der Resultat-Grafiken auf der Show -Ebene ein zu
stellen.
SCH.1 b
MEM.1
MEM.2
BET.1
RES.1
RES.2
GUI.1
GUI.2
GUI.3
GUI.4
GUI.5 #1
GUI.5 #2
GUI.6
GUI.7
GUI.7 a #1
GUI.7 a #2
GUI.7 b
GUI.8
GUI.9
GUI.9 a z
GUI.9 a l
GUI.9 b
GUI.9 c
GUI.9 d
GUI.9 e
-
Wenn anzuzeigende Ergebniswerte den Maximalwert einer
Achse übertreffen, muss das GUI im Resultat-Grafik nur den
Maximalwert zeigen ...
... und muss das GUI im Status-Bar eine entsprechende
Fehlermeldung zeigen.
Das GUI muss dem User ermöglichen auf Applikations-Ebene
ein zu stellen wie oft die Grafiken pro Sekunde geupdated
werden («Refresh-Rate»).
Das GUI muss Simulations-Resultate darstellen:
a) Pro Transaktionsmodell der Simulation die in SIM.2.a bis
SIM.2.d definierten Werte.
a) Für die gesamte Simulation die in SIM.2.a bis SIM.2.d
definierten Werte.
Pro User-Modell der Simulation die in SIM.2.a bis SIM.2.d
definierten Werte.
b) Für die gesamte Simulation die in SIM.2.e und SIM.2.f
definierten Werte.
Das GUI muss dem User ermöglichen eine Simulation zu laden,
zu starten, anzuhalten, und zu stoppen.
Wenn eine Simulation angehalten ist, muss das GUI dem User
ermöglichen folgende Parameter zu ändern:
a) Transaktionsmodell (zufügen)
a) Transaktionsmodell (löschen)
b) Relative Menge eines Transaktionsmodells
c) Isolationsgrad für ein Transaktionsmodell
d) Prozent gelesener Datensätze (R%)
e) Prozent geänderte Datensätze von R% (U%)
0%
100%
100%
100%
100%
100%
100%
100%
100%
100%
100%
100%
100%
100%
100%
100%
100%
100%
0%
100%
100%
100%
Seite 43 von 66
GUI.9 f
GUI.9 g
GUI.10 #1
GUI.10 #2
GUI.11
DAT.1
DAT.2
DAT.3
SIM.1
SIM.2
SIM.2 a
SIM.2 b
SIM.2 c
f) Anzahl geänderte Datensätze pro Transaktion (I)
g) Prozent gelöschter Datensätze (D%)
Das GUI muss dem User ermöglichen eine angehaltene
Simulation weiterlaufen zu lassen. ...
... Die Simulation muss dabei die eventuell angepassten
Parameter verwenden.
Das GUI ermöglicht dem User das Zeitfenster für die
Berechnung der gleitenden Durchschnittswerte auf
Applikations-Ebene ein zu stellen.
Die Anwendung muss auf Simulations-Ebene auf
unterschiedliche Datenbank-Produkte zugreifen können
(innerhalb desselben Programmlaufes).
Der Zugriff auf die Datenbank muss über JDBC erfolgen.
100%
100%
100%
100%
100%
100%
100%
Die Anwendung muss die benötigten Datenbank-Treiber laden.
Die Treiber selber sind nicht im Lieferumfang des
Transaktionssimulators.
Der Simulator funktioniert gemäss dem im [1] und [2] sowie
Anhang A dargelegten Prinzip.
Der Simulator erfasst pro Transaktionsmodell für das
eingestellte Zeitfenster folgende Werte:
a) Anzahl Transaktionen
b) Anzahl Deadlocks
c) Anzahl Missed Updates
100%
100%
100%
100%
-
SIM.2 d
SIM.2 e
SIM.2 f
SIM.3
d) Anzahl Phantoms
e) Transaktionszeit
f) Deadlock-Zeit
SQL-Ausdrücke insbesondere für Locking, Transaktionen sowie
Datanbank-Optionen, müssen als Konfigurationsdaten
produktspezifisch einstellbar sein.
100%
100%
100%
100%
SIM.4
Der Simulator muss die Isolationsgrade 0 bis 3 unterstützen.
100%
SIM.5
SIM.5 a
Der Simulator muss folgende Parameter verwenden:
a) Simulationszeit in Sekunden. 0 = kontinuierlicher Lauf
SIM.5 b
SIM.5 c
b) Zeitfenster für die Berechnung gleitender Durchschnitte
c) Anzahl gleichzeitige Threads
100%
100%
SIM.5 d
d) DatabaseConnectionProfile welche die Datenbank definiert
worauf die Simulation ausgeführt werden soll
e) (Optional) Database-Spezifische Optionen können
ausgewählt werden
Der Konfigurator bietet dem User die Möglichkeit folgende
Entitäten zu verwalten (siehe auch Fachklassendiagramm):
a) Show
b) Simulation
c) Transaktions-Modell
d) Simulationsparameter
e) DatabaseConnectionProfile
100%
SIM.5 e
CON.1
CON.1 a
CON.1 b
CON.1 c
CON.1 d
CON.1 e
CON.2
CON.3
0%
Ein Simulationsmodell besteht aus (k)einem oder mehreren
Transaktionsmodellen und deren relativen Mengen.
Ein Transaktionsmodell hat besteht aus folgenden Parametern:
100%
100%
100%
100%
100%
100%
100%
-
Seite 44 von 66
CON.3 a
CON.3 b
CON.3 c
CON.3 d
CON.3 e
CON.3 f
CON.3 g
DES.1 a
a) Transaktionsmuster (z.B. RR oder RU)
b) Isolationsgrad (0-3)
c) Anzahl gelesene Datensätze in Prozent (R%)
d) Anzahl geänderte Datensätze in Prozent von R% (U%)
e) Absolute Anzahl geänderte Datensätze (I)
f) Anzahl der gelöschten Datensätze in Prozent (D%)
g) (Optional) Flag ob Transaktion mit Commit abgeschlossen
wird
Die Konfiguration der Modelle muss in einer lokal abgelegten
XML-Datei erfolgen.
Optional bietet das GUI dem Benutzer die Möglichkeit die
Konfiguration der Modelle im GUI vor zu nehmen.
Für den Abnahmetests müssen folgende zwei Konfigurationen
(Szenarien) konfiguriert werden können:
a) Szenario "OLTP-Benutzer"
b) Szenario "OLAP-Benutzer"
Für folgende Modulen müssen abstrakte Schnittstellen
verwendet werden, damit verschiedene Implementationen
verwendet werden können (compiletime):
a) Simulator
DES.1 b
DES.1 c
b) Visualisierung der Simulationsergebnisse
c) Datenbank-Produkt
100%
100%
DES.1 d
d) Optional: Datenzugriff (JDBC und JPA)
100%
DES.2 #1
Die in GUI.6 definierten Parameter müssen auf der Ebene
Application, Show und Simulationsmodell definiert werden
können, wobei die tiefere Ebene Vorrang über die höhere
Ebene hat.
Die in SIM.5 definierten Parameter müssen auf der Ebene
Application, Show und Simulationsmodell definiert werden
können, wobei die tiefere Ebene Vorrang über die höhere
Ebene hat.
100%
CON.4
CON.5
CON.6
CON.6 a
CON.6 b
DES.1
DES.2 #2
100%
100%
100%
100%
100%
100%
100%
100%
100%
100%
100%
100%
WAR.1
Der Code soll angemessen kommentiert sein.
100%
EK.1
Die Beschaffungskosten eingekaufter Komponenten dürfen SFr.
200.- nicht übersteigen.
Die Berner Fachhochschule erhält die Verwertungsrechte auf
das Produkt für nicht-kommerzielle Zwecke im Rahmen ihrer
Ausbildungsaufgaben.
Bei der Verwendung von Softwaremodulen von Dritter (u.a.
auch Open Source) müssen die in den Lizenzvereinbarungen
festgehaltenen Restriktionen und Auflagen eingehalten werden.
Urheber der Software und Begleitdokumente ist Paul
Klarenberg.
Bei der Verwendung von Modulen Dritter (u.a. Open Source)
müssen die in den Lizenzvereinbarungen verlangte Vermerke
100%
LIZ.1
LIZ.2
LEG.1
LEG.2
50%
100%
Seite 45 von 66
umgesetzt werden.
# -> Später zugefügte Unterteilung um nicht-atomische Anforderungen zu splitten
6.2.2 Nicht umgesetzte Anforderungen
GUI.9 b b)
Wenn eine Simulation angehalten ist, muss das GUI dem User ermöglichen folgende
Parameter zu ändern: Relative Menge eines Transaktionsmodells
Nicht umgesetzt, weil in der Analyse nicht davon ausgegangen war, dass dadurch
Parameter manipuliert werden müssen sowohl des Transaktionsmodell wie des
Benutzermodells. Dies würde das GUI überladen. Gemäss Auftraggeber würde es
reichen, die Parameter der Transaktionsmodelle einzustellen, und auf darauf dem
Benutzermodell zu verzichten.
SIM.5 a
Der Simulator muss folgende Parameter verwenden: a) Simulationszeit in Sekunden.
0 = kontinuierlicher Lauf
Nicht umgesetzt, weil sich für diese Funktion kein Nutzen herausstellte. Das
interaktive Starten und Stoppen der Simulation reicht völlig aus.
6.3 Vorgehen
6.3.1 Vorgehensmodell
Zum Anfang des Projekts wurde mit Unterstützung des Experten ein iteratives
Vorgehen für das Projekt zusammengestellt (siehe Diagramm 9). Das Bedürfnis für
iteratives Vorgehen war vorhergesehen aufgrund der Komplexität sowie des
Werkzeug-Charakters des Transaktionssimulators.
Das Vorgehen konnte nur grob eingehalten werden. Wegen der starke Abhängigkeit
der drei Hauptmodule und die noch grösser als erwartete Komplexität im GUI,
musste öfters iteriert werden als vorgesehen.
Diese hohe Anzahl Iteration wurde ermöglicht wegen der grossen Verfügbarkeit
sowohl des Betreuers (Auftraggebers) wie des Experten. Das Vorgehen wurde dem
Umständen entsprechend angepasst, mit Tendenz zum agilen Vorgehen.
Seite 46 von 66
Vorgehensmodell Transaktionssimulator v1.0 / 2008-03-17
Aktivität
1
2
3
4
Diagramm 9: Vorgehensmodell
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Projektmanagement
Vorgehen festlegen
Feinplanung erstellen
Aufwand schätzen
Statusbericht erstellen
Software-Entwicklung
Fachl. Anf. GUI erheben
Fachl. Anf. SIM erheben
Fachl. Anf. CON erheben
Glossar erstellen
Grob-Architektur erstellen
Alle Fachl. + NFR konsolidieren
Module/Schnittstellen designen
GUI Design (2 Incr.)
GUI Implementation (2 Incr.)
SIM Design
SIM Implementation
CON Design
CON Implementation
Integration (2 incr.)
Konfigurationsmgt.
Benutzeranleitung erstellen
Gesamtdoku. erstellen
Qualitätssicherung
Unit Tests
Integrationstest
Systemabnahme
Ergebnis
Phase Seq. Vorgehensmodell
Kalender
Aufwandschätzung
Statusbericht
1
2
2
2
LoFi Prototyp/Storyboard
UML Activity/State, SQL, ERD
UML Class
Glossar
Kontext/Component Diagram
Pflichtenheft
UML Package/Class, Patterns
UML Class/Object/Sequence
Java Code
UML Class/Data, SQL
Java Code
UML Class, DTD/XML-Schema
Java Code
Jar File
1
1
1
1
1
2
3
4
5
6
7
8
9
10
Benutzeranleitung
Diplombericht
1
2
Fehlerliste
Fehlerliste
Mängelliste
1
2
3
Init.
Seite 47 von 66
GUI = Modul Graphical User Interface (für Vorführungen der Simulationsergebnisse)
SIM = Modul Simulator
CON = Modul Konfigurator
NFR = Nicht-funktionale Anforderungen
Incr. = Increment
Analyse
Design
Incr. 1
Incr. 2
Data
Realisierung
Incr. 1
Incr. 2
Integration
Incr. 1
Incr. 2
GUI
Data
GUI
GUI,SIM
GUI,SIM,CON
Einführung
Version 0.1 2007-03-08 / P. Klarenberg
ProjektW
KW
<11
Montag
Diagramm 10: Zeitplan
Seite 48 von 66
Verfügbarkeit Schmidhauser
Verfügbarkeit Max Kleiner
SOLL-Zeit (Std.)
SOLL-Zeit (Std.) kumulativ
Verfügbar Kla Mo-Fr
Verfügbar Kla Sa/So
Verfügbar Kla Tot. kumulativ
Saldo SOLL/Verfügbar Kla kum.
B Betreuer 1: Kick-off
B Betreuer 2: Follow-up
E Experte 1: Kick-off 1 17:30
E Experte 2: Kick-off 2 18:30
B Betreuer 3: Storyboard 13:00
E Experte 3: Entwurf PH 17:00
B Betreuer 4: Entwurf PH 15:30
B Betreuer: Abnahme PH
MS Abgabe Pflichtenheft
MS Upload Abstract
Bericht
E Experte 4: Design Interf./Patt. 17:00
K Kurs Präsentationstechnik
E Experte 5: Design GUI 17:00
14:30
B Betreuer: Feedback
E Experte 6: Design SIM/CON 17:00
B Betreuer: Abnahmetest 1
Betreuer: Testen Termin: abmachen!
17:00
E Experte 7: 95% Check
B Betreuer: Abnahmetest
E Experte: Abnahme
MS Upload Diplomarbeit
E = Experte
B = Betreuer
0
11
+1
12
+2
13
+3
14
Schulferien
15
16
+4
17
+5
18
+6
19
+7
20
+8
21
+9
22
+10
23
10.3.08 17.3.08 24.3.08 31.3.08 7.4.08 14.4.08 21.4.08 28.4.08 5.5.08 12.5.08 19.5.08 26.5.08 2.6.08
364.4
0.0
18.0
18.0
18.0
36.0
53.0 10.0
10.0
10.0
10.0
20.0
2.0
15.0
35.0
-1.0
18.0
54.0
18.0
18.0
71.0
17.0
18.0
72.0
0.0
72.0
71.0
-1.0
71.0
-1.0
0.0
72.0
18.0 18.0 18.0 18.0
90.0 108.0 126.0 144.0
0.0 0.0
0.0
71.0 71.0 71.0 71.0 71.0
-1.0 -19.0 -37.0 -55.0 -73.0
+11
24
+12
25
+13
26
+14
27
+19
36
+20
37
9.6.08 16.6.08 23.6.08 30.6.08 7.7.08 14.7.08 21.7.08 28.7.08 4.8.08 11.8.08 18.8.08 25.8.08 1.9.08
8.9.08
28
Schulferien
29
30
31
+15
32
+16
33
+17
34
+18
35
18.0 18.0 18.0 18.0 18.0 18.0 18.0 0.0 0.0 0.0 0.0 17.2 17.2 17.2 17.2 17.2 8.4
162.0 180.0 198.0 216.0 234.0 252.0 270.0 270.0 270.0 270.0 270.0 287.2 304.4 321.6 338.8 356.0 364.4
71.0 71.0 71.0 71.0 71.0 71.0 71.0 71.0 71.0 71.0 71.0 71.0 71.0 71.0 71.0 71.0 71.0
-91.0 -109.0 -127.0 -145.0 -163.0 -181.0 -199.0 -199.0 -199.0 -199.0 -199.0 -216.2 -233.4 -250.6 -267.8 -285.0 -293.4
22.2.
10.3.
17.3.
20.3.
7.4.
18.4.
18.4.
24.04
24.04
23.5.
19.5.
21.5.
6.6.
15.6. 20.6. 27.6.
4.7.
31.7.
17.8.
2.6.
9.7.
14.7.
8.8.
18.8. 25.8.
29.8.
1.9.
11.9.
6.3.2 Zeitplan
Planung Transaktionssimulator
6.4 Erfahrungen
6.4.1 Analyse Phase
1. IEEE 830 sehr nützlich
2. LoFi Prototyp für Graphisch Anwendung notwendig, und im Vergleich zu
Programmieren nicht aufwendig.
3. Frühzeitiges Suchen nach bestehenden Lösungen/Komponenten hilft ein Urteil
über das Machbare zu erhalten.
6.4.2 Design / Entwicklungsphase
1. Wiederverwendung bestehender Komponenten für ein einziges Projekt kostet u.U.
mehr Zeit, als man spart. Einlesen, Ausprobieren, Bugs und unerwünschte
Einschränkungen entdecken und korrigieren. Speziell Zeitraubend ist die
ungenügende Dokumentation für Problembehebung- und Analyse.
2. Die Standard Swing Layout Managers sind problematisch:
- ungenügende Funktionalität
- Verhalten in komplexen Kombinationen unvorhersehbar
- "early prototyping" nötig für Risiko-Management
- bottom-up technisches Design anhand LoFi User Interface Prototyp
Die Layout Managers war eine Leidensweg, bis zur Entdeckung des MiGLayout
Layout Managers im Internet.
3. Swing Application Framework [5]
- zu wenig Dokumentation um schwierige Probleme zu lösen
- unerwartetes Verhalten (nicht-funktionieren des Frameworks wie erwartet)
- unerwartete Nebenwirkungen (nicht funktionieren normaler JavaFunktionen)
Das Framework hat am Anfang sicher einige Zeit gespart. Später hat es aber ein
Vielfaches mehr Zeit gekostet. Das Framework wurde in der Folge wo möglich
umgangen. Beim besseren Verständnis des Swing EDT, würde ich das Framework,
was m.E. nicht ausgereift ist, vollständig durch eigene Patterns ersetzen.
4. Sehr positiv wenn der Experte wirklich einer ist und auch noch Zeit freimacht.
5. Mit einem agilen Ansatz, ein Iterationsplan sowie einer Agenda, kann man seine
Zeit sehr gut einteilen, und sogar noch jede Menge Überraschungen zu einem guten
Ende führen.
6.4.3 Realisierungsphase
1. Wenn Programmierung nicht die tägliche Arbeit ist, gibt es verschiedene
Tätigkeiten die unerwartet viel Zeit kosten:
- UML Tool kennen lernen
- EDI (Eclipse) kennen lernen
- Deployment Optionen kennen lernen
- Alles im API nachschlagen müssen
Seite 49 von 66
2. Man unbedingt die Anforderungen bereits in einer Form produzieren, welche die
spätere Gegenüberstellung des Designs und der Implementierung vereinfacht. Dank
des Kurses Requirements Engineering was dies glücklich der Fall.
3. Ürsprünglich war die Integration des GUI mit einer alten Version des Simulators
vorgesehen. Die Unterschiede zwischen alten und neuen Simulators stellten sich
jedoch als so gross heraus, dass es schade um den Aufwand gewesen wäre, die
nötigen Anpassungen zu machen. Es wurde dafür einen inkrementellen Ansatz
gewählt, welche in 5.2 "Integrationstests" dargelegt ist.
6.4.4 Grösste Probleme
Die grösste Probleme welche während des Projekts aufgetreten sind:
1. Unterschätzung des Spezifikationbedarfs aufgrund nicht vorhergesehene
Zusammenhänge zwischen den Anforderungen bzw. Konsequenzen im
Zusammenspiel von Anforderungen, z.B.
2. Explodierende Permutationen von an und für sich erwünschten Variationen erhöht
die Komplexität exponentiell.
3. Nicht zu Ende gedachte Anforderungen (fachliche Unvollständigkeit), die erst bei
Detail-Design auffällt. (-> durch agiles vorgehen aber frühzeitig entdeckt.)
4. Denkfehler, oft durch zu einfache Vorstellung eines Problems (aufgrund
ungenügende Erfahrung des Entwicklers mit der Domäne oder der Realisierung)
führen zu Fehlern bei der Implementation, die nur mit sehr viel Aufwand zu finden
sind.
5. Unterschätzte Konsequenzen für "Erweiterungen" gegenüber bestehendem
Programm
6. Schwierigkeit des Debuggen bzw. des Definieren von Tests bei einer MultiThreaded Applikation.
7. Überschätzen der Wiederverwendbarkeit alten Codes bzw. Unterschätzen des
Änderungsbedarfs und des Aufwands für Erweiterungen.
8. Testfehler werden zuerst lange in Implementationsfehlern vermutet und gesucht,
und erst sehr viel später in der Form von Spezifikations-Fehlern gefunden.
9. Abgrenzung Fachlich / IT schwierig, wenn das Fachliche selbst schon sehr
informatiklastig ist. Grund für Unterschätzung der eigenen Aufwände sowohl auf
fachlicher wie auf IT Seite.
10. Java Swing ist m.E. unvorstellbar unorthogonal und zwang zu eine lange Phase
von Versuch-und-Irrtum. Für Swing-unerfahrene Entwickler ist ein inkrementelles
Vorgehen mit sehr vielen Iterationen unabdingbar.
11. GUI Programmierung scheint mir eine sehr spezielle Disziplin. Die angestrebte
hierarchische Gliederung sowie die objektorientierte Kapselung von Funktionalität im
GUI, wurden von der anarchistischen Art der GUI-Interaktivität völlig in Frage gestellt.
Kurzfristig die optimalen Patterns zu finden und zu verstehen ist viel zu aufwändig im
Rahmen dieses Auftrags. Die Handbücher [9], [10] und [11] bieten z.B. kein Einziges
Beispiel, wie ein Fomular erstellt, mit Daten abgefüllt und die Daten wieder
weitergegeben werden können.
12. Das Swing Application Framework ist nicht ausgereift und schlecht dokumentiert.
Es ist nicht einsichtlich woher Behauptungen kommen, es würde Teil des nächsten
Java Releases sein.
Seite 50 von 66
6.4.5 Grösste Aufsteller
1. Das Paket JFreeChart [7] ist sehr brauchbar, sehr gut dokumentiert, und auch für
die kommerzielle Verwendung gratis. Die Komponente hat die Erwartungen erfüllt
und sehr viel Zeit eingespart.
2. Der LayoutManager MiGLayout [8] tut das, was die vielen Java LayoutManager
[9], [10], [11] nicht schaffen: Eine einfache Schnittstelle für praktisch alle LayoutWünsche bereit zu stellen. Leider stand MiGLayout erst spät im Projekt zur
Verfügung. Bei einer Grossüberarbeitung empfehlt es sich, das durch die
Verwendung der Java LayoutManager unnötig komplex gewordene GUI mit Hilfe von
MiGLayout zu sanieren.
3. Es ist seht interessant ein Projekt von A bis Z durchzuführen. Es werden viele
neue Kenntnisse aus dem Studium verwendet. Die Erfahrung gibt eine breite
Erfahrungsbasis für den Beruf.
6.5 Aufwandschätzung
Am Anfang des Projekts wurde eine Aufwandschätzung erstellt, welches das düstere
Bild ergab, dass das Projekt nur 600 LOC produzieren würde. Am Schluss gab es
7'000 LOC für 86 Klassen in 7 Packages.
Aufwandschätzung Transaktionssimulator
Pos
1
2
3
4
5
6
7
8
9
10
11
12
Version 0.1 2007-03-08 / P. Klarenberg
Total Projekt
Budget
360.00 100%
Total - eingeplant
451.80 126%
Total - unverplant
-91.80
Aktivität
Total / Pos
Aufwand Anzahl Details
Meeting Experte
12.00
3%
4.00
3
1 Std. Präsenz + 1 Std. Reise + 2 Std. Vor/Nachbereitung
Meeting Begleiter
45.00
13%
4.50
10
1.5 Std. Präsenz + 1 Std. Reise + 2 Std. Vorbereitung
Statusbericht
5.00
1%
0.50
10
Unter 30 Min. geht nichts
Präsentationskurs
8.40
2%
8.40
1
Präsentation
8.40
2%
8.40
1
Pflichtenheft
45.00
13%
45.00
1
Use Cases, Storyboard, NFR (IEEE 830 Doku)
Design
40.00
11%
40.00
1
Architektur, Schnittstellen, Patterns, UML ...
Implementation
40.00
11%
40.00
1
Reines codieren (15 LOC/Std.) => 600 LOC
Tests
40.00
11%
40.00
1
Testcases, Testcode, testen
Overhead
80.00
22%
80.00
1
Swing, JDBC, DB-Prod/SQL-Dial, Tools (JUnit, ...
Diplombericht
20.00
6%
20.00
1
Copy/Paste bestehender Doku?
Unvorhergesehenes
108.00
30%
108.00
1
30% des Budgets
Der "Trick" ist offensichtlich gewesen, bei jede Aktivität darauf zu achten, dass
daraus mehr laufender Code entsteht. Aus Design, Test und Overhead, wofür 4 mal
mehr Zeit als für die Implementation vorgesehen war, trugen mittels inkrementelles
Vorgehen an die Code-Produktion bei. Samt dem Posten Unvorhergesehenes
standen somit statt der ursprünglichen 40 deren 308 Stunden als produktive Zeit zur
Verfügung was rechnerisch in etwa 4'600 ergeben müsste. Wenn wir davon
ausgehen, dass der produzierte Code nicht Produktionsqualität hat, würde dies mit
den aktuellen 7'000 (inkl. Kommentare) ziemlich gut übereinstimmen.
6.6 Ausblick
Der Transaktionssimulator wird künftig im Unterricht für das Fach Datenbanken
ausprobiert. Hieraus werden neue Anforderungen sowie Feedbacks über Bugs
gewonnen werden.
Seite 51 von 66
Anhang A. UML Diagramme
Alle public Attribute sind als Properties zu betrachten, welche mit entsprechenden
Getters und Setters implementiert werden. Ebenfalls mit Getters/Setters werden die
Assoziationen implementiert.
Anhang A1. Package net.clearmountain.transim
class transim
ApplicationGlobals
+
getInstance() : ApplicationGlobals
«interface»
DataTierFactory
TranSim
+
1
Stac kedP anel
name: String
+dataT ierFactory
1
1
stackedPanel
2
Simulatio nContext
«interface»
Simulator
1
1
simulationContext
«interface»
+simulationStatistics SimulationStatistics
+
+
+
concurrentThreads: int
simulationT ime: double
windowLength: double
+
propertyChange(PropertyChangeEvent) : void
1
1
1
1
+currentShow
1
ArrayList<SimulationModel>
Task
Show
StatisticsTra nsferProcess
+
+
#
#
1
+simulationModel
start() : void
stop() : void
doInBackgrou nd() : void
process(display Values) : void
+simulationModel
0..*
1
ArrayList<UserModel>
Simul ation Model
1
Seite 52 von 66
Anhang A2. Package net.clearmountain.transim.gui
class gui
«interface»
SimulationVisualizer
MyMenubar
1
1
DefaultSimulationVisualizer
1
+simulationPanel
1
+leftStackedPanel
Simul ationPanel
Stac kedP anel
ControlP anel
1
1
+rightStackedPanel
1
1
1
1
Param eterP anel
+resultsPerUserModelPanel
StackedBox
1
1
BarChartP anel
1
+resultsPerTransactionModelPanel
1
1
1
1
1
TotalResultsPanel
Das UML-Diagram zeigt nur die wichtigsten Klassen. Damit die verschiedenen
Layoutmanager das gewünscht Layout erzeugen, müssen viele Panels oder andere
Container-Objekte "zwischengeschaltet" werden. Die effektive Objektstruktur ist zu
komplex und umfangreich für ein A-4-formatiges UML-Diagramm. Die nachfolgende
Liste zeigt eine programmatisch generierte Objektstruktur, welche mit Version 1.0
des Transaktionssimulators übereinstimmt. Es wird auf jeder Zeile den Klassenname,
den Objektname ("null" wenn keinen vorhanden) plus mittels Minuszeichen den Level
im Objektbaum angezeigt.
javax.swing.JFrame "mainFrame"
-javax.swing.JRootPane "null"
--javax.swing.JPanel "null.glassPane"
--javax.swing.JLayeredPane "null.layeredPane"
---javax.swing.JPanel "null.contentPane"
----javax.swing.JPanel "mainPanel"
-----javax.swing.JScrollPane "scrollPane"
------javax.swing.JViewport "null"
-------net.clearmountain.transim.gui.SimulationPanel "simulationPanel"
--------net.clearmountain.transim.gui.StackedPanel "leftBox"
---------net.clearmountain.transim.gui.ControlPanel "controlPanel"
----------javax.swing.Box "controlPanel2"
Seite 53 von 66
-----------javax.swing.JComboBox "combo"
------------javax.swing.plaf.basic.BasicArrowButton "ComboBox.arrowButton"
------------javax.swing.CellRendererPane "null"
-----------javax.swing.JToolBar "controls"
------------javax.swing.JButton "playButton"
------------javax.swing.JButton "pauseButton"
------------javax.swing.JButton "stopButton"
------------javax.swing.JButton "clearButton"
-----------javax.swing.Box$Filler "null"
----------javax.swing.Box "null"
-----------javax.swing.JPanel "null"
------------javax.swing.JTextArea "null"
----------net.clearmountain.transim.gui.LegendPanel "null"
-----------javax.swing.Box "null"
------------javax.swing.JLabel "transactionsLabel"
------------javax.swing.JLabel "deadlocksLabel"
------------javax.swing.JLabel "lostUpdatesLabel"
------------javax.swing.JLabel "phantomsLabel"
------------javax.swing.JLabel "transactionTimeLabel"
------------javax.swing.JLabel "deadlockTimeLabel"
---------net.clearmountain.transim.gui.StackedBox "stackedBox"
----------org.jdesktop.swingx.JXHyperlink "null"
----------org.jdesktop.swingx.JXCollapsiblePane "null"
-----------org.jdesktop.swingx.JXCollapsiblePane$WrapperContainer "null"
------------javax.swing.JPanel "null"
-------------net.clearmountain.transim.gui.TotalResultsPanel "null"
--------------org.jfree.chart.ChartPanel "null"
--------------org.jfree.chart.ChartPanel "null"
--------------javax.swing.Box$Filler "null"
----------org.jdesktop.swingx.JXHyperlink "null"
----------org.jdesktop.swingx.JXCollapsiblePane "null"
-----------org.jdesktop.swingx.JXCollapsiblePane$WrapperContainer "null"
------------javax.swing.JPanel "null"
-------------net.clearmountain.transim.gui.ResultsPerUserModelPanel "null"
--------------org.jfree.chart.ChartPanel "null"
----------org.jdesktop.swingx.JXHyperlink "null"
----------org.jdesktop.swingx.JXCollapsiblePane "null"
-----------org.jdesktop.swingx.JXCollapsiblePane$WrapperContainer "null"
------------javax.swing.JPanel "null"
-------------net.clearmountain.transim.gui.ResultsPerTransactionModelPanel "null"
--------------org.jfree.chart.ChartPanel "null"
----------org.jdesktop.swingx.JXHyperlink "null"
----------org.jdesktop.swingx.JXCollapsiblePane "null"
-----------org.jdesktop.swingx.JXCollapsiblePane$WrapperContainer "null"
------------javax.swing.JPanel "null"
-------------net.clearmountain.transim.gui.ParameterPanel "null"
--------------javax.swing.table.JTableHeader "null"
---------------javax.swing.CellRendererPane "null"
--------------net.clearmountain.transim.gui.ParameterPanel$1 "null"
---------------javax.swing.CellRendererPane "null"
--------------javax.swing.JPanel "null"
---------------javax.swing.Box "null"
----------------javax.swing.Box$Filler "null"
----------------javax.swing.JButton "null"
----------------javax.swing.Box$Filler "null"
--------javax.swing.Box "null"
--------net.clearmountain.transim.gui.StackedPanel "rightBox"
---------net.clearmountain.transim.gui.ControlPanel "controlPanel"
----------javax.swing.Box "controlPanel2"
-----------javax.swing.JComboBox "combo"
------------javax.swing.plaf.basic.BasicArrowButton "ComboBox.arrowButton"
------------javax.swing.CellRendererPane "null"
-----------javax.swing.JToolBar "controls"
------------javax.swing.JButton "playButton"
------------javax.swing.JButton "pauseButton"
------------javax.swing.JButton "stopButton"
------------javax.swing.JButton "clearButton"
-----------javax.swing.Box$Filler "null"
----------javax.swing.Box "null"
-----------javax.swing.JPanel "null"
------------javax.swing.JTextArea "null"
----------net.clearmountain.transim.gui.LegendPanel "null"
-----------javax.swing.Box "null"
------------javax.swing.JLabel "transactionsLabel"
------------javax.swing.JLabel "deadlocksLabel"
Seite 54 von 66
------------javax.swing.JLabel "lostUpdatesLabel"
------------javax.swing.JLabel "phantomsLabel"
------------javax.swing.JLabel "transactionTimeLabel"
------------javax.swing.JLabel "deadlockTimeLabel"
---------net.clearmountain.transim.gui.StackedBox "stackedBox"
----------org.jdesktop.swingx.JXHyperlink "null"
----------org.jdesktop.swingx.JXCollapsiblePane "null"
-----------org.jdesktop.swingx.JXCollapsiblePane$WrapperContainer "null"
------------javax.swing.JPanel "null"
-------------net.clearmountain.transim.gui.TotalResultsPanel "null"
--------------org.jfree.chart.ChartPanel "null"
--------------org.jfree.chart.ChartPanel "null"
--------------javax.swing.Box$Filler "null"
----------org.jdesktop.swingx.JXHyperlink "null"
----------org.jdesktop.swingx.JXCollapsiblePane "null"
-----------org.jdesktop.swingx.JXCollapsiblePane$WrapperContainer "null"
------------javax.swing.JPanel "null"
-------------net.clearmountain.transim.gui.ResultsPerUserModelPanel "null"
--------------org.jfree.chart.ChartPanel "null"
----------org.jdesktop.swingx.JXHyperlink "null"
----------org.jdesktop.swingx.JXCollapsiblePane "null"
-----------org.jdesktop.swingx.JXCollapsiblePane$WrapperContainer "null"
------------javax.swing.JPanel "null"
-------------net.clearmountain.transim.gui.ResultsPerTransactionModelPanel "null"
--------------org.jfree.chart.ChartPanel "null"
----------org.jdesktop.swingx.JXHyperlink "null"
----------org.jdesktop.swingx.JXCollapsiblePane "null"
-----------org.jdesktop.swingx.JXCollapsiblePane$WrapperContainer "null"
------------javax.swing.JPanel "null"
-------------net.clearmountain.transim.gui.ParameterPanel "null"
--------------javax.swing.table.JTableHeader "null"
---------------javax.swing.CellRendererPane "null"
--------------net.clearmountain.transim.gui.ParameterPanel$1 "null"
---------------javax.swing.CellRendererPane "null"
--------------javax.swing.JPanel "null"
---------------javax.swing.Box "null"
----------------javax.swing.Box$Filler "null"
----------------javax.swing.JButton "null"
----------------javax.swing.Box$Filler "null"
------javax.swing.JScrollPane$ScrollBar "null"
-------com.sun.java.swing.plaf.windows.WindowsScrollBarUI$WindowsArrowButton "null"
-------com.sun.java.swing.plaf.windows.WindowsScrollBarUI$WindowsArrowButton "null"
------javax.swing.JScrollPane$ScrollBar "null"
-------com.sun.java.swing.plaf.windows.WindowsScrollBarUI$WindowsArrowButton "null"
-------com.sun.java.swing.plaf.windows.WindowsScrollBarUI$WindowsArrowButton "null"
-----javax.swing.JLabel "statusBar"
---net.clearmountain.transim.gui.MyMenuBar "myMenuBar"
----javax.swing.JMenu "fileMenu"
----javax.swing.JMenu "settingsMenu"
----javax.swing.JMenu "helpMenu"
Seite 55 von 66
Anhang A3. Package net.clearmountain.transim.simulator
class simulator
transim::
Simulatio nContext
1
simulationContext
1
+
«interface»
Simulator
concurrentThreads: int
+
+
+
+
+
start() : void
stop() : void
pause() : void
resume() : void
reset() : void
+simulationModel
1
ArrayList<UserModel>
+simulationModel
mode l::
Simul ationModel
1
1
DefaultS imulator
+
concurrentThreads: int
+
+
+
+
+
start() : void
stop() : void
pause() : void
resume() : void
reset() : void
+simulation
1
0..*
«interface»
database::DataTier +dataTier
1
0..*
ArrayList<TransactionModel>
Simulati onThread
+userModel
+
+
run() : void
stop() : void
0..*
model::User Model
1
Seite 56 von 66
Anhang A4. Package net.clearmountain.transim.model
class model
Show Par ameters
+
+
+
+
ArrayList<SimulationModel>
+
+
Show
+
name: String
+showParameters +
+
deepClone() : Show
1 +
getSimulationModelByName(String) : SimulationModel
+
+
+
0..*
+
1
+showTemplates
+
0..*
resultsTotalInNumberPerSecond: int
resultsTotalInMilliseconds: int
resultsPerUserModelInNumberPerSecond: int
resultsPerTransactionModelInNumberPerSecond: int
numberOfUserModelGraphPositions: int
numberOfTransactionModelGraphPositions: int
concurrentThreadsInNumber: int
refreshRateInNumberPerSecond: int
simulationT imeInSeconds: double
windowLengthInSeconds: double
numberOfRecords: int
defaultAccountP rofile: String
clone() : ShowParameters
ArrayList<UserModel>
Simul ationModel
+
+
-
id: S tring
name: String
quantities: Integer (HashMap)
+
+
+
+
+
+
+
+
+
+
setQuantity(String, int) : void
getQuantity(String) : int
getTransactionModelquantity(String) : int
getTransactionModel(String) : TransactionModel
deepClone() : S imulationModel
getNumberOfUserModels() : int
getNumberOfTransact ionModels() : void
getUserModelNam es() : String[]
getTransactionModel Names() : String[]
setTransactionModelParameters(String, int, int, int, int, int, int, int) : void
1
0..*
0..*
simulationModelTemplates
ArrayList<TransactionModel>
Use rModel
+
+
+
-
id: int
name: String
interTransactionDelay: int
quantities: Integer (HashMap)
+
+
+
setQuantity(String, int) : void
getQuantity(String) : int
deepClone() : UserModel
0..*
ModelFactory
+
+
+
+
+
+
+
+
+
+
+
loadModel(File) : void
getShowByNumber(int) : Show
getShowByName(String) : Show
getNumberOfShows() : int
getShowNames() : String[]
getSimulationModelNam es(String) : String[]
getTransactionModel Names() : String[]
getTransactionModelByName(String) : TransactionModel
createShow(String) : Show
addModelChangeListener(Mo delChangeListener) : void
removeModelChangeListener(M odelChangeListener) : void
+userModelTemplates
parameterSetTemplates
1
0..*
ArrayList<Operation>
TransactionModel
+
+
+
+
+
+
+
+
+
name: String
isolationLevel: int
pattern: String[]
readPercentage: int
updatePercentage: int
insertAmount: int
deletePercentage: int
operationDelay: int
commitDelay: int
+
deepClone() : T ransactionModel
0..*
Parame terSet
+transactionModelTemplates
0..*
+
+
+
+
+
+
+
+
id: int
pattern: String
readPercent: int
updatePercent: int
insertAmount: int
deletePercent: int
operationDelay: int
commitDelay: int
1
0..*
«enumeration»
Opera tion
«enum»
RE AD
UPDATE
INS ERT
DEL ET E
BEGIN_TRA NSACT ION
COMMIT_TRANSACTION
Alle public Attribute sind als Properties zu betrachten, welche
mit entspechenden Getters und Setters implementiert werden.
Ebenfalls mit Getters/Setters werden die Assoziationen
implementiert.
Seite 57 von 66
Anhang A5. Package net.clearmountain.transim.database
class database
transim::
SimulationContext
1
1
«interface»
DataTierFactory
+ accountProfile Name: String
+ numberOfRecords: int
+/ numberOfLostUpdates: int
+
+
+
+
+
«interface»
DataTier
getAccountsProfileNames()() : String[]
setSelectedAccountProfileName(String) : void
initDatabase() : void
resetDatabase() : void
connectionTestOK() : boolean
«use»
+
+
+
+
+
+
+
+
JDBCDataTierFactory
JDBCDa taTier
+ accountProfile Name: String
+ numberOfRecords: int
+/ numberOfLostUpdates: int
+
+
+
+
+
read(int) : void
update(int) : void
insert(int) : void
delete(int) : void
beginTransaction(int) : void
commitTransaction(int) : void
getTransactionStatistics() : TransactionStatistics
close() : void
getAccountsProfileNames()() : String[]
setSelectedAccountProfileName(String) : void
initDatabase() : void
resetDataba se() : void
connectionTest OK() : boolean
«use»
+
+
+
+
+
+
+
+
read(int ) : void
update(in t) : void
insert(in t) : void
delete(in t) : void
beginTransacti on(int) : void
commitTransacti on(int) : void
getTransactionStatistics() : TransactionStatistics
close() : void
«interface»
beans::PropertyChangeListener
«use»
«use»
AccountProfile
Database Profile
«use»
«use»
AccountProfileParser
DatabaseProfileParser
Seite 58 von 66
Anhang A6. Package net.clearmountain.transim.statistics
pkg statistics
transim::
SimulationContext
ArrayList<UserModel>
+simulationModel
mode l::
Simul ationModel
1
+simulationModel
1
1
«interface»
SimulationStatistics
+
+
+
+
+
+
+
reset() : void
start() : void
stop() : void
pause() : void
resume() : void
processTransactionStatistics() : void
getSnapshot() : DisplayValues
+simulationStatistics
1
SlidingAv erageSim ulationStatistics
+
+
+
+
+
+
+
TransactionStatistics
reset() : void
start() : void
stop() : void
pause() : void
resume() : void
processTransactionStatistics(TransactionStatistics) : void
getSnapshot() : DisplayValues
«use»
+
+
+
+
+
+
numberOfDeadlocks: int
numberOfLostUpdates: int
numberOfPhantoms: int
durationOfDeadlocks: int
durationOfTransactions: int
timeOut: Boolean
«use»
DisplayValues
ModelSta tistics
+TransactionModelStatistics
0..* +
+
+
0..* +
+
+totalModelStatistics +
+
1
+userModelStatistics
+
name: String
numberOfTransactions: int
durationOfTransactions: int
numberOfDeadlocks: int
durationOfDeadlocks: int
numberOfLostUpdates: int
numberOfPhantoms: int
copy() : ModelStatistics
Seite 59 von 66
Anhang B XML-Schemas
Anhang B1. Schema model.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="transactionSimulator" type="transactionSimulatorType">
<xs:key name="simulationModelId">
<xs:selector
xpath="simulationModels/simulationModel |
simulationModels/simpleSimulationModel"/>
<xs:field xpath="@id"/>
</xs:key>
<xs:keyref refer="simulationModelId" name="simulationModelRef">
<xs:selector xpath="shows/show/simulationModelRef"/>
<xs:field xpath="@ref"/>
</xs:keyref>
<xs:key name="userModelId">
<xs:selector xpath="userModels/userModel"/>
<xs:field xpath="@id"/>
</xs:key>
<xs:keyref refer="userModelId" name="userModelIdRef">
<xs:selector
xpath="simulationModels/simulationModel/userModelRef"/>
<xs:field xpath="@ref"/>
</xs:keyref>
<xs:key name="transactionModelId">
<xs:selector xpath="transactionModels/transactionModel"/>
<xs:field xpath="@id"/>
</xs:key>
<xs:keyref refer="transactionModelId" name="transactionModelRef">
<xs:selector
xpath="simulationModels/simpleSimulationModel/transactionModelRef |
userModels/userModel/transactionModelRef"/>
<xs:field xpath="@ref"/>
</xs:keyref>
<xs:key name="parameterSetId">
<xs:selector xpath="parameterSets/parameterSet"/>
<xs:field xpath="@id"/>
</xs:key>
<xs:keyref refer="parameterSetId" name="parameterSetRef">
<xs:selector
xpath="transactionModels/transactionModel/parameterSetRef"/>
<xs:field xpath="@ref"/>
</xs:keyref>
</xs:element>
<xs:complexType name="transactionSimulatorType">
<xs:sequence>
<xs:element name="parameterSets" type="parameterSetsType"
minOccurs="0" maxOccurs="1"/>
<xs:element name="transactionModels"
type="transactionModelsType" minOccurs="1"
maxOccurs="1"/>
<xs:element name="userModels" type="userModelsType"
minOccurs="0" maxOccurs="1"/>
<xs:element name="simulationModels" type="simulationModelsType"
minOccurs="1"
maxOccurs="1"/>
<xs:element name="shows" type="showsType" minOccurs="1"
maxOccurs="1"/>
</xs:sequence>
</xs:complexType>
Seite 60 von 66
<xs:complexType name="showsType">
<xs:sequence>
<xs:element name="show" type="showType" minOccurs="0"
maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="simulationModelsType">
<xs:sequence>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="simulationModel"
type="simulationModelType"/>
<xs:element name="simpleSimulationModel"
type="simpleSimulationModelType"/>
</xs:choice>
</xs:sequence>
</xs:complexType>
<xs:complexType name="userModelsType">
<xs:sequence>
<xs:element name="userModel" type="userModelType" minOccurs="0"
maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="transactionModelsType">
<xs:sequence>
<xs:element name="transactionModel" type="transactionModelType"
minOccurs="0"
maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="parameterSetsType">
<xs:sequence>
<xs:element name="parameterSet" type="parameterSetType"
minOccurs="0"
maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="showType">
<xs:sequence>
<xs:element name="name" type="nameType" minOccurs="1"
maxOccurs="1"/>
<xs:element name="simulationModelRef" type="refType"
minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="showParameters" type="showParametersType"
minOccurs="0"
maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="simulationModelType">
<xs:sequence>
<xs:element name="name" type="nameType" minOccurs="1"
maxOccurs="1"/>
<xs:element name="userModelRef" type="qtyRefType" minOccurs="0"
maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="id" type="idType" use="required"/>
</xs:complexType>
<xs:complexType name="simpleSimulationModelType">
<xs:sequence>
<xs:element name="name" type="nameType" minOccurs="1"
maxOccurs="1"/>
Seite 61 von 66
<xs:element name="transactionModelRef" type="qtyRefType"
minOccurs="0"
maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="id" type="idType" use="required"/>
</xs:complexType>
<xs:complexType name="userModelType">
<xs:sequence>
<xs:element name="name" type="nameType" minOccurs="1"
maxOccurs="1"/>
<xs:element name="interTransactionDelay"
type="xs:nonNegativeInteger" minOccurs="1"
maxOccurs="1"/>
<xs:element name="transactionModelRef" type="qtyRefType"
minOccurs="0"
maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="id" type="idType" use="required"/>
</xs:complexType>
<xs:complexType name="transactionModelType">
<xs:sequence>
<xs:element name="name" type="nameType" minOccurs="1"
maxOccurs="1"/>
<xs:element name="isolationLevel" type="isolationLevelType"
minOccurs="1" maxOccurs="1"/>
<xs:choice>
<xs:element name="parameterSetRef" type="refType"
minOccurs="1" maxOccurs="1"/>
<xs:sequence>
<xs:element name="pattern" type="patternType"
minOccurs="1" maxOccurs="1"/>
<xs:element name="readPercent" type="percentType"
minOccurs="0" maxOccurs="1"/>
<xs:element name="updatePercent" type="percentType"
minOccurs="0" maxOccurs="1"/>
<xs:element name="insertAmount"
type="xs:nonNegativeInteger" minOccurs="0"
maxOccurs="1"/>
<xs:element name="deletePercent" type="percentType"
minOccurs="0" maxOccurs="1"/>
<xs:element name="operationDelay"
type="xs:nonNegativeInteger" minOccurs="1"
maxOccurs="1"/>
<xs:element name="commitDelay" type="xs:integer"
minOccurs="1" maxOccurs="1"/>
</xs:sequence>
</xs:choice>
</xs:sequence>
<xs:attribute name="id" type="idType" use="required"/>
</xs:complexType>
<xs:complexType name="parameterSetType">
<xs:sequence>
<xs:element name="pattern" type="patternType" minOccurs="1"
maxOccurs="1"/>
<xs:element name="readPercent" type="percentType" minOccurs="0"
maxOccurs="1"/>
<xs:element name="updatePercent" type="percentType"
minOccurs="0" maxOccurs="1"/>
<xs:element name="insertAmount" type="xs:nonNegativeInteger"
minOccurs="0" maxOccurs="1"/>
<xs:element name="deletePercent" type="percentType"
minOccurs="0" maxOccurs="1"/>
<xs:element name="operationDelay" type="xs:nonNegativeInteger"
minOccurs="1"
maxOccurs="1"/>
Seite 62 von 66
<xs:element name="commitDelay" type="xs:integer" minOccurs="1"
maxOccurs="1"/>
</xs:sequence>
<xs:attribute name="id" type="idType" use="required"/>
</xs:complexType>
<xs:complexType name="showParametersType">
<xs:sequence>
<xs:element name="scalesParameters" type="scalesParametersType"
minOccurs="0"
maxOccurs="1"/>
<xs:element name="simulatorParameters"
type="simulatorParametersType" minOccurs="0"
maxOccurs="1"/>
<xs:element name="databaseParameters"
type="databaseParametersType" minOccurs="0"
maxOccurs="1"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="simulationModelParametersType">
<xs:sequence>
<xs:element name="simulatorParameters"
type="simulatorParametersType" minOccurs="0"
maxOccurs="1"/>
<xs:element name="databaseParameters"
type="databaseParametersType" minOccurs="0"
maxOccurs="1"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="scalesParametersType">
<xs:sequence>
<xs:element name="resultsTotalInNumberPerSecond"
type="xs:positiveInteger" minOccurs="0"
maxOccurs="1"/>
<xs:element name="resultsTotalInMilliseconds"
type="xs:positiveInteger" minOccurs="0"
maxOccurs="1"/>
<xs:element name="resultsPerUserModelInNumberPerSecond"
type="xs:positiveInteger"
minOccurs="0" maxOccurs="1"/>
<xs:element name="resultsPerTransactionModelInNumberPerSecond"
type="xs:positiveInteger"
minOccurs="0" maxOccurs="1"/>
<xs:element name="numberOfUserModelGraphPositions"
type="xs:positiveInteger"
minOccurs="0" maxOccurs="1"/>
<xs:element name="numberOfTransactionModelGraphPositions"
type="xs:positiveInteger"
minOccurs="0" maxOccurs="1"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="simulatorParametersType">
<xs:sequence>
<xs:element name="concurrentThreadsInNumber"
type="concurrentThreadsType" minOccurs="0"
maxOccurs="1"/>
<xs:element name="refreshRateInNumberPerSecond"
type="xs:nonNegativeInteger"
minOccurs="0" maxOccurs="1"/>
<xs:element name="simulationTimeInSeconds"
type="xs:nonNegativeInteger" minOccurs="0"
maxOccurs="1"/>
<xs:element name="windowLengthInSeconds"
type="xs:nonNegativeInteger" minOccurs="0"
maxOccurs="1"/>
Seite 63 von 66
</xs:sequence>
</xs:complexType>
<xs:complexType name="databaseParametersType">
<xs:sequence>
<xs:element name="numberOfRecords" type="xs:nonNegativeInteger"
minOccurs="0"
maxOccurs="1"/>
<xs:element name="defaultAccountProfile" type="xs:string"
minOccurs="0" maxOccurs="1"/>
</xs:sequence>
</xs:complexType>
<xs:simpleType name="nameType">
<xs:restriction base="xs:string">
<!--<xs:pattern value="[A-Za-z_]+[A-Za-z_0-9 \-]*"/>-->
<xs:pattern value="[A-Za-z_0-9 \-\.]+"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="idType">
<xs:restriction base="xs:string">
<xs:pattern value="[A-Za-z_]+[A-Za-z_0-9 \-]*"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="refType">
<xs:attribute name="ref" type="idType"/>
</xs:complexType>
<xs:complexType name="qtyRefType">
<xs:attribute name="ref" type="idType" use="required"/>
<xs:attribute name="qty" type="xs:nonNegativeInteger"/>
</xs:complexType>
<xs:simpleType name="isolationLevelType">
<xs:restriction base="xs:byte">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="3"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="patternType">
<xs:restriction base="xs:string">
<xs:pattern value="(R|RU|RD|I)+"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="percentType">
<xs:restriction base="xs:byte">
<xs:minExclusive value="0"/>
<xs:maxInclusive value="100"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="concurrentThreadsType">
<xs:restriction base="xs:positiveInteger">
<xs:minInclusive value="1"/>
<xs:maxInclusive value="100"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
Seite 64 von 66
B2. Schema accounts.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="accounts" type="accountsType">
<xs:key name="accountName">
<xs:selector xpath="accounts/account"/>
<xs:field xpath="@name"/>
</xs:key>
</xs:element>
<xs:complexType name="accountsType">
<xs:sequence>
<xs:element name="account" type="accountType" minOccurs="0"
maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="accountType">
<xs:sequence>
<xs:element name="databaseRef" type="databaseRefType"
minOccurs="1" maxOccurs="1"/>
<xs:element name="userName" type="xs:string" minOccurs="1"
maxOccurs="1"/>
<xs:element name="password" type="xs:string" minOccurs="1"
maxOccurs="1"/>
<xs:element name="connectionURL" type="xs:string" minOccurs="1"
maxOccurs="1"/>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required"/>
<xs:attribute name="default" type="xs:string" use="optional"/>
</xs:complexType>
<xs:complexType name="databaseRefType">
<xs:attribute name="ref" type="xs:string" use="required"/>
</xs:complexType>
</xs:schema>
Seite 65 von 66
B3. Schema databases.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="databases" type="databasesType">
<xs:key name="databaseName">
<xs:selector xpath="databases/database"/>
<xs:field xpath="@name"/>
</xs:key>
</xs:element>
<xs:complexType name="databasesType">
<xs:sequence>
<xs:element name="database" type="databaseType" minOccurs="0"
maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="databaseType">
<xs:sequence>
<xs:element name="createTrxTable" type="xs:string" minOccurs="0"
maxOccurs="1"/>
<xs:element name="createTrxIndex" type="xs:string" minOccurs="0"
maxOccurs="1"/>
<xs:element name="perConnectionStatementOptions"
type="statementOptionType" minOccurs="0" maxOccurs="1"/>
<xs:element name="driverClass" type="xs:string" minOccurs="1"
maxOccurs="1"/>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required"/>
</xs:complexType>
<xs:complexType name="statementOptionType">
<xs:sequence>
<xs:element name="option" type="xs:string" minOccurs="0"
maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
Seite 66 von 66
Herunterladen