Lotus Notes / Domino Sonstiges > Java und .NET mit Notes/Domino

JDBC Treiber einbinden

(1/4) > >>

qojote:
Hi,

kann mir jemand sagen wie einen Jdbc Treiber einbinde ?

Hintergrund ich möchte mit einem Agent Daten as einer DB2 lesen /schreiben.
Soweit ich weiß ist es so das Java Agents immer auf dem NotesServer ausgeführt werden.
Was für mich bedeutet das der Treiber nur auf dem Server eingbunden sein muß oder ??
Reicht es wenn ich den Treiber ( ist eine Jar Datei ) einfach in den Classpath des Servers schreibe ?
Oder muß ich dem Notesserver noch was mit geben so ähnlich wie am client mit den UserClasses ??

Hat sowas schon mal einer von euch versucht ??

Danke

Qojote

Axel_Janssen:

--- Zitat von: qojote am 19.06.03 - 01:35:26 ---Hi,

--- Ende Zitat ---

Hi. Das schöne an diesem "Java für Anfänger" ist, dass man die fellow Fragensteller noch mit Handschlag begrüssen kann:



--- Zitat ---kann mir jemand sagen wie einen Jdbc Treiber einbinde ?

--- Ende Zitat ---
ja.
[gehe davon aus, dass du LoNo5 benutzt. LoNo6 dürfte ähnlich und   gerade nicht auf diesen computer :-[]


Erstmal Frage:
Du vewendest db2java.zip, oder?
Für DB2 befindet sich der Treiber in db2java.zip. Es gibt davon 2 Versionen. Eine für Java11 (für LoNo5 funktioniert wahrscheinlich nur diese) und eine andere für >=java12. Bei mir steht die java11-Version unter SQLLIB/java11 und die java2 Version unter java (ich habe Standardmässig Java2 Unterstützung in meinem DB2.

Es gibt unterschiedliche Wege einen JDBC-Treiber in Notes einzubinden einzubinden.
Ein JDBC-Treiber ist nichts anderes als eine einfache Java-Klasse, bzw ein Verbund der selben (jar oder zip File).
Weg 1 ist für die Entwicklung der flexiblere, Weg 2 vielleicht für Produktivsysteme der Bessere.
Weg 1:
{später habe ich festgestellt, das mit JDBC-Treibern Weg 1 nicht funktioniert. Will man sonstige Zusatz-Libraries einbinden, kann man das aber machen. Bei dem JDBC-Treiber von DB2 (und möglicherweise anderen) existiert unter Java1.18 ein Spezialproblem mit irgendwelchen Zugriffen auf über Java Native Interface angesprochene dlls (verfestigte Arbeitshypothese)
s. unten.
}

Du machst einen Java-Agenten. Also unten Typ: Java.
Nun hast du rechts unten ein Fenster. Über den ganz linken Button "Edit Project" kannst du 3rd party jars/zips einbinden. Es öffnet sich ein neues Fenster.  
In meinen Fall navigiere ich bei Base Directory zu D:\SQLLIB\java11.
Auf der linken Seite erscheint db2java.zip. Dann klicke ich auf Add/Replace Files und klicke dann auf OK.
Jetzt sind die Klassen da.
Nix mehr ClassNotFoundException.
 
Weg 2:
Du kannst in der Notes.ini des Servers eine Zeile JavaUserClasses einfügen, wo du die jars/zips eintragen kannst, die auf diesen NotesServer zusätzlich benutzt werden sollen. Ich meine mich zu erinnern, dass dies Performance-mässig besser ist als für jeden Agenten einzeln zips zu importieren. Der Classloader der Notes-VM läd diese Zusatz-Klassen nämlich beim Starten in den Speicher.

Wenn du weitere Fragen hast, stelle sie.

Das von mir propagierte umsonst-Buch "Handbuch der Java Programmierung" (http://www.javabuch.de) hat mit Nummer 42 ein eigenes Kapitel, das sicher ziemlich gut ist. Ich benutze für JDBC auch oft das entsprechende Kapitel im Sun Tutorial. http://java.sun.com/docs/ . Hier Link zu The Java Tutorial.

Gruss Axel

P.S.
Das ist alles ein bischen retro.
Aus 2 Gründen:
1. In J2EE Servern wie Tomcat oder Websphere arbeitet man this days mit sogenannten Connection Pools. In Notes-Agenten musst du jedes mal eine neue Connection zu der Datenbank erzeugen. Bei J2EE werden diese Connections nach Gebrauch in den Pool getan und können wiederverwendet werden. Das ist effizienter.

2. Man geht immer mehr davon ab JDBC wirklich zu koden. Das hat tiefere Gründe als dem Programmierer Tipperei zu ersparen. Es gibt nun verschiedene, sehr ernstzunehmende Frameworks, Spezifikationen oder verwandtes, die für den Programmierer transparente Persistenz-Services (anderes Wort für Integration mit RDBMS) anbieten und somit den Programmierer vor Arbeit und menschlichen Fehlern bewahren.
Man spricht hier von Object/Relational Mapping.
Es geht darum dass Objekt-Modelle eines Business-Problems und deren persistenten Repräsentation in RDBMS etwas sehr unterschiedliches sind (Object-Relational impedance missmatch). Objekt-Modelle modellieren den jeweiligen Business Process, indem dieser in miteinander kommunizierende Objekte dargestellt wird, während sich Datenbank Schemas nach technisch-mathematischen Konzepten ausrichten (normalisieren -> Redundanz vermeiden).  
Beliebt sind derzeit Hibernate und Castor (open Source). Auch Entity Enterprise Java Beans bieten Object Relational Mapping an. Daneben existieren noch Producte wie Cocobase oder Toplink. JDO ist eine neue Spezifikation, für die es bereits >20.
 Hersteller-Implementierungen gibt. JDO ist derzeit ein sehr hippes Thema in Java-Land.
Wobei viele dieser Produkte, Frameworks und Sonstiges über die Persistenzierung in RDBMS hinausgehen sondern auch automatisierte Persistenz in Files, nicht RDBMS-DB2 wie LoNO oder xml anbieten.
  :-X

qojote:
Hi erst mal vielen Dank für deine Antwort.
Werd das gleich mal probieren.

Ich hab hier zwei Bücher über Notes und java 1. von Patton 2. von Ibm Press ( von Muhns ist super entäuschend mehr als die hälfte des Buches ist die Notes Klassen beschreibung die auch in der Hilfe steht.).
Es steht zwar in allen drin wie man über JDBC eine connection aufbaut und ein Sql abschiesst aber das wichtige wie man die Treiber einbindet und so das steht nirgends.
Schade das da niemand mal ein vernünftiges Buch schreiben kann oder kennst du eins ??
Ich fahr am Mittwoch drei Wochen in Urlaub. Ich nehm mein Notebook mit und hoffe das ich da ein bisschen mehr Zeit hab was zu machen ( wenn Frau und Kinder mich lassen :-)))
Schade ist das ich da auf deine Hilfe verzichten muß weil da kommen bestimmt richtig viele Fragen auf.
Gruß
qojote

Axel_Janssen:

--- Zitat von: qojote am 19.06.03 - 12:04:03 ---Schade das da niemand mal ein vernünftiges Buch schreiben kann oder kennst du eins ??

--- Ende Zitat ---

quojote,

ich glaube das Thema Lotus und Java ist einfach zu - um es mal OO-mässig auszudrücken - fine-grained, als dass es ausreichend Käufer finden würde, die vom Autor den nötigen Einsatz pekuniär rechtfertigen würde. ;D
Ich war schockiert, als ich erfahren habe, wie wenig von mir als Nobelpreis-würdig gehaltene Autoren durch das Schreiben von Büchern eigentlich verdienen (6 Euro die Stunde oder z.T. wesentlich weniger. und ok die machen sich mit dem Buch einen Namen, wenn es gut ist).

Ich persönlich kaufe Java Bücher nach Amazon-, JavaMagazin- und Javaranch Ratings sowie aus irrationalen groopy-Gehabe (alles von Simon Brown, Kyle Brown und Rick Hightower).  

Deshalb nimmst du am besten unterschiedliche Objekte, um das Problem zu lösen:
- jdbc ist Teil von core-Java und in umsonst zugänglichen, hervorragenden Ressourcen (javabuch.de, Sun-Tutorial) sehr gut beschrieben.
- Spezial-Info zu dem Treiber deines RDBMS suchst du am besten in der Dokumentation des RDBMS (DB2: Redbooks, online oder Buch). Beispiel: Info zu jdbc-Treibern von MySql  sucht man am besten auf den MySql-Seiten im Web.
- in den Notes-Büchern sind dann nur noch die Spezial-Infos zu jdbc in Notes interessant. Der Rest ist meist wohl ziemlich müde.

Du hast mich auf eine Idee gebracht: Ich werde hier eine aufgeräumte (nicht chaotische) Liste erzeugen, wo ich gute Bücher aufliste mit Preis (vieles ist Umsonst), kurzer Beschreibung, Fokus, und (wieviel Aspirin soll ich vorher einnehmen, damit ich beim Lesen keine Kopfschmerzen kriege)-Faktor.

Gruss Axel

----
wer jdbc:odbc:Bridge verwendet ist feige und ausserdem soll man das nicht produktiv einsetzen, weil es wirklich (ich schwöre) mehr als Demo denn als vernünftiger jdbc-Treiber gedacht ist.

Axel_Janssen:
Ich habs jetzt mal versucht schnell durchzucoden, bin aber auf ein rätselhaftes Problem gestossen.

Probleme macht der DB2-Treiber.
Diese Probleme sind mir bisher unbekannt. Habe diesen unter Websphere4 und 5, Tomcat und aus einer Desktop-App benutzt.

Ich habe mal in einem Projekt mit Oracle via jdbc von Lotus5 aus kommuniziert, da sind solche Schwierigkeiten nicht aufgetreten.

Ich bekome eine

--- Code: ---ava.lang.UnsatisfiedLinkError: SQLAllocEnv

   at COM.ibm.db2.jdbc.app.DB2Driver.<init>(DB2Driver.java:244)

   at

   at

   at lotus.domino.AgentBase.runNotes(AgentBase.java:160)

   at lotus.domino.NotesThread.run(NotesThread.java:203)

--- Ende Code ---

Google gibt ein paar Dinge aus, oft in Verbindung mit DB2. Einige Spuren aber noch keine Ergebnisse.

Tja zu Demo-zwecken ist es vielleiht ok erstmal mit jdbc-odbc-Bridge zu arbeiten ( :P ). Diese ist bereits in den Java-Klassen auf Domino dabei (sollte aber in robusten Produktivumgebungen nicht verwendet werden.

Du kannst den Code ja mal ausprobieren.
Vorher musst du noch eine System ODBC Datenquelle für DB2 erzeugen (in Systemsteuerung/Verwaltung).
Als Datenbank verwende ich die SAMPLE-Datenbank. Eine Art Schulungsdatenbank, die Leute meist auf DB2 installiert haben (ähnlich wie Nordwind auf Access).  
 
Sehr dankbar wäre ich, wenn Leute mit DB2 und LoNo5 oder LoNo6 mal den DB2 code ausprobieren. An den beiden markierten Stellen die Kommentare umswitchen (mach das später konfortabler).

Vielleicht liegt es auch an irgendwelchen Konfigurations-Merkwürdigkeiten bei mir.

Einstellungen des Agenten:
- Manually from actions menu
- (Run once @Commands may be used)


--- Code: ---import lotus.domino.*;
import java.util.*;
import java.io.*;
import java.sql.*;

public class JavaAgent extends AgentBase {
   
   //private final String jdbcUrl = "jdbc:db2:SAMPLE"; // Syntax siehe IBM DB2 JDBC Treiber Doku
   private final String jdbcUrl = "jdbc:db2:SAMPLE";
   private final String jdbcUser = "db2admin";  // Name von db2-superuser auf meinem Rechner
   private final String jdbcPassword = "kennwort"; // 70% aller meiner kennwörter heissen so :-)
   
   private Driver jdbcDriver = null;
 
   public void NotesMain() {
     
      /*
      * Es wird eine JDBC-Verbindung aufgebaut und geschlossen.
      * Die Abfolge der einzelnen Schritte ist immer gleich.
      * ... auch wenn man z.B. von einer Desktop-Swing-GUI aus jdbc nutzt.
      * ... oder von einem Application Server wie IBM-Websphere, Bea Weblogic oder Tomcat.
      */
     
      // 1. JDBC-Treiber laden
      // Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");  
      // ---> big OOOOPPPPS: Jdbc-Treiber per Reflection laden geht nicht mit Notes!!!
      // Dies hat mit Sycherheitschecks innerhalb von Java und Besonderheiten des VM-loading in Domino zu tun.
      // sowas muss man wissen.
      try {  
         //das geht bei mir!!!
         jdbcDriver = new COM.ibm.db2.jdbc.app.DB2Driver();
         // FUNKTIONIERT NICHT !!! mit db2-jdbc Treiber
         //jdbcDriver = new sun.jdbc.odbc.JdbcOdbcDriver();
      // Dies lokale Version des Treibers. Wesentlich performanter als net-Version (Paket *.net.* statt *.app.*).
      // Kann auch benutzt werden, wenn z.B. DB2 Server auf Box A und Notes-Server auf Box B, aber auf Box B Db2 User-Client, auf
      // dem anzusprechende Datenbank katalogisiert.

   
      // 2. Verbindung zur Datenbank herstellen
      Properties props = new Properties ();
      props.put(jdbcUser, jdbcPassword);
      Connection con = jdbcDriver.connect(jdbcUrl, props);
     
      // 3. Sql Statement generieren
      Statement stmt = con.createStatement();
      // extrem oft ist aus Sicherheits- und Performance-Gründen PreparedStatement, bei LoNo-Agents glaub ich nicht
     
      // 4. Statement gegen Datenbank senden
      String query = "SELECT NAME FROM STAFF ORDER BY SALARY";
      ResultSet rs = stmt.executeQuery(query);
     
      // ZWISCHENSCHRITT START
      // irgendwas mit dem ResultSet machen
      while (rs.next())
         System.out.println(rs.getString(1));
         
     
      // ZWISCHENSCHRITT Ende
     
      // 5. Aufräumen --> sehr, sehr wichtig, gerade für connections
      rs.close();
      stmt.close();
       con.close();
       
       // Notes-Besonderheit wg. Oooopppps unter Punkt 1
       DriverManager.deregisterDriver(jdbcDriver);
      } catch (Exception e) {
         e.printStackTrace();
      }
         /*  
         Notes - Zeug erstmal auskommentiert!!!  
         try {
         Session session = getSession();
         AgentContext agentContext = session.getAgentContext();

         

      } catch(Exception e) {
         e.printStackTrace();
      }
      */
   }
}

--- Ende Code ---

Gruss Axel
 

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln