2012-11-02 5 views
0

J'ai besoin d'aide dans la mise à jour en utilisant couchbase. J'ai une tâche sur ma page. Si l'utilisateur clique sur l'équivalent, le nombre de likes devrait être mis à jour dans mon compartiment couchbase. J'ai essayé mon propre code de gestionnaire de mise à jour mais cela a un certain temps de latence. J'ai inclus mon code de mise à jour ci-dessous.Mise à jour dans couchbase

Ceci est mon code pour aimer une tâche ...

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; 
     } 

Mon propre code de gestionnaire de mise à jour:

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

est-ther toute autre façon de gérer cette mise à jour Couchbase? Veuillez nous aider.

Répondre

3

La latence que vous voyez est probablement due au fait que vous créez deux instances de CouchbaseClient pour chaque clic. La création d'une instance d'un CouchbaseClient est une opération coûteuse, en raison de l'amorçage et de la configuration qui a lieu.

Vous pouvez prendre différentes approches pour réduire la fréquence à laquelle vous créez des instances CouchbaseClient. L'un serait de créer un client statique réutilisé par vos classes d'accès aux données. Une autre approche pour les applications Web consiste à associer des instances aux instances HttpApplication. Pour un exemple de l'approche Web, voir mon exemple de projet (incomplet) sur GitHub ci-dessous.

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

Aussi, je suggère d'utiliser des opérations de mise à jour CAS lors d'un décompte comme document. Vous voulez vous assurer qu'un vote "like" ne provoque pas la mise à jour du document entier à partir d'une lecture périmée.

Par exemple:

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; 
} 

ensuite sur votre mise à jour:

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); 
    } 
} 
+0

results.Cas = getResult.Cas; Voici les résultats.Cas n'est pas accessible car il a été casté à ... – Xavier

+0

Correct - J'ai un commentaire dans l'extrait de code suggérant que vous auriez à ajouter une propriété Cas ou un autre mécanisme (out paramètre ou Tuple peut-être?) Pour passer le Cas autour. –