如果您想了解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问题)
- 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问题)
在(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
- 使用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);
}
- 解决方法
添加用户分两步操作:- 先调用identityService.newUser()传入userId得到user
- 再调用 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 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
在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
[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等相关知识的信息别忘了在本站进行查找喔。
本文标签: