probleme de connexion postgresql et de tx
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. Mais ensuite il y avait des problemes d'autocommit qui n'etait pas a true (jamais detecté avec h2 qui doit sans doute par defaut donner des connexions avec autocommit false) En forceant dans la config le autocommit a false wikitty.storage.jdbc.xadatasource.org.postgresql.xa.PGXADataSource.defaultAutoCommit=false ca va mieux, mais j'en ai profite pour corriger dans wikitty pour qu'on check bien qu'on travail avec des connexion autocommit=false pour pouvoir faire des commit On va plus loin, mais on a encore une erreur :( Caused by: java.sql.SQLException: Connection does not have a registered XAResource jdbc:postgresql://localhost/bow?loginTimeout=0&socketTimeout=0&prepareThreshold=5&unknownLength=2147483647&loglevel=0&tcpkeepalive=false, UserName=dbuser, PostgreSQL Native Driver at org.apache.commons.dbcp.managed.TransactionRegistry.getXAResource(TransactionRegistry.java:78) at org.apache.commons.dbcp.managed.TransactionContext.setSharedConnection(TransactionContext.java:88) at org.apache.commons.dbcp.managed.ManagedConnection.updateTransactionStatus(ManagedConnection.java:131) at org.apache.commons.dbcp.managed.ManagedConnection.<init>(ManagedConnection.java:55) at org.apache.commons.dbcp.managed.ManagedDataSource.getConnection(ManagedDataSource.java:77) at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044) at org.nuiton.wikitty.jdbc.WikittyJDBCUtil.getConnection(WikittyJDBCUtil.java:299) Si on met le XAResource a null, bow refonctionne, mais le probleme est qu'il y a une valeur par defaut et qu'avec un fichier de config on peut pas mettre la valeur a null, mais a vide au mieux, et la encore il y a un bug dans wikitty (que j'ai corrigé) qui ne prenait pas en compte le vide :(. Donc avec la version actuelle stable de wikitty et bow ca ne pourra pas fonctionner avec postgresql. Et de toute facon il faut encore chercher le probleme de XAResource :( Je met en place, une version snapshot, en attendant de corriger le probleme pour que le service ne soit pas interrompu trop longtemps -- Benjamin POUSSIN -------------------- tél: +33 (0) 2 40 50 29 28 email: poussin@codelutin.com http://www.codelutin.com
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
participants (1)
-
Benjamin POUSSIN