Domanda

Prima di tutto, io sto usando Oracle e JBoss 4.0.4 e io sono praticamente un principiante in materia di JBoss.

La nostra applicazione distribuita utilizza bean CMP con SimpleReadWrite ... ecc politiche di blocco, che mi hanno detto è sembrata la scelta migliore al momento. (Sviluppatori originali non sono più stanno lavorando con noi e non posso facilmente ottenere un feedback da loro, senza menzionare l'assoluta mancanza di documentazione).

La configurazione di riferimento è il seguente:

<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'applicazione è utilizzata tutti i giorni, compresi i fine settimana, dalle prime ore del mattino fino a 9-10 ore. A volte (per esempio una volta-due volte al mese) si ottiene questo tipo di errore:

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 tempi di transazione fuori e successivamente blocca ogni altra operazione, da ogni altro utente, sui tavoli bloccato. Ogni volta che questo accade, dobbiamo ripristinare i servizi o uccidere la sessione DB rinchiuso ... o sperare che il problema si risolve se stesso (a volte il blocco viene sollevato in una manciata di secondi).

Cosa potrebbe esserci di sbagliato? Una domanda più specifica è, perché la transazione scaduta finisce per bloccare la risorsa invece di essere annullate da una rollback in silenzio? Ogni aiuto è apprezzato.

È stato utile?

Soluzione

Questo sembra essere un bug in JBoss 4.0 .

Altri suggerimenti

Ho dimenticato di includere le parti rilevanti della configurazione originale:

<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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top