2012-11-02 115 views
0

我需要一些幫助來更新使用沙發數據庫。我在我的頁面上有一項任務。如果用戶點擊類似的,那麼應該在我的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此更新?請幫助我..

回答

3

您看到的延遲可能是由於您爲每次點擊創建了兩個CouchbaseClient實例。由於發生引導和配置設置,創建CouchbaseClient的實例是一項昂貴的操作。

您可以採取幾種不同的方法來最小化創建CouchbaseClient實例的頻率。一種方法是創建一個靜態客戶端,並由您的數據訪問類重用。 Web應用的另一種方法是將實例與HttpApplication實例相關聯。有關Web方法的示例,請參閱下面的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); 
    } 
} 
+0

results.Cas = getResult.Cas; 這裏result.Cas是不可訪問的,因爲它被鑄造爲 ... – Xavier

+0

正確 - 我在代碼片段中有一條評論,提示您必須添加一個Cas屬性或一些其他機制(out參數或Tuple可能?)通過Cas。 –