Dienstag, 31. März 2009

Glassfish, JDBC und DB/2

Der JDBC-Treiber von IBM für DB/2 hat es in sich: normale Verbindungen über den DriverManager funktionieren, aber der Zugriff über eine DataSource - was der Glassfish macht - bricht ab mit einer Fehlermeldung in der Art

Caused by: com.ibm.db2.jcc.a.SqlException: jcc10389122453.51.90
Beim Laden der nativen Bibliothek db2jcct2,
java.lang.UnsatisfiedLinkError: no db2jcct2 in java.library.path ist ein Fehler aufgetreten: ERRORCODE=-4472, SQLSTATE=null

Dies kommt daher, dass der Treiber standardmäßig als Typ-2-Treiber eine native Bibliothek nachladen will. Ich hab es selbst nach Kopieren von 36 MB Bibliotheken nur geschafft, dass er nicht mehr über fehlende Bibliotheken meckert, dafür aber mit einem Segmentation Fault abstürzt. Die Lösung für das Problem ist es dem Treiber zu sagen, dass er ein Typ-4-Treiber sein soll. Beim DriverManager reicht hierfür die Angabe des Ports in der URL. Bei der DataSource muss man die Methode "setType(4)" aufrufen:

DB2DataSource dB2DataSource = new com.ibm.db2.jcc.DB2DataSource();
dB2DataSource.setDriverType(4);
dB2DataSource.setServerName("192.168.1.194");
dB2DataSource.setPortNumber(50000);
dB2DataSource.setUser("XXX");
dB2DataSource.setPassword("YYY");
dB2DataSource.setDatabaseName("ZZZ");
dB2DataSource.setSysSchema("XYZ");
dB2DataSource.getConnection();

und schon klappt es. Im Glassfish ist dies folgendermaßen einzurichten: man wählt als Datenbank DB/2 aus, ändert die Datasource-Klasse in "com.ibm.db2.jcc.DB2XADataSource" und setzt als Type "javax.sql.XADataSource".



Bei den Properties muss man eine zusätzliche Property "driverType" einfügen und sie auf den Wert 4 setzen:


Hat man das gemacht, wir der Ping grün und das ganz ohne native Bibliotheken. Natürlich nicht vergessen, die Treiberdatei in das lib-Verzeichnis der Glassfish-Domain zu kopieren, damit er ihn überhaupt finden kann.

4 Kommentare:

Kevin Dewi hat gesagt…

Hallo,

ich hatte bisher GlassFish noch nie ausprobiert. Welche Erfahrungen hast du denn gegenüber Jboss bzw. geronimo gemacht?

viele grüße
kevin

Kurt Huwig hat gesagt…

Geronimo hab ich noch nie verwendet. JBoss hab ich längere Zeit benutzt. Ich hab aber auf Glassfish gewechselt, weil dort die Unterstützung für JavaEE besser ist, sprich weiter vorangeschritten. Beim Wechsel sind einige Fehler aufgefallen, die der JBoss ignoriert, aber beim Glassfish zum Tragen kommen. Wäre wahrscheinlich auch umgekehrt passiert, aber vom Gefühl her ist Glassfish pingeliger. Die Admin-Oberfläche des Glassfish ist deutlich einfacher zu bedienen, als die XML-Dateien des JBoss. Von der Geschwindigkeit her konnte ich keine Unterschiede feststellen, aber dafür sind meine Projekte auch zu wenige resourcenhungrig.

Gruß

Kurt

Kevin Dewi hat gesagt…

vielen Dank für die Hinweise.
ich werde ihn wohl auch mal evaluieren, wobei ich derzeit viel mit Jboss Seam am rumspielen bin und ich bezweifle, dass das unter Glassfish läuft.

Kurt Huwig hat gesagt…

Seam + Glassfish ist so eine Sache mit der ich auch gerade kämpfe. Es wird behauptet, dass es gehen soll, aber ich hab noch Classloader-Probleme und aktuell keine Zeit, mich näher damit zu befassen.