首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >异步SQL insert in循环

异步SQL insert in循环
EN

Stack Overflow用户
提问于 2012-05-12 01:21:11
回答 3查看 988关注 0票数 2

在SQL数据库中插入行时遇到问题。我想在javascript中将一个对象数组转换成一个SQL表。

下面的代码只添加数组的第一个对象。我尝试了在stackoverflow和其他地方找到的所有东西,但都不能正常工作。

任何帮助都将不胜感激。谢谢。

代码语言:javascript
运行
复制
        for (var i = 0; i < arr.length; i++) {
            db.save({key:i+"", value:arr[i]}, function(e){

            });
        }

更新1:我已将其更改为mathec的示例,并缩小了问题的范围。

插入的行数取决于要插入的对象的大小。因此,它与处理每个对象所需的时间有关。

我如何解决这个问题?谢谢。

更新2:

我采纳了Robert Young的建议,并包含了一个自包含的示例。

下面的示例只插入前5个元素。如果我删除了test key中的一些单词文本,使得它只说' word‘一次,那么就会插入10个元素。所以现在我确定这与处理每个对象所需的时间有关。

代码语言:javascript
运行
复制
<html>
    <head>
        <script src="jquery.js"></script>
        <script src="lawnchair.js"></script>
        <script type='text/javascript'>


            var db = "";
            var arr = [];

            arr.push({name:"a1", test:"word word word word word word word word word word word word word word "});
            arr.push({name:"a2", test:"word word word word word word word word word word word word word word "});
            arr.push({name:"a3", test:"word word word word word word word word word word word word word word "});
            arr.push({name:"a4", test:"word word word word word word word word word word word word word word "});
            arr.push({name:"a5", test:"word word word word word word word word word word word word word word "});
            arr.push({name:"a6", test:"word word word word word word word word word word word word word word "});
            arr.push({name:"a7", test:"word word word word word word word word word word word word word word "});
            arr.push({name:"a8", test:"word word word word word word word word word word word word word word "});
            arr.push({name:"a9", test:"word word word word word word word word word word word word word word "});
            arr.push({name:"a10", test:"word word word word word word word word word word word word word word "});
            arr.push({name:"a11", test:"word word word word word word word word word word word word word word "});

            $(function() {
                db = new Lawnchair({table:'t50'}, function(e){
                    for ( i = 0; i < arr.length; i++) {
                        (function(i) {
                            add_row(i);
                        }(i));
                    }
                });
            });

            function add_row(i) {
                db.save({key:i+"", value:arr[i]}, function(e){

                });
            }

        </script>
    </head>
    <body>

    </body>
</html>

更新3:我使用了Robert的建议代码,并提出了以下三个小元素。因此,我更改了第一个元素,使其比其他元素更大以测试它。第一个元素没有添加,最后两个是添加的。处理数组有时间限制吗?

代码语言:javascript
运行
复制
<html>
    <head>
        <script src="jquery.js"></script>
        <script src="lawnchair.js"></script>
        <script type='text/javascript'>

            var arr = [];
            var db = "";

            $(function() {
                db = new Lawnchair({table:'t51'}, function(e){
                    arr=[{key:"k1", value:"v1. Because the contents of this element are larger than the others it will not be added for some reason. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. "}
                    ,{key:"k2", value:"v2"}
                    ,{key:"k3", value:"v3"}]

                    db.batch(arr, function () {
                        db.all(function (recs) { for (r in recs) {console.log(recs[r].key +"| "+ recs[r].value) } });
                    });
                });

            });

        </script>
    </head>
    <body>
    </body>
</html>
EN

Stack Overflow用户

发布于 2012-05-12 12:36:00

很难缩小问题的解决方案,因为我们不知道如何将数据保存到数据库中,也许是AJAX请求?,但我认为问题出在异步保存数组的每一行的整个逻辑中,因为代码不会等待保存一行才开始另一行,所以发生了某种竞争条件,一些行被保存在相同的"id“(自动增量字段)中,这解释了为什么只保存一些行。

我的建议是将整个数组发送到服务器,然后保存每一行。

当然,您可以对每一行执行此操作,首先锁定id,然后保存数据,但这不是一个好主意,因为您需要往返于服务器和每一行的DB之间,从而使服务器的请求量加倍。

希望它能帮上忙!

P.D. +1 to @mathec回答指出有回调问题的循环变量!

票数 0
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10555887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档