Jpa 如何在JAX-RS中捕获OptimisticLockException并重试?

Jpa 如何在JAX-RS中捕获OptimisticLockException并重试?,jpa,ejb,Jpa,Ejb,我有一些JAX-RS资源,它们调用inject@EJB的方法 这些方法可以抛出乐观锁超时 重试时应捕获哪种类型的异常 javax.persistence.OptimisticLockException? javax.ejb.EJBException? class MyResource { @GET public Response doSomething() { for (int i = 0; i < 3; i++) {

我有一些JAX-RS资源,它们调用inject
@EJB
的方法

这些方法可以抛出乐观锁超时

重试时应捕获哪种类型的异常

javax.persistence.OptimisticLockException?

javax.ejb.EJBException?


class MyResource {

    @GET
    public Response doSomething() {
        for (int i = 0; i < 3; i++) {    
            try {
                myEJB.doSomething();
                break;
            } catch (????) {
                // I just want to know the exact type of Exception
                // for lock wait timeout
            }
        }
    }

    @EJB
    private MyEJB myEJB;
}

锁定等待超时
,这是一种
悲观锁定
。将支持的锁定模式设置为:

  • 悲观_READ-表示共享锁
  • 悲观_WRITE-表示独占锁
    LockTimeoutException

  • 一个EntityManager实例尝试执行
    悲观_读取
    锁定,另一个EntityManager持有
    悲观_写入
    锁定
  • 一个EntityManager实例尝试执行
    悲观主义_写入
    锁定,另一个EntityManager持有
    悲观主义_写入
    锁定或
    悲观主义_读取
    锁定
  • 您可以使用
    persistence.xml
    中的
    javax.persistence.lock.timeout
    配置超时毫秒数

    <properties>
       <property name="javax.persistence.lock.timeout" value="1000"/>
    </properties>
    
    
    
    更多参考


    我不确定您是否需要捕获
    OptimisticLockException
    。但是,如果您的实体使用了
    @Version
    注释,您肯定会得到
    OptimisticLockException

    您确定它是
    乐观锁定超时
    还是
    锁定超时
    ?你能发布原因堆栈跟踪吗?…实际上没有。一堆堆栈跟踪告诉
    超过了锁等待超时;尝试重新启动事务
    <properties>
       <property name="javax.persistence.lock.timeout" value="1000"/>
    </properties>