GVKun编程网logo

JPA:用于处理OptimisticLockException的模式(jpa问题)

26

如果您想了解JPA:用于处理OptimisticLockException的模式的相关知识,那么本文是一篇不可错过的文章,我们将对jpa问题进行全面详尽的解释,并且为您提供关于activiti6乐观锁

如果您想了解JPA:用于处理OptimisticLockException的模式的相关知识,那么本文是一篇不可错过的文章,我们将对jpa问题进行全面详尽的解释,并且为您提供关于activiti6 乐观锁问题 org.activiti.engine.ActivitiOptimisticLockingException、Azure Cosmos DB - 间歇性 MongoConnectionException / IOException / SocketException、Error: java.io.IOException: org.apache.hadoop.hdfs.BlockMissingException: Could not obtain block、java – OptimisticLockException与Ebean / Play的有价值的信息。

本文目录一览:

JPA:用于处理OptimisticLockException的模式(jpa问题)

JPA:用于处理OptimisticLockException的模式(jpa问题)

在(REST)Web服务中处理OLE的正确模式是什么?例如,这就是我现在正在做的

protected void doDelete(HttpServletRequest request, HttpServletResponse response)        throws ServletException, IOException {    ...    ...    ...    try {        try {            em.getTransaction().begin();            // ... remove the entity            em.getTransaction().commit();        } catch (RollbackException e) {            if (e.getCause() instanceof OptimisticLockException) {                try {                    CLog.e("optimistic lock exception, waiting to retry ...");                    Thread.sleep(1000);                } catch (InterruptedException ex) {                }                doDelete(request, response);                return;            }        }        // ... write response    } catch (NoResultException e) {        response.sendError(HttpServletResponse.SC_NOT_FOUND, e.getMessage());        return;    } finally {        em.close();    }}

每当您在代码中看到睡眠时,很可能这是不正确的。有没有更好的方法来解决这个问题?

另一种方法是立即将故障发送回客户端,但我宁愿不要让他们为此担心。正确的事情似乎可以完成使请求在服务器上成功执行的所有操作,即使它需要一段时间。

谢谢。

答案1

小编典典

如果收到乐观的锁定异常,则意味着其他某个事务已将更改 提交 给您尝试更新/删除的实体。由于其他事务已提交,因此立即重试可能会成功。

我还会使方法在N次尝试后失败,而不是等待StackOverflowException发生。

activiti6 乐观锁问题 org.activiti.engine.ActivitiOptimisticLockingException

activiti6 乐观锁问题 org.activiti.engine.ActivitiOptimisticLockingException

activiti6 乐观锁问题 org.activiti.engine.ActivitiOptimisticLockingException

  • 使用identityService.saveUser()添加用户时出现以下问题:
org.activiti.engine.ActivitiOptimisticLockingException: org.activiti.engine.impl.persistence.entity.UserEntityImpl@10718783 was updated by another transaction concurrently
  • 出现问题的代码
    public void addUser(User user) {
	// todo ...
        identityService.saveUser(user);
    }
  • 解决方法
    添加用户分两步操作:
    1. 先调用identityService.newUser()传入userId得到user
    2. 再调用 identityService.saveUser(),向数据库中添加数据
  • 解决问题之后的代码
    public void addUser(User user, String systemId) {
        User userEntity = identityService.newUser(user.getId()));
        generalUser(userEntity, user);
        identityService.saveUser(userEntity);
    }
    
    //处理数据
    private void generalUser(User userEntity, User user){
        userEntity.setFirstName(user.getFirstName());
        userEntity.setLastName(user.getLastName());
        userEntity.setEmail(user.getEmail());
        userEntity.setPassword(user.getPassword());
    }
  • 添加其他数据时也可能出现这种情况,比如添加用户组数据,解决方法如上一致

Azure Cosmos DB - 间歇性 MongoConnectionException / IOException / SocketException

Azure Cosmos DB - 间歇性 MongoConnectionException / IOException / SocketException

如何解决Azure Cosmos DB - 间歇性 MongoConnectionException / IOException / SocketException?

我将 Azure Cosmos DB 4.0 与 MongoDB C# 驱动程序 2.10.4 结合使用。

大多数时候查询工作正常,但我遇到了这样的间歇性错误:

MongoDB.Driver.MongoConnectionException:向服务器发送消息时发生异常。 System.IO.IOException:无法将数据写入传输连接:远程主机强行关闭了现有连接。 System.Net.sockets.socketException: 一个现有的连接被远程主机强行关闭 在 System.Net.sockets.socket.BeginSend(... 在 System.Net.sockets.NetworkStream.BeginWrite --- 内部异常堆栈跟踪结束 --- 在 System.Net.sockets.NetworkStream.BeginWrite 在 System.Net.Security._SslStream.StartWriting 在 System.Net.Security._SslStream.ProcessWrite 在 System.Net.Security._SslStream.BeginWrite

发生该错误时,调用需要 10-25 秒才能失败。

我正在使用 @H_301_9@new MongoClient(MongoClientSettings.FromConnectionString(cnstr)) 构建 MongoClient,并且我使用的是带有这些参数 @H_301_9@?ssl=true&replicaset=globaldb&retrywrites=false 的连接字符串。

我尝试使用 @H_301_9@retryWrites=true(根据 Azure 支持建议),但这没有帮助。

我尝试了不同的设置,但都不起作用(@H_301_9@connect=direct、@H_301_9@maxIdleTimeMS=30000、@H_301_9@serverSelectionTimeout=5000ms、@H_301_9@socketTimeout=10000ms)。

导致这些异常的原因是什么?

解决方法

修复是设置/强制使用 TLS 1.2(基于 this Microsoft document):

//return new MongoClient(connectionString);
var settings = MongoClientSettings.FromConnectionString(connectionString);
settings.SslSettings = new SslSettings()
{
    EnabledSslProtocols = System.Security.Authentication.SslProtocols.Tls12
};
return new MongoClient(settings);

看起来虽然我的连接字符串有 ssl=true,但在某些服务器上还不够(错误是间歇性的)。 forcing TLS 1.2 通常可以修复相同的潜在错误,因此我认为在 Mongo 中它可能是相同的问题 - 它确实解决了问题。

Error: java.io.IOException: org.apache.hadoop.hdfs.BlockMissingException: Could not obtain block

Error: java.io.IOException: org.apache.hadoop.hdfs.BlockMissingException: Could not obtain block

在Hive命令行执行查询时,出现错误

Error: java.io.IOException: org.apache.hadoop.hdfs.BlockMissingException: Could not obtain block: BP-787476470-192.168.152.10-1573351961380:blk_1073742171_1347 file=/user/hive/warehouse/db_hive.db/emp/emp.txt (state=,code=0)
根据信息得知是无法找到数据块,登陆webUI监控界面,master:50070,发现只有一个DataNode slave2, slave1没有启动。

cd到slave1的sbin/目录下,手动启动DataNode,刷新监控界面,slave1的datanode已经启动了,Hive查询也不再报错。

[root@slave1 sbin]# ./hadoop-daemon.sh start datanode

 

 

 

在HDFS中,提供了fsck命令,用于检查HDFS上文件和目录的健康状态、获取文件的block信息和位置信息等。
fsck命令必须由HDFS超级用户来执行,普通用户无权限。

查看文件中损坏的块(-list-corruptfileblocks)
[root@master sbin]$ hdfs fsck / -list-corruptfileblocks

将损坏的文件移动至/lost+found目录(-move)
[root@master sbin]$ hdfs fsck / -move

删除损坏的文件(-delete)
[root@master sbin]$ hdfs fsck / -delete

检查并列出所有文件状态(-files)
[root@master sbin]$ hdfs fsck / -files

查看dfs块的报告

[root@master sbin]$ hdfs dfsadmin -report

 

 

java – OptimisticLockException与Ebean / Play

java – OptimisticLockException与Ebean / Play

我有一个Play 2.1.3 Java应用程序使用Ebean.我在下面得到了OptimisticLockException.
[OptimisticLockException: Data has changed. updated [0] rows sql[update person 
set name=? where id=? and email=? and name=? and password is null and created=? 
and deleted is null] bind[null]]

我明白,这是试图告诉我,当我阅读它和我试图写它之间的记录已经改变了.但是,这种方法中唯一的变化是发生.

public void updateFromForm(Map<String,String[]> form) throws Exception {
    this.name = form.get("name")[0];

    String password = form.get("password")[0];
    if (password != null && password.length() != 0) {
        String hash = Password.getSaltedHash(password);
        this.password = hash;
    }

    this.update();
}

我这样做错了吗?我在zentasks中看到类似的逻辑.另外,我可以看到绑定变量的值吗?

更新:我从控制器内部调用updateFromForm():

@RequiresAuthentication(clientName = "FormClient")
public static Result updateProfile() throws Exception {

    final CommonProfile profile = getUserProfile();
    String email = getEmail(profile);           
    Person p = Person.find.where().eq("email",email).findList().get(0);

    Map<String,String[]> form = request().body().asFormUrlEncoded();

    if (p == null) {
        Person.createFromForm(form);
    } else {
        p.updateFromForm(form);
    }

    return ok("HI");
}

解决方法

有点晚,但是对于你的案例,@Version注释应该是解决方案.我们主要使用java.util.Date,所以它也可以用于确定上一次记录更新的日期,在Play模型中只是:
@Version
public java.util.Date version;

在这种情况下,更新语句将仅使用id和版本字段完成 – 特别是在使用大型模型时尤其有用:

update person set name='Bob' 
where id=1 and version='2014-03-03 22:07:35';

注意:您不需要/应该在每次保存时手动更新此字段,Ebean本身就可以.版本值更改只有当有更新的数据(所以使用obj.update(),其中没有更改不更新版本字段)

关于JPA:用于处理OptimisticLockException的模式jpa问题的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于activiti6 乐观锁问题 org.activiti.engine.ActivitiOptimisticLockingException、Azure Cosmos DB - 间歇性 MongoConnectionException / IOException / SocketException、Error: java.io.IOException: org.apache.hadoop.hdfs.BlockMissingException: Could not obtain block、java – OptimisticLockException与Ebean / Play等相关知识的信息别忘了在本站进行查找喔。

本文标签: