View Full Version : Java auf iSeries
Ottersberg
15-04-08, 14:47
Ich habe ein erstes Programm für ein einfaches Lesen und Ausgeben von Daten geschrieben. Es wird je eine Tabelle der iSeries und des MSSQL-Servers gelesen und auf der Konsole ausgegeben. Lokal bei mir auf dem Rechner funktioniert das. Auf der iSeries kommt keine Verbindung zum MSSQL-Server zustande. Es kommt die Meldung:
com.microsoft.sqlserver.jdbc.TDSChannel enableSSL
WARNUNG: TDSChannel ( ConnectionID:1 TransactionID:0x0000000000000000) SSL handshake failed: null
com.microsoft.sqlserver.jdbc.SQLServerException: Der Treiber konnte keine sichere Verbindung mit SQL Server über die SSL (Secure Sockets Layer)-Verschlüsselung herstellen. Fehler: null.
Im ConnectionString habe ich extra ein "encrypt=false" hinzugefügt, was eigentlich bewerkstelligen soll, dass kein SSL erforderlich ist. Weiß da jemand Rat, da es sich ja scheinbar um eine spezifisches Sache der iSeries handelt.
Weiterhin scheint das mit dem Classpath irgendwie nicht zu klappen. Egal ob ich die Systemvariable unter WRKENVVAR setze oder -classpath beim Aufruf übergebe, es wird scheinbar immer ignoriert. Die Datenbankverbindungen klappten erst, als ich die entsprechenden jar-Files in den Ordner QIBM\ProdData\OS400\Java400\jdk\lib\ext kopiert habe. Dort wird ja halt standardmäßig nach Dateien gesucht.
Außerdem wollte ich Fragen ob der Geschwindigkeitsunterschied zwischen iSeries und lokal stimmt. Lokal brauche mein Programm etwa 4 Sek. Auf der iSeries etwa 60 Sekunden für das Auslesen der iSeries-Daten und dann etwa nochmal 60 Sekunden bis zum Programmabbruch beim Versuch die Verbindung zum MSSQL-Server herzustellen. Oder liegt das daran, dass er die jar-Dateien suchen muss?
jar's sind wie Verzeichnisse zu sehen.
Sie gehören also in den Classpath hinein:
java -classpath "/QIBM/ProdData/Java400/jdk14/bin:/Java/hello.jar" Hello
"Hello" wenn dies deine Main-Klasse ist.
Desgleichen gehören auch die Treiberkomponenten für den JDBC-Treiber in den classpath.
Ich mache z.B. eine Verbindung zu einer Oracle-DB mit:
"...:/Home/Fuerchau/Java/Driver/classes12.zip"
somit findet er den Treiber in der classes1.zip (auch hier wieder wie ein Verzeichnis).
Was die SSL-Verschlüsselung angeht, so bestimmt ggf. der SQL-Server, dass SSL nötig ist.
Hierfür sind bestimmt doch einige Konfigdateien in deiner Eclipse-Umgebung vorhanden, die du auch ggf. in dein Home-Verzeichnis auf der AS/400 kopieren musst.
Ohne SSL wird mit Sicherheit ein anderer Port für die Verbindung mit dem SQL-Server einzustellen sein.
Was die Geschwindigkeit angeht, so gibt es viele Faktoren.
Ich kann mit Java und SQL aus der AS/400 relativ schnell Daten lesen, das Schreiben nach Oracle dauert dafür etwas länger, so dass ich ca. 1000 Sätze pro Minute übertragen kann.
Hier könnte das Netz, die Leitung oder auch Oracle Schuld haben.
Die 60 Sekunden bis zum Abbruch liegen ggf. am ConnectionTimeout.
Ottersberg
15-04-08, 16:01
com.microsoft.sqlserver.jdbc.TDSChannel enableSSL
WARNUNG: TDSChannel ( ConnectionID:1 TransactionID:0x0000000000000000) SSL handshake failed: null
com.microsoft.sqlserver.jdbc.SQLServerException: Der Treiber konnte keine sichere Verbindung mit SQL Server über die SSL (Secure Sockets Layer)-Verschlüsselung herstellen. Fehler: null.
Zu diesem Problem habe ich jetzt etwas gefunden. Siehe "WARNING: TDSChannel" When Attempting to Connect - TechNet Forums (http://forums.microsoft.com/TechNet/ShowPost.aspx?PostID=2367299&SiteID=17)
Lösungsvorschläge dort:
1. Verwendung von JDBC-Treiber Version 1.1 anstatt 1.2
2. Anpassung der JSSE (http://publib.boulder.ibm.com/infocenter/iseries/v5r4/index.jsp?topic=/rzaha/rzahajssemain.htm)
Bei Version 1.1 tritt der Fehler nicht mehr auf, dafür aber ein neuer.
Angeblich wird der "Host nicht gefunden". Dazu habe ich noch nichts gefunden.
Für den Host benötigst du eine Namensauflösung.
Je nach dem, wie du den Host angibst, wird ein HOSTS-Eintrag, ein DNS-Server oder nur die IP benötigt.
Ist dir die IP bekannt, gib diese direkt an.
Kennt du nur den Namen, mach mal einen Ping aus einer DOS-Box, dann bekommst du die IP.
HOSTS-Einträge werden über
GO CFGTCP
10. Mit TCP/IP-Host-Tabelleneinträgen arbeiten
DNS-Server werden über
12. TCP/IP-Domäneninformationen ändern
eingetragen.
Ottersberg
15-04-08, 16:10
Es ist bereits die IP-Adresse angegeben.
Ich habe mich allerdings etwas blöd ausgedrückt. Es ist nicht die Zieldatenbank (MSSQL) unbekannt, sondern es kommt die Meldung die iSeries als Host ist unbekannt.
Um genau zu sein:
Host [iSeries_Name].[Domäne].DE nicht gefunden
Da stellt sich mir nun die Frage, wie du die AS/400 adressierst.
Per IP für die AS/400 kannst du auch 127.0.0.1 (Loopback) angeben.
Allerdings gebe ich für die SQL-Verbindung zu AS/400
driver = com.ibm.as400.access.AS400JDBCDriver
url = jdbc:as400://MYSYS/MYLIB
an.
Ottersberg
16-04-08, 07:21
Die Verbindung zur AS/400 ist nicht das Problem. Ich habe übrigens den direkten Namen angegeben, damit das Programm ohne Änderungen notfalls auch auf anderen Systemen laufen könnte. Mit localhost geht das dann ja nicht.
Das Problem ist die Verbindung von der AS/400 zum MSSQL-Server, also über "com.microsoft.sqlserver.jdbc.SQLServerDriver".
Dort kommt obige Rückmeldung.
Es scheint so, als wenn die AS/400 sich mit diesem Systemnamen versucht beim SQL-Server anzumelden. Der Server versucht diesen Namen dann aufzulösen, kann das aber nicht, weil der Name so nicht per DNS auflösbar ist. Das ist jetzt ne Vermutung, dass das so abläuft. Gestern abend kam mir die Idee den Namen einfach mal in die lokale Host-Datei am Server einzutragen. Hat jetzt aber auch nicht den gewünschten Erfolg gebracht. Ich werd mal schauen ob ich was zu der englischen Variante des Fehlers finde. Zu Host nicht gefunden gibt es leider nichts.
Ottersberg
16-04-08, 07:48
Ich habe die Lösung gefunden. Wir brauchen dafür scheinbar auf jeden Fall einen DNS-Server auf der iSeries. Siehe: Re: Client "Host not found" (http://www.tech-archive.net/Archive/SQL-Server/microsoft.public.sqlserver.jdbcdriver/2006-03/msg00046.html)
Ich muss mal klären ob das gewünscht ist. In der Zwischenzeit probiere ich erstmal einen Nicht-MS-Treiber.
Ottersberg
16-04-08, 10:06
Ich habe jetzt mal den Treiber von jTDS (http://jtds.sourceforge.net/index.html) probiert. Mit diesem funktioniert die Verbindung.
Hallo,
ad java, javac, ...
- das steht in jeder Java Doku drin (Tooldocs)
- einen guten Einsteiger Kurs hier:
Java Einfuehrung - Kursunterlage (http://www.boku.ac.at/javaeinf/jein.html)
- soweit es As400 Spezifika gibt, findet man die hier:
http://publib.boulder.ibm.com/infocenter/iseries/v5r4/topic/rzaha/rzaha.pdf
ad oracle und co:
auch das ist kein Hexenwerk, was stimmen muss ist classpath, Treibername und url (und die Versionen von Treiber Datenbank und Java müssen passen).
Auch hierzu gibt es wie überall im Bereich Java massig Information (mit Tutorial und JDBC mr. Google fragen) und die Doku des Treibers enthält neben den Infos über url und Treibername auch elementare Beispiele.
Im übrigen ist es sinnvoll bei solchen Fragen ein wenig Code mit beizufügen, damit man sieht, wos klemmt.
mfg
Dieter Bender
Was classpath und die Standard Java-Programme angeht bin ich leider in der Tat nicht sehr bewandert...
Ziel dieser Aktion ist es Daten von der iSeries auf einen MSSQL-Server zu schreiben. Das Programm würde ich gerne auf der iSeries laufen lassen, weil die iSeries es dann immer ausführen kann, wenn sich am Datenbestand einer Tabelle etwas ändert. Soweit zumindest die Theorie von mir und unserem iSeries-Experten.
Werd ich gleich mal ausprobieren und berichten.