1. Du schliesst zwar die dein Statement-Objekt und dein Resultset. Das eigentlich wichtige (connection) aber nicht. Mach am Ende connection.close(); Bei moderneren Treibern werden Statement und Resultset mitgeschlossen.
Hab das lange nicht mehr mit Domino gemacht. Es kann sein, dass du den DriverManager wg. irgendwelchen JDBC-Notes Security kommen sich in die Quere issues anders instantiieren mußt. Bin mir aber nicht so sicher, ob das noch gilt. Rose Kelleher hat damals darüber geschrieben.
( ;D : Das ist möglicherweise der originale Thread, in dem das Problem erstmals besprochen wurde:
http://www-10.lotus.com/ldd/46forum.nsf/0/9D47C1F9E82455F785256614001FDFF6?OpenDocument )
2. VERWENDE PreparedStatement und nicht Statement. Die Art wie du die Statements zusammenbastelst ist unsicher. Jemand könnte vielleicht sowas in das Feld param schreiben:
und tschüss"; delete from veryImportantTable
Mit PreparedStatement kann sowas nicht passieren.
Mach dir PreparedStatement zu einer Gewohnheit. Ist nicht so schwierig.
http://java.sun.com/docs/books/tutorial/jdbc/basics/prepared.html
3. Du solltest mit try-catch-try-catch arbeiten, wenn du schon mit raw JDBC hantierst (mit Notes gehen glaub ich andere Sachen gar nicht).
Bsp:
Connection connection = null;
try {
connection = deinZeugs
[...]
connection.close();
connection = null;
}
catch (SQLException sqle) {
try {
if (connection != null) connection.close();
} catch (SQLException sqle) {}
Wenn in dem Bereich wo die 3 Punkte sind ein Fehler auftritt, bleibt die Connection offen. Das ist nicht so gut.
Im übrigen könntest du dein SQLException Handling verbessern. Aber das schüttel ich auch nicht so einfach aus dem Ärmel. In SQLException stecken eine Menge weiterer Informationen wie allgemeiner oder Datenbankspezifischer SQL-Errorcode etc.
Denke, dass sich da noch einiges optimieren lässt.
Warum generierst du pro Dokument einen Remote Call gegen die DB?
In SQL gibt es sowas wie
where wert in (a, b, c, d, e);
Es dürfte performanter sein, dir ein Resultset zu holen und damit zu arbeiten.
oder so ähnlich.
Ich hab das noch nie so gesehen.
DriverManager
.registerDriver(new com.ibm.as400.access.AS400JDBCDriver());
Connection connection = DriverManager.getConnection("jdbc:as400://"
+ system, username, password);
Warum nicht einfach:
Driver drv = (Driver)Class.forName("com.imaginary.sql.msql.MsqlDriver").newInstance();
Connection connection = drv.getConnection("jdbc:as400://"
+ system, username, password);
[...]
Und unten vielleicht:
drv = null;
Diese Zeile ist auch überflüssig:
DatabaseMetaData dmd = connection.getMetaData();