"Gespeicherte Prozedur 'xxx' kann nur in unchained transaction-Modus." angezeigt, wenn der Aufruf einer Prozedur aus einer DataSource, die in einem EJB-Kontext

Wir haben eine Datenbank in Sybase, das wir den Zugriff aus einem Java-server.

Zugriff auf die DB gemacht wurde, direkt durch die Sybase-Treiber, mit DriverManager. Es war richtig, wir waren in der Lage, unsere gespeicherten Prozeduren.

Kürzlich haben wir die Migration zu einem application server (JBoss 5), und die Aufrufe der Datenbank werden nun durch einen JNDI-Anschluss, der mit einem DataSource:

Properties ppt = new Properties();
ppt.put("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
ppt.put("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");
ppt.put("java.naming.provider.url", "jdbc/sybase");

InitialContext ctx = new InitialContext(ppt);
DataSource ds = (DataSource) ctx.lookup(AConfig.getInstance().getDatasourceJndiName());

Connection conn = ds.getConnection();

(Die DataSource konfiguriert ist, mit den Grundeinstellungen, aus der JBoss Beispiel)

Jedoch, in dieser Einstellung, mehrere Verfahren sind nicht mit diesem Fehler:

"Gespeicherte Prozedur" * * ' ausgeführt werden kann
nur in unchained Transaktion-Modus".

oder diese Art, auf andere Fälle (mit der fehlerhaften Befehl ändern):

TRUNCATE TABLE-Befehl nicht erlaubt
innerhalb von multi-statement transaction

Von dem, was ich gefunden im Internet, es sieht aus wie etwas in der JBoss oder der connector ist die Eröffnung einer Transaktion selbst, verursacht diese Fehler. Als solche, die vielfältigen Lösungen, die ich finden konnte, für diese speziellen Probleme zu lokalisieren, und wie es scheint, ein größeres Problem.

Gibt es eine Möglichkeit zu verhindern, dass dieses Verhalten (unter der Annahme, dass dies das eigentliche problem)?


Mein wissen in diesem Gebiet ist Recht Dünn, das ist mir neu. Als solche gibt es wahrscheinlich wichtige details fehlen, um diese Beschreibung. Bitte zeigen Sie mir, wie kann ich verbessern, diese Frage, welche Angaben kann ich noch hinzufügen, wenn nötig.

Was verwenden Sie für das Transaktions-management? Ich nehme an, Sie sind Initiierung einer Transaktion aus einer stateless session bean? Diese Meldung tritt in der Regel wegen einer Dritten Einstellung ein auto-commit-Eigenschaft und/oder der SET-VERKETTETE-Einstellung auf der DB
die datasource initialisiert wird, in ein init-servlet und ruft nach sind aus stateless beans in der Tat. Ich nicht sehen, aber was können diese Eigenschaften, das ist, warum ich davon ausgegangen, es war eine Einstellung in der JBoss. Ich sehe keine andere "Dritte Partei" in diesem Kontext.
Ich würde dringend empfehlen, verändern Sie Ihre code/Architektur, so dass Sie können nutzen Sie die macht der JBoss-connection-pooling -, Daten-Quellen, etc. Die eigentliche code-änderung relativ klein (es ist immer noch ein JNDI-lookup), und Sie werden in der Lage sein zu definieren, ob Sie mit 2-phase XA, lokale oder gar keine Transaktion datasources (definieren Sie diese in der *-ds.xml Datei). Siehe community.jboss.org/wiki/configdatasources für einen Ausgangspunkt. Sie wahrscheinlich auch müssen dann (via EJB3 annotations ich vermute) Haken in die Jboss - Txn-manager.
Sie zeigen mich in die richtige Richtung, danke. In der Tat, ein Teil des Problems ist, dass dies über die Portierung einer bestehenden Anwendung, mit einer Menge von business-code in Prozeduren. Transaktionen sind derzeit verwaltet die Verfahren direkt, das ist, warum mit local-tx ist nicht geeignet, Konflikte mit ihm. Der Wechsel zu no-tx (vorerst zumindest), scheint zu gehen in die richtige Richtung, aber einige Probleme bleiben. Ich werde aktualisieren, wenn ich etwas konkreteres zu schreiben.

InformationsquelleAutor Gnoupi | 2010-10-06

Schreibe einen Kommentar