开发者社区> 问答> 正文

使用Ajax不停获取数据库中的数据怎么做?:报错

一个用Excel文档导入数据的操作,需要显示导入时候的进度百分比。

这个该如何实现呢?

比如:我Excel中有100条数据,如果导入数据库中一条数据,那么在导入进行的时候显示1%。

领导给的思路是,将导入的数据保存到一个表里,然后Ajax不停的进行读取。

可是这个思路不知道该如何实现,也不知道该如何查,这个Ajax轮询可以做吗?Ajax轮询是什么?

还请大家多多指点!

谢谢大家!


展开
收起
kun坤 2020-06-07 21:59:59 846 0
1 条回答
写回答
取消 提交回答
  • ajax异步的,单单settimeout不行,得获取返回之后ajax递归######

    频繁轮询用webSocket比较好


    ######

    后台:xls 文件处理逻辑

    public Map updateFile(){

    map= new hashmap();

    int count = xls.count();

    for(int i=0;i<count;i++){

    //处理每一条数据

    session.setAttribute("上传进度百分比",(int)((i+1+0.0)/count*100));

    }

    return map;

    }

    后台:/abc/a 

    public Map getJd(){

    map = new hashmap();

    map.put("data",session.getAttribute("上传进度百分比"));

    return map;

    }

    前台js:

    var id = setInterval(function(){

    $.post('/abc/a',function(d){

    //d是json:返回0-100的数字

    var data=d.data;

    进度条对象.set进度(data);

    if(data==100){

    进度条对象.close();

    clearInterval(id);

    }

    });

    },500);

    ######回复 @blue_think : servlet 3.0有异步请求######回复 @blue_think : 我不同意你的说法,请看我对这个回复的引用。######session和cookies关联。之前试过如果程序没处理完,session根本获取不到,能获取到的时候已经100%了。所以如果不是用flush强制输出,不然就是进度存到数据库,或者写入到实际文件中。######

    刚好今天写了一个。

    我需要检测核销订单的状态(数据库),然后页面上进行相应的变化。

    //ajax短轮询获取后台核销的状态
    function getStates(){
    	jQuery.ajax({
            type: "POST",
            url: "#springUrl('/microVerification/getStates.in')",
            data: {
                orderNo: "$!order.orderNo",
            },
            dataType: "json",
            success: function (data) {
    			if(data.result == "already"){
    				//检测到已核销
    				$("#yet").hide();
    				$("#already").show();
    				return;
    			}else if(data.result == "yet"){
    				//检测到未核销,继续调用
    				setTimeout(function () { 
                        getStates();
                    }, 5000);
    			}else{
    				//出错了
    			}
            },
            error: function () {
                //alert("没有订单");
            }
        });
    }




    ######setTimeout  ######

    不知道你这个处理程序一般是多长时间。

    你可以在后台处理数据,程间隔一段时间flush()一次处理结果到客户端,只到全部处理完成再response.end()掉这个链接。

    客户端用xmlhttprequest监听onreadystatechange事件,获取xmlhttprequest的readystate,为3的时候就可以开始不断的获取到responseText的数据(实时,但是不一定是完整的)。

    比如你的后台每次这样flush进度。第一次"1,",第二次"2,",第三次"3,"。这样客户端三次readystatechange获取的结果就是:

    第一次 "1,"

    第二次 "1,2,"

    第三次 "1,2,3,"

    以此类推。

    但是这样又有一个缺点就是,这个http连接可能会被浏览器本身关闭,因为早期的一些ie浏览器,会忽略keep-alive这个头,大约1分钟就自己关了,所以如果你的处理时间很长,比如要几分钟的话,这个方案可能就不是很合适。

    ######这个不难,后台程序要将当前进度放到session中,Ajax定时去获取进度并显示;达到100%时要在session中保持一定时间(一般是启动一个Timer任务定时删除),以在下次Ajax获取时再自动删除掉这个session数据或者达到定时时间时自动删除session数据(避免内存泄漏),后者是防止前台离开或刷新页面而停止了Ajax请求。######

    假设你的上传Excel, 以及解析Excel都是ok的。 当程序一条条插入数据库时,正常情况下这个时间间隔是非常非常短的也就几毫秒(不排除当时连接数据库很慢很慢)。假设你页面ajax每一秒去轮训一下这个状态, 正常情况下, 你拿到的这个状态值也就处理完了。

    所以这种显示百分比也就骗骗人了!

    ######回复 @Solid : 优化一下的话,就把list变成count,一个是100,一个从0开始。######赞同,百分百就是骗人的,千万别为了这个而浪费大好时光。 从Excel里取出数据,定义两个变量(list)到session,一个记录初始化时的条数,另一个List设置为空,在插入数据库时往这个List里也插入一条数据,Ajax请求不要操作数据库,直接访问两个List的size的比值,这个比值就是进度条数据了。######

    进度条都是假的~也就是用户体验好些而已。。

    跟分页类似,首先先要获取数据多少条,一次导入多少条。。比如:1000/100 = 10

    把进度条分10份,ajax一次,传page。后台根据page导入。导入成功,页面相应,进度条走1,ajax传page+1

    ######楼上的可以试试. 
    2020-06-07 22:00:05
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
2022 DTCC-阿里云一站式数据库上云最佳实践 立即下载
云时代的数据库技术趋势 立即下载
超大型金融机构国产数据库全面迁移成功实践 立即下载