Saturday, January 5, 2013

Notes 9 Suche in Ansichten wurde vereinheitlicht und verbessert.

In Notes 8.x gab es neben der Volltextsuche noch zwei andere Suchen um Dokumente in Ansichten zu finden. Dies war in meinen Endbenutzerschulungen immer ein Thema warum es mehrere Suchen gab und wann man welche verwendet. Vor allem warum man vor der Schnellsuche immer nach der zu durchsuchenden Spalte sortieren muss, war für unsere Benutzer schwierig zu verstehen. In Notes 9 SE hat man nun die Suche mit "STRG+E" und die Schnellsuche die durch beliebigen Tastendruck aufgerufen wurde in eine Suche zusammengefasst.

Je nachdem ob man die neue Suche mit "STRG+F" oder einen beliebige Tastendruck aufgerufen hat wird das Suchfenster mit unterschiedlicher Vorauswahl angezeigt.

Mit "STRG+F" bekommt man die Suche im Modus, dass in allen Spalten gesucht wird.


Man kann aber jederzeit über die Drop Down box die Suche auf eine Spalte einschränken, was dann der Schnellsuche (Vorauswahl wenn man in der Ansicht eine Taste drückt) entspricht. Dabei wird die Ansicht automatisch nach der ausgewählten Spalte sortiert. Super ist, dass das Suchfeld je nach Spaltentyp Hilfen für die Eingabe anbietet. z.B. bei Personenfeldern wird Typeahead und bei Datumsspalten ein Datumsauswahl dropdown angeboten.

Was weniger gut ist, dass vom Wechsel von any column zu einer Spalte kein Hinweis angezeigt wird, dass bei der Spaltensuche immer vom Anfang der Spalte weg gesucht wird. Das heißt, bei der "Any Column" Version kann ich einen Teilbegriff der an belibiger Stelle vorkommt eingeben und bei der Spaltensuche muss der Suchbegriff mit dem Beginn der Spalte ident sein. Das hätte man leicht anders lösen können in dem man auch bei der Spaltensuche eine Option "nach Teilbegriffen suchen" anbieten würde.

2 Bugs hat die Suche in der Public Beta auch noch. Beim Typeahaed in der Personenspalte werden nur lokale Kontakte vorgeschlagen, obwohl in der Hilfe eindeutig dokumentiert ist, dass auch das Domino Directory durchsucht wird. Ausserdem haben die Hilfebuttons neben den Feldern keine Funktion. Update 6.1.2013: Die Fragezeichen sind wie ich aus dem Beta Forum erfahren habe gar keine Buttons, sondern nur ein Bereich an dem beim hovern ein Tooltip angezeigt wird. Dies ist aber erstens nicht konsistent mit dem Rest von Notes, da sich in den classic Notesbereichen teilweise das selbe Icon befindet, dass man aber klicken muss um den Tooltip anzuzeigen. Ausserdem erfolgt das Anzeigen des Tooltips sehr langsam, dass man schon genau wissen muss, dass hier ein Tooltip versteckt ist.



Prinzipiell muß ich anmerken, dass solche Dialog immer in der Grösse angepasst werden können sollten.

Fazit: Tolle Verbesserung gegenüber Notes 8.x die aber noch perfektioniert werden könnte.


Übersicht Beiträge zu Notes 9 Beta:
  
Notes 9 Volltextsuche kleine Änderung große Usability Verbesserung
Notes 9 Suche in Ansichten wurde vereinheitlicht und verbessert. 
Neues Feature Database Maintenance in Domino 9
Coole neue notes.ini Variable in Domino 9 für Copy style compact
Notes 9 SE erste Eindrücke aus Sicht des Plugin Entwicklers 
Erste Eindrücke vom Browserplugin und iNotes 
Notes 9 als Anwender; erster Blick Hui, zweiter Blick leider Pfui. 
Notes 9 Verbesserung beim e-mail typeahead 

Friday, January 4, 2013

Neues Feature Database Maintenance in Domino 9

In Domino 9 Social Edition gibt es ein neues Feature, dass die Datenbankwartung erleichtern soll. Bisher musste man dafür mehrere verschiedene Tasks (Updall, compact, fixup) über Programmdokumente aufrufen. Dies alles sollte nun durch den Datenbank Maintenance Task zusammgengefasst werden. Der Datenbank Maintenance Task bietet dabei den Vorteil, dass man die Maintenancetasks auf mehrere gleichzeitig laufende Threads aufsplitten kann. Das heißt, wenn man über entsprechend leistungsfähige Hardware verfüge, kann der DBMT Task mehrere Compact oder Updall gleichzeitig ausführen. Dies war bisher nur umständlich über .ind Dateien möglich.

Man kann den DBMT Task entweder beim Serverstart über ein Programmdokument aufrufen und ihm als Parameter mitgeben, dass er zu bestimmten Zeiten arbeiten soll, oder man ruft den DBMT Task über ein Programmdokument regelmäßig auf, wobei man dann eine Stopzeit mitgeben kann.

Ein Beispielprogrammdokument für den Aufruf beim Dominoserverstart:


Die Parameter bedeuten, dass 3 Compacts und Updalls gleichzeitig laufen dürfen. Die Datenbankmaintenance wird zwischen 2:00 und 7:00 morgens durchgeführt. Compact soll aber nur alle 3 Tage gemacht werden. Der "-force 1" Parameter bedeutet, dass Fixup am Sonntag (1. Tag der Woche) ausgeführt wird. Der DBMT bleibt in diesem Fall immer aktiv, arbeitet aber nur in den angegebenen Zeiten.

Beispiel für die regelmäßige einmalige Ausführung von DBMT mit einer Stoppzeit mittels eines Programmdokuments.


Hier wird der DBMT Task jeden Tag um 2:00 in der Früh durch das Programmdokument mit 3 Compact und 3 UpdateallThreads gestartet. Spätestens um 6:00  in der Früh wird der DBMT abgebrochen bis zum nächsten Start durch das Programmdokument.

Bei beiden Varianten wird ein abgebrochener Compact beim nächsten Durchlauf an der Abbruchstelle fortgesetzt. Es werden somit also nach mehreren Durchläufen auch wenn die Zeit nicht ausreicht alle Datenbanken mittels copy style compact komprimiert.

Achtung! Bei Verwendung des DBMT Tasks sollte man in der notes.ini des Servers den UPDALL Task entfernen, da er sonst doppelt läuft.

Mit "show stats dbmt" kann man sich diverse Informationen über die Ergebnisse des "DBMT" Task anzeigen:




Es gibt noch ein paar zusätzliche Parameter und notes.ini Einträge die dbmt betreffen, die man in der Doku nachlesen kann.

Mein Fazit: Für alle die Datenbankquotas auf Ihren Maildatenbanken verwenden, ist der DBMT vor allem im Zusammenspiel mit der neuen notes.ini Variable "MailFileDisableCompactAbort" ein riesen Fortschritt, weil man damit die Verkleinerung der mail Datenbanken sehr gut automatisieren kann und durch die Verwendung von mehreren Threads die Compacts auch sehr gut performen. Für alle die keine Datenbankquotas verwenden, wäre meiner Meinung nach ein Parameter für die Auswahl des Compact styles sinnvoll gewesen. Da copy style compacts die Datenbanken im Filesystem extrem fragementieren und ohne quotas nicht so oft notwendig sind.

Wünschenswert wäre es wenn der compact Task und auch der Fixup Task eine Option für mehrere Thread bekommen würden.


Für weitere Infos zur neuen Version schauen Sie auch auf meine Übersicht über alle Postings zum Thema Notes/Domino 9

Thursday, January 3, 2013

Coole neue notes.ini Variable in Domino 9 für Copy style compact

Bisher hatte man bei einem copy style compact von mail Datenbanken oft das Problem, dass der Copy style compact abgebrochen wurde, weil der Router eine e-mail in die zu komprimierende mail Datenbank zustellt. Deshalb war es oft notwendig, dass man vor der Datenbankmaintenance den Router Task stoppen musste, damit nicht Datenbanken beim Copystyle Compact übergangen werden. Mit Domino 9 wurde eine neue INI Variable "MailFileDisableCompactAbort=1" eingeführt, die genau dieses Problem löst. Sobald man die INI Variable am Server eingetragen hat, liefert der Router keine e-mails mehr an mail Datenbanken aus, für die gerade ein Compact läuft. Sobald der Compact fertig ist, werden die wartenden mails zugestellt.

Das ist einmal eine wirklich gute Neuerung obwohl erst die Praxis zeigen muss, ob es so gut funktioniert wie in der Doku versprochen ;-)

Für weitere Infos zur neuen Version schauen Sie auch auf meine Übersicht über alle Postings zum Thema Notes/Domino 9

Wednesday, January 2, 2013

Notes 9 SE erste Eindrücke aus Sicht des Plugin Entwicklers

Nach dem ich mir ein wenig den neuen Client, iNotes und das Browserplugin angeschaut habe, möchte ich mir heute den neuen Client aus der Sicht eines Plugin Entwicklers ansehen.

Die Einrichtung von Eclipse zur Entwicklung von Plugins für Notes 9 Social Edition hat schon Mikkel Heisterberg in einem sehr guten Howto (Eclipse 3.x, Eclipse 4.2) beschrieben. Deshalb kann ich mir dies hier sparen.

Ich habe dann also mal in meine neue Notesumgebung sämtliche Features und Plugins, die wir für den Notes Client entwickelt haben eingespielt und erfreulicherweise laufen alle Plugins ohne Probleme und Einschränkungen in Notes 9 Social Edition. Aber auch hier zeigt sich, dass sich die IBM wenig Mühe gegeben hat, ein konsistentes UI zu erreichen. Notes 8.x war sehr gut an das Farbschema (blau weiße Farbverläufe) von Eclipse angepasst. Deshalb haben sich Plugins die das Standarddesign der Platform übernommen haben sehr gut in den Notes Client eingefügt. Als kleines Beispiel wie das aussieht hier ein Screenshot aus unserem Hardwareinventoryplugin unter Notes 8.5.3:


Die Blautöne der Eclipsebereiche harmonieren relativ gut mit den Blautönen die in Lotus Notes 8.x verwendet wurden.

Leider passen die blauen Farbverläufe nicht mehr zu den grauen Farbverläufen von Notes 9


Dabei sollte es für die IBM ein leichtes sein, die Eclipseplugins dahingehend anzupassen, dass zum ausgewählten Theme passende Farben zurückgegeben werden, wenn ein Plugin Defaultfarben abruft. Ich habe mal Quick and Dirty das "org.eclipse.ui.forms" Plugin von Notes gepatched und schon sehen alle Plugins etwas mehr nach der Farbgebung von Notes aus.


Mit etwas Mühe hätte man da jeden Pluginprogrammierer viel Arbeit ersparen können und selbst erstellte Plugins würden sich automatisch ohne viel Aufwand in den neuen Notesclient einfügen.

Leider gibt es ausser den Änderungen beim Design praktisch kaum etwas neues für Plugin Entwickler. Für eine 8.5.4 wäre es ja auch durchaus in Ordnung gewesen, dass die IBM keine Updates an den Frameworks gemacht hat. Aber wenn man schon mit Notes 9 eine komplett neue Version akündigt kann ich nicht verstehen, warum man den Eclipse RCP Basiscode nicht aktualisiert hat. Wenn man bedenkt, dass jedes Jahr eine neue Version von Eclipse erscheint, dann ist relativ klar, dass viele aktuelle Plugins nicht mehr die uralte 3.4.2 Version von Notes 9 unterstützen. Hier würde ich mir wünschen, dass die IBM so rasch wie möglich zumindest auf die neueste 3.x Version updated. Derzeit ist ja schon 4.2 aktuell. Auch dass noch immer auf Java 1.6 statt 1.7 gesetzt wird, finde ich persönlich sehr schade. Ein echtes Highlight wäre für mich, wenn die IBM hier noch nachbessert und vielleicht bei nächster Gelegenheit Java FX integriert.

Auch die Domino Java API's haben kein Update erfahren. Hier wäre wirklich schon dringender Handlungsbedarf, da sich die Java API von Domino vom Design her sich immer noch wie Java 1.1 anfühlt. z.B. wird noch immer Vector verwendet, statt den mit 1.2 verbesserten Collectionsklassen. Auch Generics werden nach wie vor nicht unterstützt. Nicht einmal die neuen Calendarklassen werden offiziell unterstützt, wenn Sie auch in der Betaversion scheinbar drinnen sind.

Als Fazit kann man nur sagen, dass die IBM alle Leute die sich mit 8.x stark in der Pluginentwicklung engagiert haben mit Version 9 hängen lässt. Bei uns in der Firma geht der Trend dahin, dass wir unsere Plugins die wir für den Notesclient entwickelt haben, nach Vanilla Eclipse portieren und den Notes nur noch da verwenden, wo es gar nicht anders geht.


Für weitere Infos zur neuen Version schauen Sie auch auf meine Übersicht über alle Postings zum Thema Notes/Domino 9

Monday, December 31, 2012

Einen guten Rutsch und ein gutes neues Jahr

Ein arbeitsreiches und spannendes Jahr mit vielen neuen Entwicklungen im Bereich der IT liegt hinter uns. Ein Jahr in dem ich sehr viel neues von vielen Leuten in der "Yellowbubble" lernen durfte und hoffe, dass auch der eine oder andere aus meinen Blog etwas lernen konnte.

Daher bedanke ich mich bei allen Lesern meines Blogs für das Interesse und die guten Kommentare und wünsche allen meinen Lesern eine schöne Silvesterfeier, Gesundheit und viel Glück und Erfolg im neuen Jahr.
Quelle Openclipart.org

Friday, December 28, 2012

Erste Eindrücke vom Browserplugin und iNotes

Nachdem ich im letzten Post bereits die ersten Eindrücke zum Notesclient festgehalten habe möchte ich jetzt auch meinen Eindruck zweier Features die wir zwar nicht verwenden, die aber sehr viele Entwicklungsressourcen im Notes Entwicklungsteam gebunden haben anschauen.

1. Das Browserplugin

Erstens das Browserplugin macht von der Qualität einen viel besseren Eindruck als ich erwartet hätte. Es läuft soweit alles wie designed und sieht auch sehr gut aus.

 
Für Firmen die sehr viel mit xPages machen und Ihre Anwendungen hauptsächlich für den Browserclient ausrichten kann das eine mögliche Migrationshilfe sein. Man muss dann nicht mehr vom Browser in ein anderes Fenster wechseln, wenn man von einer xPages Anwendung in eine klassische Notesanwendung wechseln möchte.


Ein Problem, dass Anwender am Browserplugin hassen werden ist mir aber gleich aufgefallen. modale Dialoge blockieren nicht nur den geöffneten Tab, sondern blockieren das gesamte Browserfenster. Das heißt sobald das Notesplugin blockiert, kann man in anderen Browsertabs nicht mehr arbeiten. Es werden sogar andere Browserfenster in denen ebenfalls ein Tab mit einem Notesplugin offen ist gesperrt. Wie gesagt die Anwender werden diese Einschränkung wirklich hassen, da sie es von Webanwendungen nicht gewohnt sind.

