2010-06-03 5 views
0

Nous avons un problème intermittent autour de la DB2 utilisé à partir d'un pool de connexion Glassfish. Qu'est-ce qui se passe est ce:Connexion pilote DB2 Suspendu dans Glassfish Connection Pool

Dans les situations où la base de données (DB2 sur ZOS) est sous tension, notre application (qui est une application multithread utilisant des connexions à DB2 via un pool de connexion Glassfish) cesse de faire quoi que ce soit.

Les éléments suivants sont observés:

1) En regardant le serveur en utilisant JConsole, on peut voir un thread en attente indéfiniment dans la méthode getConnection() du pilote DB2. Nous pouvons également voir qu'il a gagné un verrou sur un vecteur dans le pilote. Plusieurs autres threads appellent également la méthode getConnection() dans le pilote, et sont en attente de la libération du verrou sur le Vector.

2) En regardant la base de données elle-même, nous pouvons voir qu'il ya des connexions à partir du serveur Glassfish ouverts et en attente d'être utilisés. Il semble qu'il y ait une sorte de discordance entre le pool de connexions sur Glassfish et les connexions réellement ouvertes à DB2.

Quelqu'un at-il rencontré ce problème avant? Ou quelque chose de similaire? Si vous avez besoin de plus d'informations que je n'ai pas fournies, alors s'il vous plaît faites le moi savoir!

+0

Sons comme un problème de pilote interne. Exécutez-vous la dernière version de pilote d'IBM? –

+0

Nous utilisions le dernier pilote - iti est l'une des versions de pilotes qui causait des problèmes. Nous en essayons maintenant un beaucoup plus ancien, qui est la dernière version du pilote pour DB2 v8. Nous n'avons aucune preuve concluante que cela a déjà résolu le problème, mais il ne s'est pas arrêté depuis une semaine, alors c'est au moins quelque chose! –

Répondre

0

peut-être lié: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4263113

êtes-vous sur jdk1.5?


d'un blog:

En Java 1.5 et versions antérieures, toutes les méthodes sur java.sql.DriverManager sont synchronisés. Votre appel initial à DriverManager.getConnection (...) déclenche le démarrage de HA-JDBC. Lorsque HA-JDBC s'initialise, il appelle finalement DriverManager.getDriver (...) pour chaque URL de base de données de votre cluster. Les appels à DriverManager.getDriver (...) se produisent dans un thread différent de votre thread d'application, d'où le blocage.

Il y a au moins 2 solutions de contournement pour ce problème:

  • Mise à jour vers Java 1.6. Après avoir toujours insisté sur le fait que la synchronisation globale de java.sql.DriverManager n'était pas un défaut, Sun l'a silencieusement corrigé dans Java 1.6. Plutôt que d'utiliser DriverManager.getConnection (...) pour obtenir des connexions, utilisez DriverManager.getDriver (...). Connect (...) à la place. (0) Cela contourner l'impasse depuis DriverManager.getDriver (...) ne déclenche pas le démarrage HA-JDBC et Driver.connect (...) ne sont pas synchronisées.

+0

Non - nous utilisons déjà jdk1.6. Merci quand même. –