On Wed, 27 Apr 2011 20:48:51 +0200 Benjamin POUSSIN <poussin@codelutin.com> wrote:
Salut,
Lors de la mise en place de bow 0.5 on est tombé sur une erreur avec postgresql/dbcp. En gros le pool ferme la connexion puis l'enleve de son cache (WeakHashMap) or, pour cela il a besoin de calculer le hashCode de la connexion fermée qui contient alors null. Donc forcement on avait un NPE :(.
En changeant le driver jdbc et en prenant le dernier (9.0) le probleme est résolu.
Bon, apres avoir remis les transactions de wikitty au carre. On a toujours un probleme avec postgresql. Mais ca vient bien d'un probleme du driver postgresql. En gros, il surcharge comme il faut le hashCode mais il n'est pas synchro avec le equals, et vu qu'on recherche la connection dans une map, la connection est bien mise, mais pas retrouvé (et donc jamais supprimé -> memory leak :() En gros l'objet org.apache.commons.dbcp.managed.TransactionRegistry sert a faire le lien entre une connection et la XAResource. Mais on y arrive pas :( Donc exception comme quoi il n'y a pas de XAResource or ce n'est pas vrai :( Du cote driver postgresql l'erreur est dans le fichier sur le handler du proxy org.postgresql.xa.PGXAConnection On lui demande un equals, on lui passe les bons objets en parametre ('proxy' == args[0]) mais ce boulet au lieu d'appeler la methode sur 'proxy' il le fait sur 'con' (derniere ligne de code) et donc le equals retourne false au lieu de retourner true :( Donc en gros le couple dbcp/postgresql ca marche pas en XA :(. Je ne sais pas si on peut remplacer dbcp par autre chose ? Sinon peut-etre faire un ticket a postgresql, mais je ne sais pas pourquoi il utilise con au lieu de proxy ? Soit c une tres grosse erreur, soit il y a une raison, mais elle m'échappe. Et avec la tonne de delegator qui finissent sur des Proxy c pas simple de s'y retrouver :( public class PGXAConnection extends PGPooledConnection implements XAConnection, XAResource { ... private class ConnectionHandler implements InvocationHandler { private Connection con; public ConnectionHandler(Connection con) { this.con = con; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if (state != STATE_IDLE) { String methodName = method.getName(); if (methodName.equals("commit") || methodName.equals("rollback") || methodName.equals("setSavePoint") || (methodName.equals("setAutoCommit") && ((Boolean) args[0]).booleanValue())) { throw new PSQLException(GT.tr("Transaction control methods setAutoCommit(true), commit, rollback and setSavePoint not allowed while an XA transaction is active."), PSQLState.OBJECT_NOT_IN_STATE); } } return method.invoke(con, args); } } ... } ...
Si on met le XAResource a null, bow refonctionne ou vide.
Donc si on veut utiliser postgresql actuellement avec wikitty, il ne faut pas configurer le XA, sinon au mieux on a un memory leak au pire ca plante. (on l'inverse :)) Il faudrait faire le teste avec MySql voir si le driver est mieux fait. (On sait deja qu'avec h2 ca marche). -- Benjamin POUSSIN -------------------- tél: +33 (0) 2 40 50 29 28 email: poussin@codelutin.com http://www.codelutin.com