Обновление в диване

Мне нужна помощь в обновлении с использованием couchbase. У меня есть задача на моей странице. Если пользователь нажимает кнопку "Мне нравится", то количество обновлений "Нравится" должно быть обновлено в моей корзине. Я пробовал свой собственный код обработчика обновлений, но это имеет некоторое время ожидания. Я включил мой код обновления тоже ниже.

Это мой код для задания...

public ResponseVO LikeTask(LikeVO likeVO)
        {
            ResponseVO response = new ResponseVO();

            try
            {
                if (!isLiked(likeVO.TaskID, likeVO.UserID))
                {

                    UpdateTaskDB likeUpdate = new UpdateTaskDB();

                    UpdateTaskVO updatetaskvo = new UpdateTaskVO();
                    updatetaskvo.FieldName = "Likes";
                    LikeVO tempvo = new LikeVO();
                    tempvo.LikedOn = DateTime.Now.ToString();
                    tempvo.UserID = likeVO.UserID;
                    tempvo.UserName = likeVO.UserName;
                    tempvo.TaskID = likeVO.TaskID;
                    updatetaskvo.ObjectValue = tempvo;
                    updatetaskvo.TaskID = likeVO.TaskID;
                    likeUpdate.UpdateDocument(updatetaskvo);
              }
                response.StatusMessage = "Liked Successfully";
            }
            catch (Exception ex)
            {
                response.StatusCode = "0";
                response.StatusMessage = ex.Message;
            }

            return response;
        }

Мой собственный код обработчика обновлений:

 public class UpdateTaskDB
    {
        CouchbaseClient oCouchbase;
        public UpdateTaskDB()
        {
            oCouchbase = new CouchbaseClient("vwspace", "");
        }
        public TaskVO GetTaskByID(string task_id)
        {

            TaskVO results = null;
            try
            {
                String str1;

                str1 = (String)oCouchbase.Get(task_id);

                results = JsonConvert.DeserializeObject<TaskVO>(str1);
            }
            catch (Exception ex)
            {

            }
            return results;
        }

        public void UpdateDocument(UpdateTaskVO inputParams)
        {
            try
            {
                var client = new CouchbaseClient("vwspace", "");
                TaskVO taskDoc = GetTaskByID(inputParams.TaskID);

                switch (inputParams.FieldName)
                {
                    case "Likes":
                        List<LikeVO> docLikes = taskDoc.likes;
                        docLikes.Add((LikeVO)inputParams.ObjectValue);
                        taskDoc.likes = docLikes;
                        break;
                    case "UnLike":
                        LikeVO unlikevo = (LikeVO)inputParams.ObjectValue;
                        for (int count = 0; count < taskDoc.likes.Count; count++)
                        {
                            if (taskDoc.likes[count].UserID.Equals(unlikevo.UserID))
                            {
                                unlikevo = taskDoc.likes[count];
                                break;
                            }
                        }
                        taskDoc.likes.Remove(unlikevo);
                        break;

                    default:
                        break;
                }

                String json = JsonConvert.SerializeObject(taskDoc);
                client.Store(StoreMode.Set, inputParams.TaskID, json);

            }
            catch (Exception ex)
            {
                Console.Write("Exception :" + ex.Message);
            }
        }
    }

Есть ли другой способ справиться с этим обновлением в couchbase? Пожалуйста, помогите мне..

1 ответ

Задержка, которую вы видите, вероятно, связана с тем, что вы создаете два экземпляра CouchbaseClient для каждого клика. Создание экземпляра CouchbaseClient является дорогостоящей операцией из-за начальной загрузки и настройки конфигурации, которая имеет место.

Есть несколько разных подходов, которые вы можете использовать, чтобы минимизировать частоту создания экземпляров CouchbaseClient. Один из них - создать статический клиент, который будет повторно использоваться вашими классами доступа к данным. Другой подход для веб-приложений - связать экземпляры с экземплярами HttpApplication. Пример веб-подхода см. В моем (неполном) примере проекта на GitHub ниже.

https://github.com/jzablocki/couchbase-beer.net/blob/master/src/CouchbaseBeersWeb/Models/WebRepositoryBase%271.cs

Кроме того, я бы предложил использовать операции CAS при обновлении количества слов в документе. Вы хотите удостовериться, что голос "как" не приводит к обновлению всего документа из устаревшего чтения.

Например:

public TaskVO GetTaskByID(string task_id)
{
    var getResult = oCouchbase.ExecuteGet<string>(task_id);   
    var results = JsonConvert.DeserializeObject<TaskVO>(str1.Value);
    results.Cas = getResult.Cas; //Here I'm suggesting adding a Cas property to your TaskVO
    return results;
}

Тогда в вашем обновлении:

public void UpdateDocument(UpdateTaskVO inputParams)
{
    try
    {
        TaskVO taskDoc = GetTaskByID(inputParams.TaskID);

        switch (inputParams.FieldName)
        {
            ...
        }        

        String json = JsonConvert.SerializeObject(taskDoc);
        client.ExecuteStore(StoreMode.Set, inputParams.TaskID, json, taskDoc.Cas); 
        //this will fail if the document has been updated by another user.  You could use a retry strategy    
    }
    catch (Exception ex)
    {
        Console.Write("Exception :" + ex.Message);
    }
}
Другие вопросы по тегам