使用 SimpleReadWriteEJBLock 的锁定问题
首先,我使用的是 Oracle 和 JBoss 4.0.4,而且我在 JBoss 方面几乎是个新手。
我们的分布式应用程序使用 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...
事务超时,随后锁定锁定表上来自其他用户的所有其他事务。每次发生这种情况时,我们都必须重置服务或终止锁定的数据库会话......或者希望问题能够自行解决(有时锁定会在几秒钟内解除)。
可能出什么问题了?更具体的问题是,为什么超时事务最终会锁定资源而不是被悄悄回滚?任何帮助表示赞赏。
First of all, I am using Oracle and JBoss 4.0.4 and I'm pretty much a newbie on JBoss matters.
Our distributed application uses CMP beans with SimpleReadWrite... etc locking policy, which I'm told seemed the best choice at the time. (Original developers are no longer working with us and I can't easily get feedback from them, not mentioning the utter lack of documentation).
The relevant configuration is as follows:
<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>
The application is used every day, including weekends, from early in the morning until 9-10 pm. Sometimes (e.g. once-twice a month) we get this kind of error:
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 transaction times out and subsequently locks every other transaction, from every other user, on the locked out tables. Every time this happens we have to reset the services or kill the locked up DB session... or hope that the problem will solve itself (sometimes the lock is lifted in a matter of seconds).
What could be wrong? A more specific question is, why the timed out transaction ends up locking the resource instead of being quietly rollbacked? Any help is appreciated.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这看起来是jboss 4.0 中的一个错误。
This looks to be a bug in jboss 4.0.
我忘记包含原始配置中的相关部分:
I forgot to include the relevant parts from the original configuration: