2011-03-28 47 views
6

嘿傢伙,3:36上午,我需要精神上的提升。使用ajax將正好100個值添加到數據庫中

簡單的問題,什麼是最簡單/最快的方式來添加100點到數據庫。請假設由於重複,錯誤的數據等原因,所有寫入都不起作用。

我試圖用100個值更新數據庫。

一旦我有一個很好的數據,我需要將它添加到數據庫,我使用一個名爲updateDB的函數。

該函數只是向數據庫寫入經緯度座標。如果有重複或寫入失敗,我發送來自php的「錯誤」,並且循環應該繼續收集數據,直到我完全有100個數據庫點。這是我正在使用的功能。

cct用於xss預防,請忽略它,這工作正常。

////more above this 
if(100-completed > dispatched) 
    dispatched++; 
    updateDB(lat,lng); 
/// more junk and then this function 
function updateDB(lat,lng) 
{ 
    var cct = $("input[name=csrf_mysite]").val(); 
    $.ajax({ 
     type: "POST", 
     url: "/form", 
     data: { 
      'lat': lat, 
      'lng': lng, 
      'id_set': id_set, 
      'csrf_complexity': cct }, 
     success: function(result) { 
      var obj = jQuery.parseJSON(result); 
      if(obj.status === "OK") 
      { 
       completed++; 
       var marker = new google.maps.Marker(
       { 
        icon: markerIcon, 
        position: new google.maps.LatLng(lat, lng), 
        map: map 
       }); 
       $("#progressbar").progressbar("option", { 
        value: completed, 
        max: 100 
       }); 
       $("#amount").text("Getting image " + completed + " of 100"); 
      } 
     }, 
     error: function(data){ 
      //alert(data.responseText); 
      }, 
     complete: function(data){ 
      if(completed == 100) 
       window.location = "/start/curate"; 
      dispatched--; 
     } 
    }); 
} 

此功能不起作用。那麼有什麼想法爲什麼

它應該很簡單。調用updateDB,直到它達到100個附加值,並且只有在不可能有​​額外的調用時才調用updateDB。調度不會正常遞減,所以我假設每個事件都不會調用complete。

想法?或者任何其他方式來做到這一點將是非常棒的。

回答

3

寫你的服務器端腳本來用數字迴應 - 然後在第一個請求,你發送100個數據點:

Browser    Server 
    |     | 
    |---> 100 data ---> | 
    |<- send 20 more <- | 
    |     | 
    |---> 20 data ---> | 
    |<- send 1 more <- | 
    |     | 
    |---> 1 data ---> | 
    |<- send 0 more <- | 
    |     | 
    v     v 

就像你沒有得到來自於計數的那種同步麻煩客戶端在服務器端處理了多少信息 - 服務器處理數據,排除重複信息,形成不良信息等,服務器計算所需的信息。

所有的客戶端所要做的就是發送一切,然後輪詢服務器以獲取更多所需。由於Ajax請求的開銷,您也希望一次發送多個點,但您不希望發送太多實際需要的內容,因爲這太浪費了。

希望這會有所幫助。

1

if(100-completed > dispatched)應該是:

while(100-completed > dispatched) 

假設完成是0開始。

+0

這將工作,如果這是同步的,但它不適用於異步進程。如果我已經完成了99次,它通常會有突出的線程。在頁面重定向時,通常它會完成2-3個線程,這意味着數據庫中有102-103個線程。 – 2011-03-28 08:06:36

+0

即時通訊不是很多的PHP/jQuery的人 - 是否有一些方法,你必須在實例化你的ajax請求後調用,如:begin_send()? – markmnl 2011-03-28 10:00:50

+0

當然你還需要一段時間,如果只評估一次 - 我已經更新了我的答案 – markmnl 2011-03-28 10:02:15

0

你要異步添加:根據你寫的成功/錯誤的方法假以您的通話阿賈克斯和遞增/遞減

如果你意爲這是一個連續的,迭代過程中,用戶一次輸入100個值,一旦它有100個值,程序就停止請求信息,您可能需要做一個簡單的檢查服務器端並以這種方式更新完成/分配的值。但是,在.ajax調用中設置async:false會阻止您,並在繼續前進之前等待呼叫的響應。

