2010-01-25 65 views
1

首先,我使用的是Oracle和JBoss 4.0.4,我幾乎是JBoss上的新手。使用SimpleReadWriteEJBLock鎖定問題

我們的分佈式應用程序使用CMP Bean和SimpleReadWrite ...等鎖定策略,據我所知這是當時最好的選擇。 (原始開發人員不再與我們合作,我不能輕易從他們那裏獲得反饋,並沒有提到完全缺乏文檔)。

相關配置如下:

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

該應用程序每天都會用到,包括週末,從清晨到晚上9-10。有時(例如一次,每月兩次),我們得到這樣的錯誤:

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

事務超時,並隨後鎖定所有其他交易,從每一個其他用戶,在鎖定表。每次發生這種情況時,我們都必須重置服務或終止鎖定的數據庫會話......或者希望問題能夠自行解決(有時會在幾秒鐘內解除鎖定)。

什麼可能是錯的?更具體的問題是,爲什麼超時事務最終會鎖定資源而不是被安靜地回滾?任何幫助表示讚賞。

回答

0

我忘了,包括從原始配置的相關部分:

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