java - 如何锁定 couchbase 数据库中的文档并处理 TemporaryLockFailureException
问题描述
我将Playframework
( scalaVersion 2.12.4
) 与Java 1.8
( Couchbase
)一起使用Couchbase java-client 2.4.2
。我正在获取UserDetails
文档并更新数据库中的相同文档。
- 我的代码在正常情况下工作,无法测试冲突的边缘情况。因此,不确定我的代码是否有效。
- 如何处理
TemporaryLockFailureException
?我当前的异常处理似乎是错误的。
@Override
public void submitUsersDetails(DashboardRequest request) {
logger.debug("inside submitDashboardDetails");
CompletableFuture.runAsync(() -> {
try {
bucket = cluster.openBucket(config.getString(PctConstants.COUCHBASE_BUCKET_NAME),
config.getString(PctConstants.COUCHBASE_BUCKET_PASSWORD));
String documentID = PctConstants.USER_PROFILE;
JsonDocument retrievedJsonDocument = bucket.getAndLock(documentID, 5);
if (retrievedJsonDocument != null) {
JsonNode json = Json.parse(retrievedJsonDocument.content().toString());
UserDetails userDetails = Json.fromJson(json, UserDetails.class);
// UPDATING userDetails
JsonObject jsonObject = JsonObject.fromJson(Json.toJson(userDetails).toString());
bucket.replace(JsonDocument.create(documentID, jsonObject, retrievedJsonDocument.cas()));
logger.info("Successfully entered record into couchbase");
} else {
logger.error("Fetching User_details unsuccessful");
throw new DataNotFoundException("User_details data not found");
}
} catch (TemporaryLockFailureException e) {
try {
logger.debug("Inside lock failure **************************");
Thread.sleep(5000);
String documentID = PctConstants.USER_PROFILE;
JsonDocument retrievedJsonDocument = bucket.getAndLock(documentID, 5);
if (retrievedJsonDocument != null) {
JsonNode json = Json.parse(retrievedJsonDocument.content().toString());
UserDetails userDetails = Json.fromJson(json, UserDetails.class);
// UPDATING userDetails
JsonObject jsonObject = JsonObject.fromJson(Json.toJson(userDetails).toString());
bucket.replace(JsonDocument.create(documentID, jsonObject, retrievedJsonDocument.cas()));
logger.info("Successfully entered record into couchbase");
submitDashboardDetails(request);
} else {
logger.error("Fetching User_details unsuccessful");
throw new DataNotFoundException("User_details data not found");
}
} catch (InterruptedException e1) {
e1.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
try {
throw e;
} catch (Exception e1) {
e1.printStackTrace();
}
}
}, ec.current()).join();
}
解决方案
推荐阅读
- angular - Angular 7如何为dist中的图像指定文件夹
- python - 实现多对多回归任务
- rest - 如果后端离线,则不要提供静态文件
- java - 杰克逊自定义反序列化器在 Spring Boot 中不起作用
- spring-boot - 如何在 Spring Boot 中设置仅使用 jwt 令牌中的角色来允许访问的资源服务器?
- html - 如何减少下拉选项的高度?
- javascript - jQuery对另一个div中的列表数字值求和
- .net - Azure DevOps 构建工件未在 .Net Web 应用程序中生成
- python - 使用第二个矩阵将 3D 数组展平为 2D 数组以选择第三维中的元素
- graphdb - 在 GraphDB 中启用 Tomcat 访问日志记录