Ebenfalls problematisch finde ich, dass der Notesclient und das Browserplugin nicht harmonieren. Wenn der Notesclient geöffnet ist, kann ich das Browserplugin nicht verwenden. Wenn ich im Browser einmal auf eine Notesfunktionalität zugegriffen habe, dann kann ich den Richclient erst wieder starten, wenn der Browser mit allen Tabs und Fenstern geschlossen wird. Wenn das Browserplugin installiert ist und der Notesclient offen funktioniert der Zugriff auf das "notes://" Protokoll nicht mehr und man erhält nur die Meldung dass der Notesclient bereits offen ist. Das ist für Endanwender sicher nicht zu verstehen.

Eine Kleinigkeit ist, dass die Druckfunktion des Browsers nicht funktioniert. Wenn man im Browser auf drucken geht, dann wird nur eine leere Seite gedruckt. Erst wenn man über das Notesmenü druckt, dann klappt das Drucken.

Offene Fragen zum Browserplugin sind aber für mich nach wie vor:
  • Größe des Plugins (Bei der Beta Version 150 MB!) 
  • Ich habe praktisch genau den gleichen Aufwand für das Deployment, wenn ich dem Benutzer bereits Einstellungen vorgeben möchte. Wobei ich noch nicht getestet habe, ob Policys beim Browserplugin überhaupt funktionieren. 
  • Teilweise sind Fehlermeldungen irreführend, da Sie für den Browserclient nicht passen und nur im Kontext mit dem Richclient sinn machen.
  • Sämtliche mit Notes 8 eingeführte Powerfeatures des Richclient sind im Browserplugin nicht verfügbar.
  • Warum bringt die IBM ein Feature, dass die Migration zu Cloud Diensten von nicht IBM Anbietern so stark erleichtert.

 2. iNotes

Wow iNotes sieht so gut aus, das man teilweise meint man verwendet einen nativen Client. Das ist wirklich eine starke Demonstration was mit Webtechnologien heutzutage möglich ist.

Auch die Performance ist wirklich großartig. Der Wechsel zwischen verschiedenen Bereichen geht blitzschnell und beinahe verzögerungsfrei aber leider leidet auch iNotes an Inkonsistenzen im UI. Statt den Follow Up Fähnchen von denen es im Client schon zwei verschiedene Versionen gibt, werden in iNotes plötzlich Sterne verwendet.  Wobei nicht nur die Symbole unterschiedlich sind, sondern auch noch der beschreibende Text. Fällt das bei der IBM niemanden auf, oder glaubt die IBM das es für die Benutzer leicht zu verstehen ist, dass ein Feature im Rich Client ein komplett anderes Design als in iNotes hat.

Die Icons des Richtexteditors sind ebenfalls in iNotes komplett anders als im Richclient und auch anders als die im Browserplugin verwendeten.

iNotes hat Icons die offensichtlich noch dem Notes 8.x Design entsprechen und dadurch überhaupt nicht zur neuen Farbgebung passen.

während das Browserplugin bereits die Icons des Notes 9 Social Edition Client spendiert bekommen hat.




Ein Bug ist mir auch noch aufgefallen. Die Startseite von iNotes lässt sich bei mir nicht customizen. Aber das sollte bis zur finalen Version erledigt sein.

Mein Resumee zum Browserplugin und iNotes  das beides Features sind die nicht nicht aktiv einsetze und daher auch nur oberflächlich angeschaut habe ist, dass beide Features trotz aller Kritik einen sehr guten Eindruck hinterlassen. Vor allem iNotes ist für Leute die einen Browser verwenden müssen eine tolle Sache. Auch wenn ich auf jeden Fall jedem Poweruser den Richclient ans Herz legen sollte.


Für weitere Infos zur neuen Version schauen Sie auch auf meine Übersicht über alle Postings zum Thema Notes/Domino 9

Notes 9 als Anwender; erster Blick Hui, zweiter Blick leider Pfui.

Endlich über die Weihnachtsfeiertage bin ich auch mal dazu gekommen mir die Beta von Notes 9 Social Edition im Detail anzusehen. Vorweg schicken möchte ich, dass ich Notes seit über 12 Jahren sowohl als Anwender als auch als Administrator und auch als Entwickler verwendet habe und auch nach wie vor verwende. Ich stehe Notes prinzipiell sehr positiv gegenüber und war auch immer ein Verfechter des Standardclients auch wenn die ersten Versionen des Standardclients sehr buggy waren. Ich war aber speziell ab der 8.5.1 der Meinung, dass Notes auf einen sehr guten Weg war. Die neuen Features wurden immer stabiler und auch die Performance wurde langsam besser. Als ich dann gehört habe, dass bei Notes 8.5.4 bzw. jetzt Notes 9 nocheinmal Verbesserungen am UI gemacht würden, war ich begeistert.

Für den Test habe ich eine komplett neue Umgebung installiert, ohne irgendeine Übernahme von Altdaten, damit sollten die besten Voraussetzungen geschaffen sein, dass Notes 9 sein volles Potential ausspielen kann.

Der Startschirm von Notes sieht auch wirklich sehr gut aus. Die reduzierte Farbwahl und die Fonts sehen wirklich sehr stimmig aus.



Auch die Mailansicht sieht auf den ersten Blick sehr ansprechend aus und erzeugt ein starkes ich will das so bald wie möglich auf meinem Arbeitsrechner haben .



Aber all diese Dinge haben auch schon in 8.5.3 schon ziemlich gut ausgesehen und leider hat die IBM es versäumt das wichtigste zu machen. Die Dinge in Notes die bisher schon total veraltet und vom Design inkosistent waren auf das Design von 8.5.3 oder 9 zu heben. In diesem Bereich versagt Notes 9 völlig. Eher ist es so, dass neue Inkosistenzen dazu gekommen sind.

Und bei diesen Dingen im alten Design handelt es sich nicht etwa um wirklich selten verwendete Features. Hier ein paar Beispiele:



Der Öffnen Dialog eine sehr of verwendete Funktion sieht immer noch weitgehend wie in Notes 7 aus. Die Fensterdekorationen und auch der Hinweis für die Vergrösserung des Fensters sind für Windows 7 vollkommen untypisch. Die Icons passen überhaupt nicht zum Rest des Clients. Die Knöpfe sehen ziemlich nach Windows 98 aus.

Übrigens im Designer wurde der selbe Dialog gegen einen neuen ausgetauscht, der nicht nur eine Windows 7 Fensterdekoration sondern auch die richtigen Knöpfe und auch ganz andere Icons für die Anwendungen und Ordner verwendet. Man muss aber sagen, dass auch diese Icons noch im 8.x Gewand sind und von der Farbe nicht zu Notes 9 passen :-( Wie viel Aufwand wäre es wohl gewesen diesen Dialog ohne Workingset Rubrik auch im Client zu verwenden.


Super konsistent sind auch die Beschreibungen ("On My Computer" vs. "local").


Fast noch schlimmer, der Passwortdialog von Lotus Notes der ebenfalls schon lange nicht mehr neu designed wurde.



Dieser Dialog ist die erste Visitenkarte die jeder Anwender bei der Verwendung von Notes bekommt. Leider vermittelt dieser Dialog und vor allem auch der Schlüsselring ein für das Jahr 2012 unerträgliches Windows 98 Feeling.

Alle Dialogboxen in Notes verwenden total unterschiedliche UI Widgetsets.Hier mal eine kurze Zusammenstellung was die UI Designer der IBM so an verschiedenen Buttonstilen zu bieten haben.

 
 


Es kann doch nicht sein, dass ein und die selbe Awendung vier verschiedene Stile für normale Schaltflächen in Dialogen (In normalen Notesmasken wird natürlich wieder eine andere Optik benützt) verwenden muss. Bevor man das bereits gute Design der Notes PIM CA's wieder komplett überarbeitet wäre es doch mal an der Zeit gewesen, eventuell alte Dialoge an das aktuelle Design anzupassen. Übrigens wenn man für die Schaltflächen die Widgets vom Operating System verwenden würde, wie in den Eclipseteilen der Anwendung, dann hätte man automatisch immer einheitliche Schaltflächen und diese würden auch immer automatisch nativ aussehen.

Das selbe gilt natürlich für alle anderen UI Elemente genauso. z.B. für die Checkboxen.

Einmal richtig, wie es unter Windows 7 aussehen soll.

Dann wieder im Stil von Windows 98 und das nicht etwa an einer ganz anderen Stelle sondern im selben Einstellungsdialog von Notes 9!

Ebenfalls unverständlich die schon unter Notes 8 wie ein Fremdkörper wirkende Follow Up Ansicht, die bei uns in der Firma sehr gerne verwendet wird, wurde nicht aktualisiert. Wie viel Aufwand wäre das wohl gewesen (hochgerechnet mit testen und übersetzen vielleicht 1 Mannwoche).


So passen halt weder die Schriftarten, noch die Aktionsleiste noch die Spaltenköpfe noch das generelle Design der Ansicht zum neuen bzw. auch nicht zum 8.x.x Inbox design.

Das in der Maildatenbank für die Follow Up Funktion unterschiedliche Symbole für die Darstellung der selben Priorität verwendet werden, ist da nur noch die Spitze des Eisbergs.

z.B. im Dialog zur Erstellung eines Follow Ups
 z.B. in der Inbox View


Sollte doch normal eine Bildressource sein und dann überall gleich aussehen oder nicht?

Auch uralte Bugs bei der Fontauswahl wie z.B. SPR KSOR/USEJ3 im Standardclient sind in Notes 9 noch immer nicht gefixt.

Man könnte diesen Rant jetzt ewig fortsetzen, aber das erspare ich mir. Als Resumee bleibt Notes 9 sieht auf den ersten Blick fantastisch aus, aber leider hat die IBM wieder nur die Komponenten die bereits unter Notes 8 Standard sehr gut ausgesehen haben verbessert. Die anderen Komponenten sehen nach wie vor wie in Notes 7 aus und werden berechtigterweise von Endbenutzern sehr häufig kritisiert.

 P.S. Ich bin nach wie vor der Meinung, dass IBM Notes eine gute Software ist, aber leider wird nie dieser letzte Aufwand betrieben um die ganzen Ecken und Kanten abzuschleifen die derzeit verhindern, dass Notes ein von Anwendern gliebtes Programm wird.


Für weitere Infos zur neuen Version schauen Sie auch auf meine Übersicht über alle Postings zum Thema Notes/Domino 9

Thursday, December 27, 2012

Hochperformante und sichere SQL Zugriffe in Java

Beim Zugriff auf SQL Datenbanken wird immer gerne der Fehler gemacht, dass wenn ein SQL Statement mehrmals mit verschiedenen Parametern ausgeführt werden soll nicht die dafür vorgesehenen PreparedStatements sondern die SQL Befehle mit String Konkatinierung  zusammengebaut und mit execute() ausgeführt werden. Sogar in Java Lehrbüchern findet man immer wieder Beispiele wie das folgende, dass man aber in der Praxis auf keinen Fall so verwenden sollte.

public class StatementJDBC {
 private static Statement stmt;
 /**
  * @param args
  */
 public static void main(String[] args) {
  //Verbinde mit Datenbank und initalisiere Anweisung
  AS400JDBCDataSource dataSource = new AS400JDBCDataSource("localhost", "user", "password");
  try {
   Connection con=dataSource.getConnection();
   stmt=con.createStatement();
  //Gib verschiedene Namen aus der Adressdatei mit verschiedenen Adressnummern aus.
   Date start=new Date();
   System.out.println(getName("40"));
   System.out.println(getName("41"));
   System.out.println(getName("42"));
   System.out.println(getName("43"));
   System.out.println(new Date().getTime()-start.getTime());
  } catch (SQLException e) {
   e.printStackTrace();
  }
 }
 /**
  * Liest mittels SQL den Namen eines Adressatzes.
  * 
  * Hier  wird jedes mal ein SQLStatement mit String Konkatinierung zusammengebaut 
     * und ausgeführt. 
     *
     * Dies soll man in der Praxis nicht machen.
  * @param adressNummer
  * @return Name
  */
 private static String getName(String adressNummer) throws SQLException {
  ResultSet rs=stmt.executeQuery("select * from adressen where adnr="+adressNummer);
  if(rs.next()) return rs.getString("adnam1");
  return "";
 }

}

Es gibt zwei Gründe warum man seinen SQL Code nicht jedes mal als String zusammenbauen und dann mit execute() ausführen soll.

Bei wiederholter Ausführung des selben SQL Code ist die Performance viel besser, wenn der SQL Code nicht jedesmal geparst, geprüft und in einen Zugriffsplan übersetzt werden muß. Der Vorgang ein SQL Kommando in einen Zugriffsplan zu übersetzen ist je nach verwendeter Datenbank und Komplexität der Anweisung extrem aufwendig. Der oben angeführte Codeblock in dem die Zeit gemessen wird, läuft wenn man Preparedstatements verwendet, ca. 3 mal schneller als mit dem oben angeführten Code.

Was aber fast noch wichtiger ist, wenn ich SQL Befehle mit String Konkatinierung zusammenbaue, dann wird der Code anfällig für SQL Injections. Das heißt, es kann in der Variable mit ein paar Tricks beliebiger SQL Code eingeschleust werden. Dies ist eine der häufigsten Einfallstore für Hacks auf Webseiten. Also selbst wenn ein Statement nur einmal verwendet wird, sollte man auf jeden Fall um SQL Injections zu vermeiden Preparedstatements verwenden.

Noch dazu ist die Verwendung von Preparedstatements eigentlich extrem einfach. Man ändert den Typ von stmt auf PreparedStatement, und erstellt das Objekt mit prepareStatement(). Für jeden Wert der in der Anweisung variabel sein soll fügt man ein Fragezeichen ein. Der sqlCode aus obigen Beispiel heißt dann "select * from adressen where adnr=?". Bei jeder Verwendung der SQL Anweisung muss dann mit der passenden set Methode der Platzhalter im Statement mit dem richtigen Wert befüllt werden. Am leichtesten zu verstehen ist es wenn man sich folgendes Beispiel anschaut.
public class PreparedStatementJDBC {
 private static PreparedStatement stmt;
 /**
  * @param args
  */
 public static void main(String[] args) {
  //Verbinde mit Datenbank und initalisiere Anweisung
  AS400JDBCDataSource dataSource = new AS400JDBCDataSource("localhost", "user", "password");
  try {
   Connection con=dataSource.getConnection();
   stmt=con.prepareStatement("select * from adressen where adnr=?");
  //Gib verschiedene Namen aus der Adressdatei mit verschiedenen Adressnummern aus.
   Date start=new Date();
   System.out.println(getName("40"));
   System.out.println(getName("41"));
   System.out.println(getName("42"));
   System.out.println(getName("43"));
   System.out.println(new Date().getTime()-start.getTime());
  } catch (SQLException e) {
   e.printStackTrace();
  }
 }
 /**
  * Liest mittels SQL den Namen eines Adressatzes.
  * @param adressNummer
  * @return Name
  */
 private static String getName(String adressNummer) throws SQLException {
  //Parameter im vorbereiteten Statement setzen.
  stmt.setInt(1, new Integer(adressNummer).intValue());
  ResultSet rs=stmt.executeQuery();
  if(rs.next()) return rs.getString("adnam1");
  return "";
 }

}

Die Preparedstatements können natürlich nicht nur für "Selects", sondern genauso gut auch für "Inserts" und "Updates" verwendet werden. 

Wer JDBC Zugriffe in seinen xPages, Plugins oder Agenten verwendet, sollte prüfen ob er auch wirklich überall schon PreparedStatements verwendet. Der Performancegewinn und vor allem die zusätzliche Sicherheit vor SQL Injections sollte den geringen Änderungsaufwand auf jeden Fall lohnen.
ad