简单的问题,向数据库添加100个点的最简单/最快的方法是什么。请假设由于重复,错误数据等原因,所有写入都不起作用。
我正在尝试使用100个值更新数据库。
一旦我有了一个好的数据,我需要将它添加到数据库中,并使用一个名为updateDB的函数。
此函数只是将lat / lng坐标写入数据库。如果有重复或写入失败,我从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。调度没有正确递减,所以我假设每次事件都没有调用完成。
想法?或者任何其他方式都可以做到这一点。
答案 0 :(得分:4)
为什么不让服务器代码处理计数并仅发送一个(或几个)查询?例如。首先构造一个包含100个数据点的数组,在一个查询中将数据发送到服务器,然后让它响应它需要的数量,然后发回那么多数据,然后重新执行,直到达到100。
如果在客户端获取每个数据的开销非常低,并且可以获得您不需要的数据,那么只需先发送(比方说)110。通过对失败率的一些了解,您应该能够轻松地优化它。
你只能同时拥有(我相信)两个同步异步查询,无论如何,所以同步或不同步,这需要很长时间才能完成。我想不出有任何理由不尽可能地对数据进行分组,并将查询数量减少到1或少数。即使你仍然在服务器上运行100个数据库查询,与HTTP post / response的开销相比,这样做的时间是无关紧要的。
答案 1 :(得分:3)
编写服务器端脚本以响应数字 - 然后在第一个请求中发送了100个数据点:
Browser Server
| |
|---> 100 data ---> |
|<- send 20 more <- |
| |
|---> 20 data ---> |
|<- send 1 more <- |
| |
|---> 1 data ---> |
|<- send 0 more <- |
| |
v v
就像你没有得到在客户端计算在服务器端处理了多少信息所带来的那种同步问题 - 服务器处理数据,排除重复,不正确等等,并且服务器计算它需要的东西。
所有客户端必须做的就是发送所有内容并轮询服务器以获取更多需求。此外,由于Ajax请求的开销,您希望一次发送多个点,但您不希望发送比实际需要更多的内容,因为这也是浪费。
希望这有帮助。
答案 2 :(得分:1)
if(100-completed > dispatched)
应该是:
while(100-completed > dispatched)
假设已完成0开始。
答案 3 :(得分:0)
您需要根据您编写的成功/错误方法为您的.ajax调用添加async:false并增加/减少。
如果您认为这是一个连续的迭代过程,用户一次输入100个值,并且程序一旦有100个值就停止请求信息,您可能想要做一个简单的检查服务器端并以这种方式更新已完成/已发送的值。但是,在.ajax调用中设置async:false将阻止您并在继续前进之前等待呼叫的响应。
答案 4 :(得分:0)
很奇怪。我已经能够在不到一秒的时间内加载大约1000个DB加载的地图标记。
你应该加载所有100个服务器端并在一个请求中添加它们。请求成本通常很大(对于简单的任务,例如连接到数据库并加载一个项目,它可能是70%的请求时间和30%的实际工作时间)。
答案 5 :(得分:0)
也许这是我对JSON和序列化表单数据的个人喜爱,但您是否想过在客户端串行化数据包,发送数据并请求通过/失败响应?
答案 6 :(得分:0)
我认为你的代码中有一个错误,但我不确定它是否只是一个打字错误。
if(100-completed > dispatched)
dispatched++;
updateDB(lat,lng);
根据你的缩进,你想在if子句中调用updateDB,但你没有使用花括号,所以即使语句为真,你也要调用它。如果你使用@jamietre建议的方法你的实现会更好,那么没有这个bug,你的代码应该可行。
答案 7 :(得分:0)
编辑:没关系这个答案,'if'语句中缺少的大括号让我失望,只有当100-completed > dispatched
正确时才调用updateDB?
假设我理解你的问题,看起来这可能是一个时间问题。例如,当completed = 99时,updateDB函数可以在第一次执行成功回调之前被调用4次,当完成时为99,然后它还有3个排队(取决于'if周围的代码) '声明)。所以,它会慢一些,但如果你能确保在'完成'回调之前不再调用updateDB(和/或成功/错误,如果你认为每次都没有调用完成),你认为是吗?可能会解决它吗?
这是我想象正在执行的行的顺序,如果你在两行updateDB(lat,lng);
和completed++
上设置断点:
我的第一个想法是在完成的回调中添加一个标志,如下所示:
完成:功能(数据){
ok_to_run_again_flag = TRUE;
dispatched--;
if(completed == 100)
window.location =“/ start / curate”;
};
和
if((100-completed&gt; dispatched)&amp;&amp; ok_to_run_again_flag)
{
ok_to_run_again_flag = FALSE;
出动++;
updatedb的(纬度,经度);
}
我也想知道为什么你说“Dispatch没有正确递减”。与您的预期相比,它的价值是什么?