Question

Tout d'abord, j'utilise Oracle et JBoss 4.0.4 et je suis à peu près un débutant sur les questions JBoss.

Notre application distribuée utilise beans CMP avec SimpleReadWrite ... etc politique de verrouillage, qui me dit semblait le meilleur choix à l'époque. (Développeurs originaux ne fonctionnent plus avec nous et je ne peux pas facilement obtenir des commentaires de leur part, de ne pas mentionner l'absence totale de documentation).

La configuration pertinente est la suivante:

<container-configuration extends="Standard CMP 2.x EntityBean with cache invalidation">
  <container-name>Standard CMP 2.x EntityBean</container-name>
  <locking-policy>org.jboss.ejb.plugins.lock.SimpleReadWriteEJBLock</locking-policy>
  <container-cache-conf>
    <cache-policy>org.jboss.ejb.plugins.LRUEnterpriseContextCachePolicy</cache-policy>
    <cache-policy-conf>
      <min-capacity>150</min-capacity>
      <max-capacity>1000000</max-capacity>
      <overager-period>600</overager-period>
      <max-bean-age>1800</max-bean-age>
      <resizer-period>400</resizer-period>
      <max-cache-miss-period>60</max-cache-miss-period>
      <min-cache-miss-period>1</min-cache-miss-period>
      <cache-load-factor>0.75</cache-load-factor>
    </cache-policy-conf>
  </container-cache-conf>
  <container-pool-conf>
    <MaximumSize>1000</MaximumSize>
  </container-pool-conf>
  <cache-invalidation>true</cache-invalidation>
</container-configuration>

L'application est utilisée tous les jours, y compris les fins de semaine, tôt le matin jusqu'à 9-10 heures. Parfois (par exemple une fois deux fois par mois), nous obtenons ce genre d'erreur:

2010-01-25 13:41:10,567 WARN  [org.jboss.tm.TransactionImpl] Transaction TransactionImpl:XidImpl[FormatId=257, GlobalId=anemosa1/3531484, BranchQual=, localId=3531484] timed out. status=STATUS_ACTIVE
2010-01-25 13:41:14,225 ERROR [org.jboss.ejb.plugins.LogInterceptor] TransactionRolledbackLocalException in method: public abstract java.lang.Long org.anemos.ejb.dictionary.LongId.getId(), causedBy:
javax.ejb.EJBException: Transaction marked for rollback - probably a timeout.
 at org.jboss.ejb.plugins.lock.SimpleReadWriteEJBLock.checkTransaction(SimpleReadWriteEJBLock.java:340)
 at org.jboss.ejb.plugins.lock.SimpleReadWriteEJBLock.waitAWhile(SimpleReadWriteEJBLock.java:219)
 at org.jboss.ejb.plugins.lock.SimpleReadWriteEJBLock.getReadLock(SimpleReadWriteEJBLock.java:153)
...many more lines...

A temps de transaction sur et par la suite verrouille toutes les autres transactions, de tous les autres utilisateurs, sur les tables en lock-out. Chaque fois que cela arrive, nous devons rétablir les services ou tuer enfermé DB session ... ou dans l'espoir que le problème va se résoudre (parfois le verrou est soulevé en quelques secondes).

Qu'est-ce qui pourrait être erroné? Une question plus précise est, pourquoi la transaction expiré finit par bloquer la ressource au lieu d'être tranquillement rollbacked? Toute aide est appréciée.

Était-ce utile?

La solution

Cela semble être un bogue dans jboss 4.0 .

Autres conseils

J'ai oublié d'inclure les parties pertinentes de la configuration d'origine:

<container-configuration>
  <container-name>Standard CMP 2.x EntityBean with cache invalidation</container-name>
  <call-logging>false</call-logging>
  <invoker-proxy-binding-name>entity-rmi-invoker</invoker-proxy-binding-name>
  <container-interceptors>
        ...      
  </container-interceptors>
  <instance-pool>org.jboss.ejb.plugins.EntityInstancePool</instance-pool>
  <instance-cache>org.jboss.ejb.plugins.InvalidableEntityInstanceCache</instance-cache>
  <persistence-manager>org.jboss.ejb.plugins.cmp.jdbc.JDBCStoreManager</persistence-manager>
  <locking-policy>org.jboss.ejb.plugins.lock.QueuedPessimisticEJBLock</locking-policy>
  <container-cache-conf>
        ...      
  </container-cache-conf>
  <container-pool-conf>
    <MaximumSize>100</MaximumSize>
  </container-pool-conf>
  <commit-option>A</commit-option>
</container-configuration>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top