2011-07-04 5 views
4

Je suis suivi cette erreur depuis un moment maintenant, il se passe sur une base irrégulière imprévisible et je n'ai pas trouvé un moyen de le reproduire pour le moment.java.sql.SQLException: impossible d'obtenir le verrouillage en 60 secondes

Notre environnement

  • CentOS Linux 5.3 Abritant l'un jboss 5.1 application serveur
  • CentOS Linux 5.3 Abritant l'un oracle 10g XE db
  • windows server 2003 R2 hébergeant un autre oracle 10g XE db

Environnement de programmation

  • couture 2.1
  • veille prolongée
  • JSF 1,2

La plupart de ces erreurs se produit sur une "application" composante de couture de portée, mais il a également arrivé elswhere.

Wea utilise la source de données XA pour accéder aux bases de données.

Il apparaît que c'est aussi une sorte de bogue dans jboss 5.1 look here, mais nous n'avons pas de requêtes ou de requêtes qui durent 60 secondes.

Quelle pourrait être la cause de ce genre d'erreur?

La pile finale trace de l'erreur:

Caused by: java.sql.SQLException: Unable to obtain lock in 60 seconds: [email protected] 
    at org.jboss.resource.adapter.jdbc.BaseWrapperManagedConnection.tryLock(BaseWrapperManagedConnection.java:267) 
    at org.jboss.resource.adapter.jdbc.WrappedConnection.lock(WrappedConnection.java:79) 
    at org.jboss.resource.adapter.jdbc.WrappedConnection.prepareStatement(WrappedConnection.java:237) 
    at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:534) 
    at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:452) 
    at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:161) 
    at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1573) 
    at org.hibernate.loader.Loader.doQuery(Loader.java:696) 
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259) 
    at org.hibernate.loader.Loader.doList(Loader.java:2228) 
+1

Utilisez-vous '@ Singleton' ou une autre annotation qui verrouille un composant? –

+0

Nous n'utilisons que des annotations de couture pour la portée (APPLICATION, SESSION) – simonC

Répondre

1

Il y a quelques trucs que vous pouvez faire dans votre fichier app-ds.xml. Si vous en avez un? Par exemple, si vous utilisez MySQL, vous pouvez écrire

<check-valid-connection-sql>SELECT 1</check-valid-connection-sql> 

Vous devriez également regarder dans le fichier de configuration de votre base de données, et peut-être que vous pouvez modifier certains paramètres là. Par exemple, wait_timeout, max_connections etc. Surtout vous pouvez envisager d'augmenter ce dernier. Peut-être que vous avez beaucoup de connexions SQL inactives qui ne font rien, et quand le groupe est atteint, il attendra que l'on soit atteint, et vous obtenez cette exception?

Rappelez-vous également que les composants étendus d'application sont thread-safe. Ainsi, assurez-vous de limiter autant que possible les composants et les composants de session ciblés par l'application. Il est préférable d'utiliser les composants de portée Événement et Conversation, le cas échéant.

+0

J'ai utilisé le dans la configuration de la piscine, mais sans résultat, l'erreur mentionnée est apparue. check-valid-connection-sql> parce que je pense que ce n'est pas optimal pour les environnements de production ... ce paramètre apporte-t-il des performances significatives? Dans la documentation, j'ai également remarqué le paramètre qui devrait valider la connexion lorsque la connexion est retirée du pool, mais elle est déjà activée par défaut. – simonC

+0

Nous avons aussi le max_connections fixé à 500 qui devrait être enouhg, et wait_timeout à 28800 qui devrait également être suffisant mybe il y a vraiment un problème dans les composants de l'application/session tronqué, nous n'en avons pas beaucoup, mais ils sont utilisé dans presque toutes les demandes. Comment puis-je tester si c'est un problème? – simonC

+1

Vous pouvez essayer d'utiliser JMeter http://jakarta.apache.org/jmeter/ et émettre beaucoup de requêtes. Il peut également y avoir d'autres choses que vous pouvez faire. Utiliser des usines et déballer, et moins d'état que possible. –

Questions connexes