2011-04-14 41 views
0

我有兩種方法,首先我使用它來插入數據,其次獲取插入數據的當前計數。兩者都是WCF服務方法。 我需要在數據庫中插入批量記錄,所以並行我想檢查插入了多少記錄。爲此,我正在使用我的第二種方法。WCF的方法響應問題

但不幸的是,除非第一個過程給予迴應第二個不給予迴應。我想獨立執行這兩種方法。我正在使用啓用了Ajax的WCF服務。 我無法追蹤我的問題,請幫助我。

謝謝。

+0

您是否檢查過表鎖?我不認爲這是一個WCF問題。 – 2011-04-14 13:32:58

+0

我懷疑這不是一個WCF問題。您使用什麼方法插入批量記錄?你怎麼得到伯爵? – BrandonZeider 2011-04-14 13:34:03

+0

@Gerrie Schenck:我手動釋放數據庫表的鎖。 – Anvesh 2011-04-15 05:25:09

回答

1

你是從SQL Server中調用這個嗎?

爲什麼不只是在單獨的線程中運行批量更新,並且快速返回已經排隊並正在處理的批量更新。

我已經這樣做了,以防止使用太多的數據庫連接,我只是把數據放入一個隊列中,並且每隔10秒我就處理隊列中的任何內容。

然後你的第二個功能可以檢查狀態。

UPDATE:

我有一個靜態的類,它的處理,並且所述代碼是在末端。基本上,這個呼叫進來了,我立即返回,它成功地放入隊列。隊列只在後臺運行,每十秒鐘檢查一次,並處理其中的任何內容。

我爲我的隊列使用了一個ConcurrentQueue,以便我可以同時編寫和處理。

所以,你可以使用它來開始更新,然後另一個調用可以看到有多少個已經被處理並返回該信息。

public string[] UpdateJobs(Jobs[] jobs) 
    { 
     WebServiceControllerStatic.JobQueue = jobs; 
     WebServiceControllerStatic.ProcessUpdateJobQueue(); 
     List<String> s = new List<String>(); 
     for (int t = 0; t < jobs.Length; t++) 
     { 
      s.Add("Success"); 
     } 
     return s.ToArray(); 
    } 

這些都是WebServiceControllerStatic類:

public static Jobs[] JobQueue 
    { 
     set 
     { 
      try 
      { 
       value.AsParallel().ForAll(i => jobqueue.Enqueue(i)); 
      } 
      catch (Exception e) 
      { 
       writeToLog("..\r\n" + e.Message + "\r\n" + e.StackTrace); 
      } 
     } 
    } 

    public static void ProcessUpdateJobQueue() 
    { 
     Action UpdateJob =() => 
     { 
      if (jobqueue.IsEmpty) 
       return; 
      Parallel.For(0, jobqueue.Count, new ParallelOptions() { MaxDegreeOfParallelism = 1 }, 
       (j) => 
       { 
        // Do updates here 
       }); 
     }; 
     if (processUpdateJobThread == null) 
     { 
      processUpdateJobThread = new System.Threading.Thread(() => 
      { 
       while (true) 
       { 
        UpdateJob(); 
        System.Threading.Thread.Sleep(10000); 
       } 
      }); 
      processUpdateJobThread.Start(); 
     } 
    } 
+0

請您詳細說明您的答案? – Anvesh 2011-04-15 05:32:45

+0

感謝您的回覆。這是一個很好的解決方案,但我的問題現在已經解決我改變了調用方法的方式。 – Anvesh 2011-04-16 03:53:50

0

第二操作無法完成,直到第一個做,你可以爲每個大容量插入操作鍵和第二操作可使用該鍵可以獲取插入記錄的數量。

合同應該喜歡這樣:

Guild DoBulkInsert(string commands); 

int? GetCount(Guid bulkId); 
2

如果你的插入操作做IT方面在一個事務工作,那麼其他的操作不能看到新的記錄,直到交易完成。

如果你不介意結果不是100%準確和穩定的,你可以選擇運行select(second)操作在read uncomitted隔離級別。

如果這不可接受,您可以將進度寫入另一個表中,每隔幾行 - 在一個單獨的事務中(新的未嵌套的事務作用域) ,以便select操作可以讀取該進度。

0

@Menahem答案+1。

另外,您還應該考慮使用SqlBulkCopy而不是逐個插入它們。根據我的經驗,這將大大提高性能。

+0

是的,我知道,但我需要插入記錄在兩個不同的表中引用外鍵。 – Anvesh 2011-04-16 03:49:57