Auch in der Verwendung von WGA gibt es einige dieser Anti-Patterns die sich in der Regel negativ bzgl. der Performance des Systems bemerkbar machen.
Viele dieser Patterns betreffen die WebTML-Entwicklung, weswegen sie eigentlich in dieser administrativen Ressource fehl am Platz sind. Wir wollen sie hier dennoch kurz erwähnen da Performance-Probleme in der Regel in der Administration erkannt werden und ihre Behebung von hier aus angeregt wird.
- Verwendung von Abfragen anstelle von Navigatoren
In WebTML gibt es zwei Artefakte die Kollektionen von Dokumenten erstellen können: Navigatoren und Abfragen. Navigatoren sind in den allermeisten Fällen schneller als Abfragen, da sie auf interne Indizes zurückgreifen können, während Abfragen grundsätzlich das Datenbank-Backend mit einbeziehen müssen (Ausnahme: Der Query-Cache der jedoch häufig verworfen wird). Dies sollte bereits bei der Planung einer Website berücksichtigt werden. Die Hierarchie einer Website sollte nach Möglichkeit so strukturiert werden dass Navigationselemente auch tatsächlich über WebTML-Navigatoren realisiert werden können. - Zu große Ergebnismengen in Abfragen generell
Abfragen die eine große Menge an Dokumenten heranziehen (und die eventuell garnicht alle verarbeitet werden) sorgen für starken Netzverkehr zwischen Datenbank- und WGA-Server. Nach Möglichkeit sollte die Ergebnismenge bereits bei der Abfrage über das Attribut max reduziert werden - Sortierung von Abfrageergebnissen per WebTML
Die Sortierungsfunktionen des Tags <tml:foreach> wie sortexpression bieten zwar einigen Komfort, sind aber in jedem Fall performancetechnisch Sortierungsfunktionen in der Abfrage selbst unterlegen. Nach Möglichkeit sollte also direkt in der Abfrage eine Sortierung vorgenommen werden. - Dynamische Berechnung von TMLScript-Skripten
Das dynamische Berechnen von TMLScript-Code (z.B. über WebTML-Funktionalitäten) kann eine schlechte Idee sein, wenn der resultierende Code sehr variabel ist. So wurde in einem Einzelfall diese Technik benutzt, um eine Session-ID in den Code hereinzukopieren. Der daraus resultierende Code war jedesmal leicht anders, weil die Session-ID sich kontinuierlich änderte:
<tml:script>
var sessionID = "<tml:meta type="session" name="id"/>"
</tml:script>
Dies ist bzgl. des TMLScript Code-Caches sehr ineffektiv, da diese Skripte jedesmal neu kompiliert werden müssen weil sie sich von den gecachten Skripten grundsätzlich unterscheiden. Zusätzlich verdrängt dieser permanente Code-Durchlauf im Code-Cache auch andere Skripte.
In der Regel ist es möglich das, was man durch die dynamische Berechnung erreichen wollte, auch skript-intern zu erreichen. So konnte im Beispiel die Session-ID auch in TMLScript selbst herangezogen werden und musste nicht in den Code einkopiert werden:
<tml:script>
var sessionID = meta("session", "id");
</tml:script> - "Abfederung" von sehr ineffektiver Funktionalitäten durch WebTML-Caches
Zwar ist der WebTML-Cache dazu gedacht, Funktionalitäten die ansich zu langsam für eine online berechnete Webseite sind, zwischenzuspeichern. Der allzu exzessive Gebrauch dieser Strategie, gerade bei Elementen die sehr oft und mehrfach gleichzeitig abgerufen werden, kann jedoch fatal sein.
Benötigt eine Funktionalität 10 Sekunden um berechnet zu werden, und ist zu erwarten dass sie mehrfach parallel ausgeführt wird, so ist sie nicht für den WebTML-Cache geeignet. Dies führt grundsätzlich zu inakzeptablen Wartezeiten, insbesondere beim "Hochfahren" der Website, selbst dann wenn spätere Requests auf den Cache zugreifen können. Der Fokus sollte daher auf die Beschleunigung der Funktionalität gelegt werden. - Bevorzugung "ineffektiver" Abfragesprachen
WGA verfügt über ein großes Spektrum an Abfragesprachen, von denen viele jedoch nur für spezielle Plattformen anwendbar sind. Dennoch ist es hilfreich zu verstehen, welche dieser Sprachen grundsätzlich "schnell" sind und welche nicht. Daher hier eine Liste der Abfragesprachen, absteigend nach Performance sortiert als Faustregel: - "lucene" - Lucene Volltextsuche(Sehr schnell)
- "fulltext" - Domino Volltextsuche in indizierter Datenbank (Schnell)
- "view" - Domino Viewsuche (Schnell)
- "sql", "table" - SQL- und Tabellensuche (Schnell, je nach Komplexität der Abfrage, Geschwindigkeit des Backend-Systems und Ergebnismenge)
- "hql", "fullhql" - HQL (Schnell, je nach Komplexität der Abfrage, Geschwindigkeit des Backend-Systems und Ergebnismenge)
- "formula" - Domino Formelsuche (Langsam)
- "xpath" - X-Files-DB XPath-Suche (Langsam)
- Verwendung der TMLScript-Anweisung "importPackage()"
Diese Anweisung, die früher für den Einsatz in TMLScript empfohlen wurde, ist inzwischen dafür bekannt die TMLScript-Performance drastisch zu reduzieren. Sie sollte in jedem Fall vermieden werden.


Anti-Patterns