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

Windows-Authentizierung mit jTDS läuft nur ein Mal

(1/2) > >>

Mark³:
Ich importiere mit einem Java-Agenten Daten aus einer MS SQL 2000-Datenbank in eine Notes-DB. Der Notes-Server läuft unter einem Windows-User, der Zugriff auf die SQL-DB hat. Als Treiber nutze ich die aktuelle Version von jTDS. Dort ist die Windows-Authentizierung mittels der Datei ntlmauth.dll enthalten. Der Pfad zu dieser Datei (c:\winnt\system32) ist in der PATH-Variablen drin.
Wenn ich den Agenten nun auf dem Server laufen lasse funktioniert beim ersten Lauf alles. Alle weiteren Läufe bringen folgende Fehlermeldung:

--- Zitat ---java.sql.SQLException: I/O Error: SSO Failed: Native SSPI library not loaded. Check the java.library.path system property.
--- Ende Zitat ---

Ursache dafür ist eigentlich, dass die dll nicht gefunden wird. Auf meinem Client habe ich das gleiche Problem, beim ersten Mal läuft das, alle weiteren Male nicht. Ich habe versucht, die dll mit regsvr32 zu registrieren, dabei kommt aber eine Fehlermeldung (siehe Bild).

Wie kann ich die dll registrieren ohne Fehler? Oder liegt die Ursache noch woanders, da es ja einmal läuft? PView habe ich nicht, habe aber den ProcessExplorer genommen, die dll ist nicht im Zugriff.

flaite:
Kannst du bitte mal den Source Code posten, mit dem du den JDBC Treiber initialisierst.
Es könnte ganz einfach daran liegen.
Diese Art funktioniert afaik:

--- Code: ---Driver drv = (Driver) Class.forName("postgresql.Driver").newInstance();

--- Ende Code ---
Oft wird der JDBC Treiber in Beispielcode anders initialisiert.

--- Code: ---Class.forName("postgresql.Driver");

--- Ende Code ---
wenn mich nicht alles täuscht.
Lange kein low level JDBC mehr benutzt.

Jedoch gibt es in einem posgres-Forum eine ähnliche Meldung, die mich überrascht:
http://archives.postgresql.org/pgsql-jdbc/2001-11/msg00225.php


qojote:
Hi,

läuft der Agent sauber durch ?
Ich hatte vor kurzem ein ähnliches Problem wo ich mir Laufwerke über jcifs gemappt habe.
Da hatte ich das Problem das der agent immer am ende ein Problem beim beenden der Threads hatte Error cleaning up Agent Threads und dann ging das auch immer nur genau einmal.

Gruß
Qojote

Mark³:
das ist zwar ein gutes Forum hier, aber solch spezielle Sachen sucht man natürlich besser im zugehörigen Forum. Aber einige Java-Freaks finden das ja vielleicht interessant. Es scheint eingrundsätzliches Problem mit dem Laden von DLLs zu geben:

http://sourceforge.net/forum/message.php?msg_id=3321709

Das ist wohl auch der Grund dafür dass Microsoft seinen neuesten Treiber nun doch ohne Windows Authentizierung rausgebracht hat (obwohl es vorher angekündigt war dass es drin ist). Die dll wird einmalig geladen als Singleton und kann scheinbar nicht wieder entladen werden, ausser bei Neustart der VM. Dies ist bei Notes-Agenten natürlich nicht so günstig, ich muss glaube ich den Notes-Server neu starten damit die VM neu startet. Ich könnte natürlich für meine Importe einen Java Servertask nehmen der bei Serverstart startet und immer läuft, das erscheint mir aber doch irgendwie unelegant. Also doch wieder Export / Import von csv mit Agenten (oder vielleicht ein ADODB Objekt in Lotusscript, hab ich auch mal benutzt aber die Programmierung davon im Notes Designer ist sehr umständlich). Schade, in Java ging das alles so schön leicht  :'(
Für LEI und sowas benötigt man doch eine Lizenz, oder? Sonst wäre das natürlich die ideale Anwendung dafür, aber Kosten darf das alles nix

Mark³:
trotzdem nochmal der Sourcecode:


--- Code: ---public class ImportSQL extends AgentBase {
private OpenLogItem oli;

private Session session;

private Database db;

private Statement qryStatement;

private Connection con;

public void NotesMain() {
oli = new OpenLogItem();
// oli.logEvent("Starting SQL import", OpenLogItem.SEVERITY_LOW, null);
session = getSession();

try {
AgentContext agentContext = session.getAgentContext();
Agent agent = agentContext.getCurrentAgent();
db = agentContext.getCurrentDatabase();
Document doc = db.getDocumentByID(agent.getParameterDocID());
if (doc != null) {
String dbServer = doc.getItemValueString("DBSERVER");
String dbName = doc.getItemValueString("DBNAME");
String query = doc.getItemValueString("QUERY");
String debug = doc.getItemValueString("DEBUG");
String connectionString = "jdbc:jtds:sqlserver://" + dbServer
+ ":1433/" + dbName;
if (debug.equalsIgnoreCase("true"))
oli.logEvent("Connection string = " + connectionString,
OpenLogItem.SEVERITY_LOW, null);
Class.forName("net.sourceforge.jtds.jdbc.Driver");
con = DriverManager.getConnection(connectionString);

createStatement();
ResultSet rs = getRows(query);

ResultSetMetaData rsmd = rs.getMetaData();
int i, n = rsmd.getColumnCount();

while (rs.next()) {
Document docCur = db.createDocument();
docCur.appendItemValue("Form", "SQLImport");
docCur.appendItemValue("Table", rsmd.getTableName(1));

for (i = 1; i <= n; i++) {

// Attention: first column with 1 instead of 0
docCur.appendItemValue(rsmd.getColumnName(i), rs
.getString(i));

}
docCur.save();
}
con.close();
doc.remove(true);
}
} catch (Exception e) {
oli.logError(e);
} finally {
con = null;
oli.recycle();
try {
session.recycle();
} catch (NotesException e) {
e.printStackTrace();
}
}

}

private void createStatement() {
try {
qryStatement = con.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
// qryStatement.setFetchSize(100);
} catch (SQLException e) {
oli.logError(e);
}

}

private ResultSet getRows(String sqlStatement) {
ResultSet rs = null;

try {
rs = qryStatement.executeQuery(sqlStatement);

} catch (SQLException e) {
oli.logError(e);
}
return rs;

}
}

--- Ende Code ---

Ja, die Error cleaning up agent threads bekomme ich auch oft (hier allerdings nicht  ;D)

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln