Nous avons une base de données dans Sybase, à laquelle nous accédons depuis un serveur Java."La procédure stockée 'xxx' peut être exécutée uniquement en mode transaction déchaînée." erreur lors de l'appel d'une procédure depuis un DataSource, dans un contexte EJB
L'accès à la base de données a été effectué directement via le pilote Sybase, en utilisant DriverManager
. Cela fonctionnait correctement, nous étions en mesure d'appeler nos procédures stockées.
Récemment, nous avons une migration vers un serveur d'application (sur JBoss 5), et les appels à la base de données sont maintenant faites par un connecteur JNDI, en utilisant un 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();
(Le DataSource est configuré en utilisant les paramètres de base, de la JBoss example)
Cependant, dans ce contexte, plusieurs procédures échouent, avec cette erreur:
"Stored procedure '**' may be run only in unchained transaction mode."
ou ce genre, dans d'autres cas (avec le changement de commande à défaut):
TRUNCATE TABLE command not allowed within multi-statement transaction
D'après ce que j'ai trouvé sur Internet, il ressemble à quelque chose dans le JBoss ou le connecteur est l'ouverture d'une transaction elle-même, ce qui provoque ces les erreurs. En tant que tel, les solutions diverses que j'ai pu trouver pour ces problèmes particuliers sont trop localisées, et cela semble être un problème plus important.
Y at-il un moyen d'empêcher ce comportement (en supposant que c'est le problème réel)?
mes connaissances dans ce domaine particulier est assez mince, cela est nouveau pour moi. En tant que tel, il y a probablement des détails importants qui manquent à cette description. S'il vous plaît indiquez moi comment je peux améliorer cette question, quels détails je peux ajouter, si nécessaire.
Qu'est-ce que vous utilisez pour la gestion des transactions? Je suppose que vous lancez un txn à partir d'un bean session sans état? Ce message se produit généralement à cause d'un tiers définissant une propriété auto-commit et/ou le paramètre SET CHAINED sur le DB –
@karianna - la source de données est initialisée dans une servlet init, et les appels après sont faits à partir de beans sans état. Je ne vois pas ce qui peut définir ces propriétés, c'est pourquoi j'ai supposé que c'était un paramètre dans JBoss. Je ne vois aucun autre "tiers" dans ce contexte. – Gnoupi
Je vous recommande fortement de modifier votre code/architecture afin qu'il puisse utiliser la puissance du pool de connexions de JBoss, des sources de données, etc. Le changement de code sera assez petit (c'est toujours une recherche JNDI) et vous pourrez définir si vous utilisez des sources de données XA, locales ou sans transaction à deux phases (vous les définissez dans le fichier * -ds.xml). Voir http://community.jboss.org/wiki/configdatasources pour un point de départ. Vous devrez probablement aussi (par l'intermédiaire des annotations EJB3 que je suppose) vous connecter au gestionnaire Txn de Jboss. –