Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何处理javax.persistence.OptimisticLockException?_Java_Jpa_Concurrency_Ejb 3.0_Eclipselink - Fatal编程技术网

如何处理javax.persistence.OptimisticLockException?

如何处理javax.persistence.OptimisticLockException?,java,jpa,concurrency,ejb-3.0,eclipselink,Java,Jpa,Concurrency,Ejb 3.0,Eclipselink,我是JPA的新手,如果不清楚,请原谅我 基本上,我希望通过使用乐观锁定来防止并发修改。 我已将@Version属性添加到实体类中 我需要知道这个处理OptimisticLockException的算法是否正确。 我将使用类似的方法: 我的问题是,你如何决定何时停止重试 我的问题是,你如何决定何时停止重试 在我看来,在同一时间修改同一对象是一种例外情况时,应该使用乐观锁定 现在,如果出现这种情况,并且过程是手动的,我会警告用户修改无法保存,并要求用户再次保存更改 如果流程是自动化的,那么实现自动重

我是JPA的新手,如果不清楚,请原谅我

基本上,我希望通过使用乐观锁定来防止并发修改。 我已将@Version属性添加到实体类中

我需要知道这个处理OptimisticLockException的算法是否正确。 我将使用类似的方法:

我的问题是,你如何决定何时停止重试

我的问题是,你如何决定何时停止重试

在我看来,在同一时间修改同一对象是一种例外情况时,应该使用乐观锁定

现在,如果出现这种情况,并且过程是手动的,我会警告用户修改无法保存,并要求用户再次保存更改

如果流程是自动化的,那么实现自动重试机制是有意义的,但根据处理时间的不同,我不会重试超过3次或5次(我会使用递归调用来实现这一点)。如果一个自动化进程在并发访问问题上连续失败5次,那么它很可能与另一个自动化进程竞争,它们要么不处理独立的数据块(这不利于并行化),要么策略不正确。在这两种情况下,更多地重试并不是正确的解决方案

interface UpdateUnitOfWork 
{
    doUpdate( User user ); /* may throw javax.persistence.PersistenceException */
}

public boolean exec( EntityManager em, String userid, UpdateUnitOfWork work)
{
    User u = em.find( User, userid );
    if( u == null ) 
        return;

    try
    {
        work.doUpdate( u );
        return true;
    }
    catch( OptimisticLockException ole )
    {
        return false;
    }
}

public static void main(..) throws Exception
{
    EntityManagerFactory emf = ...;
    EntityManager em = null;

    try
    {
        em = emf.createEntityManager();

        UpdateUnitOfWork uow = new UpdateUnitOfWork() {
            public doUpdate( User user )
            {
                user.setAge( 34 );
            }
        };

        boolean success = exec( em, "petit", uow );
        if( success )
            return;

        // retry 2nd time
        success = exec( em, "petit", uow );
        if( success )
            return;

        // retry 3rd time
        success = exec( em, "petit", uow );
        if( success )
            return;
    }
    finally
    {
        em.close();
    }
}