+0

對於我正在做的這個過程,這也很慢。關閉異步表示該頁面大約需要2分鐘才能添加100個點。在20秒內完成異步操作(但我有時會得到100-107個點) – 2011-03-28 08:17:56

+0

如果SELECT COUNT(*)FROM TABLE返回大於等於100的值,將在PHP中添加一個不允許插入值的簡單檢查? – 2011-03-28 08:33:27

4

爲什麼你沒有服務器代碼處理計數並只發送一個(或幾個)查詢?例如。首先構造一個100個數據點的數組,然後在一個查詢中將數據發送到服務器,然後讓它響應多少需要的數據,然後發回那麼多,並且再次執行它,直到獲得100個數。

如果獲取客戶端上的每條數據的開銷非常低,並且可以獲取不需要的數據,那麼請首先發送(比如說)110。有了一些關於故障率的知識,你應該能夠很容易地進行優化。

無論如何,你只能同時擁有(我相信)兩個同時異步查詢,所以這是異步或不同步的,這需要很長時間。我想不出有什麼理由不要儘可能將數據分組,並將查詢次數減少到1次或少數。即使您仍然在服務器上運行100個數據庫查詢,與HTTP帖子/響應的開銷相比,這樣做的時間並不重要。

+0

迄今爲止唯一合理的答案 – 2011-04-10 19:58:46

0

這很奇怪。我已經能夠在不到一秒的時間內加載大約1000個DB加載的地圖標記。

您應該加載所有100個服務器端並將它們添加到一個請求中。請求成本通常相當大(對於連接數據庫和加載一個項目這樣的簡單任務,可能需要花費70%的時間和30%的實際工作)。

0

也許這是我對JSON和序列化表單數據的個人喜愛,但是您是否想過在客戶端簡單地串行化數據包,發送數據並請求通過/失敗響應?

0

我想你在代碼中有一個錯誤,但我不確定它是否只是一個打字錯誤。

if(100-completed > dispatched) dispatched++; updateDB(lat,lng);

根據您的縮進你要調用updatedb的if子句中,而是讓你把它即使語句是真的還是假的,你沒有使用大括號。沒有這個bug,儘管如果你使用@jamietre建議的方法,你的實現會更好,你的代碼應該可以工作。

0

編輯:從來沒有這個答案,'if'語句中缺失的大括號把我扔掉了,updateDB只在100-completed > dispatched對嗎?

假設我理解你的問題,看起來它可能是一個計時問題。例如,當完成= 99時,updateDB函數可以在第一次執行成功回調之前調用4次,當完成時爲99,然後它仍然有3個排隊(取決於圍繞'if '聲明)。所以,它會變慢,但如果你能確保updateDB在'完成'回調(和/或成功/錯誤,如果你認爲完成沒有被每次調用)之前不被再次調用,那麼你認爲可能會修復它?
這是我想象的行的順序執行,如果你在兩行updateDB(lat,lng);completed++設置斷點:

  1. updatedb的(緯度,經度); (其中完成= 99)
  2. updateDB(lat,lng); (其中完成= 99)
  3. updateDB(lat,lng); (其中完成= 99)
  4. updateDB(lat,lng); (其中完成= 99)
  5. 完成++; (現在完成= 100,還有3個Ajax調用仍在執行)
  6. completed ++; (現在完成= 101)
  7. 已完成++; (現在完成= 102)
  8. 完成++; (現在已完成103例)

我的第一個想法是在完成回調添加一個標誌,像這樣:

完整:功能(數據){
ok_to_run_again_flag = TRUE;
派遣 - ;
if(completed == 100)
window.location =「/ start/curate」;
};

如果((100-完成>分派)& & ok_to_run_again_flag)
{
ok_to_run_again_flag = FALSE;
派遣++;
updateDB(lat,lng);
}

我也想知道爲什麼你說「調度不正確遞減」。與你所期待的相比,它的價值是什麼?