首页 > 解决方案 > 如何锁定 couchbase 数据库中的文档并处理 TemporaryLockFailureException

问题描述

我将Playframework( scalaVersion 2.12.4) 与Java 1.8( Couchbase)一起使用Couchbase java-client 2.4.2。我正在获取UserDetails文档并更新数据库中的相同文档。

@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();
}

标签: javaexceptionplayframeworklockingcouchbase

解决方案


推荐阅读