Pergunta

Primeiro de tudo, estou usando o Oracle e o JBoss 4.0.4 e sou praticamente um novato em Jboss Matters.

Nosso aplicativo distribuído usa feijões CMP com a Política de bloqueio do SimpleReadWrite ... etc, que me disseram que parecia a melhor escolha na época. (Os desenvolvedores originais não estão mais trabalhando conosco e não consigo obter feedback facilmente deles, não mencionando a total falta de documentação).

A configuração relevante é a seguinte:

<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>

O aplicativo é usado todos os dias, incluindo fins de semana, desde o início da manhã até as 21h às 22h. Às vezes (por exemplo, uma vez por mês), recebemos esse tipo de erro:

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...

Uma transação se aproxima e, posteriormente, bloqueia todas as outras transações, de todos os outros usuários, nas tabelas bloqueadas. Toda vez que isso acontece, temos que redefinir os serviços ou matar a sessão de banco de dados trancada ... ou esperar que o problema se resolva (às vezes a fechadura é levantada em questão de segundos).

O que pode estar errado? Uma pergunta mais específica é: por que a transação cronometrada acaba bloqueando o recurso em vez de ser silenciosamente revertido? Qualquer ajuda é apreciada.

Foi útil?

Solução

Isso parece ser um bug no jboss 4.0.

Outras dicas

Esqueci de incluir as partes relevantes da configuração original:

<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>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top