Проблема / ошибка в Chrome с Web SQL при выполнении большого количества запросов? - PullRequest
1 голос
/ 03 января 2011

Похоже, что когда в Chrome выполняется много последовательных SQL-запросов, некоторые теряются, то есть не завершаются, но не вызывают никаких ошибок / предупреждений.

Вот самый простой тест, который я смог придумать:

var shortName = "db", version = "1.0", displayName = "db", maxSize = 20 * 1024 * 1024;
var db = openDatabase(shortName, version, displayName, maxSize);
db.transaction(function(tx) {
    tx.executeSql("CREATE TABLE IF NOT EXISTS cache (key TEXT PRIMARY KEY ASC NOT NULL, value TEXT NULL);");
    });

for (var i=0; i<5; i++) {
    db.transaction(function(tx) {
        tx.executeSql("SELECT * FROM cache WHERE key = ?", ["test"],
            function() {
                console.log("ok");
                },
            function() {
                console.warn("error: ", err);
                });
        });
    }

Теперь, если я добавлю вышеуказанный код на веб-страницу, я ожидаю увидеть FIVE "ok" в консоли, например, так: http://i.stack.imgur.com/FgcNz.png (это правильно).

Но если я быстро перезагружаю страницу, я иногда получаю худший номер, без каких-либо ошибок или предупреждений, например: http://i.stack.imgur.com/bc5Kl.png (это неверно: только ДВА "ок" вместо пять).

Вот мои вопросы:

  1. есть ли ошибка в коде выше?
  2. если нет, это ошибка Chrome / Sqlite или "нормальное" / ожидаемое поведение?
  3. и самое главное, как я могу защититься от этого? Мне действительно нужно знать, завершается ли каждый запрос, потому что, если они могут просто завершиться в подвешенном состоянии, то часть кода, которая зависит от него, никогда не запускается ...

Я использую 9.0.597.19 бета.

Ответы [ 3 ]

1 голос
/ 14 января 2011

У меня такая же проблема. Код, который отлично работает в Safari и Opera, показывает неожиданные, но воспроизводимые результаты в Chrome (последняя рабочая версия: 8.0.552.237).

Я пытаюсь (предварительно) заполнить базу данных 1000+ строками, полученными с помощью XMLHTTPRequests. Для таблиц с примерно 20 строками все отлично работает. Однако две таблицы имеют (или должны иметь) 147 и 857 строк соответственно. Заполнение их "останавливается" после 7 записей.

Подсказка к объяснению числа «7» состоит в том, что последняя таблица, которая работает правильно, имеет семь записей. После этого как-то все начинает портиться ...

Размещение обратных вызовов «fail» для регистрации содержимого на консоли не дает никакой информации.

0 голосов
/ 15 октября 2013

Вам нужно создать одну транзакцию db.transaction и в for () создать много tx.executeSql

db.transaction(function (tx) {

    for (var i=0; i<5; i++)  
    {
         tx.executeSql("SELECT * FROM cache WHERE key = ?", ["test"],
                function() {
                    console.log("ok");
                },
                function() {
                    console.warn("error: ", err);
                });
    }
});
0 голосов
/ 27 ноября 2012

Я не совсем уверен, почему вы получили бы только два "ок" и никаких ошибок, но вы, скорее всего, увидите периодически возникающие проблемы с вашим кодом, потому что db.transaction асинхронный.Это означает, что ваш код не ожидает завершения транзакции создания таблицы, прежде чем выполнит остальную часть кода в вашем скрипте, поэтому он может начать выполнение запросов к таблице, которая все еще инициализируется.Для большей безопасности используйте обратный вызов:

var shortName = "db", version = "1.0", displayName = "db", maxSize = 20 * 1024 * 1024;
var db = openDatabase(shortName, version, displayName, maxSize);
db.transaction(function(tx) {
    tx.executeSql("CREATE TABLE IF NOT EXISTS cache (key TEXT PRIMARY KEY ASC NOT NULL, value TEXT NULL);");
    }, [], onTableInitialized);

function onTableInitialized() {
    for (var i=0; i<5; i++) {
        db.transaction(function(tx) {
            tx.executeSql("SELECT * FROM cache WHERE key = ?", ["test"],
                function() {
                    console.log("ok");
                },
                function() {
                    console.warn("error: ", err);
                });
        });
    }
}

Все 5 запросов могут выполняться одновременно и могут завершаться в другом порядке, чем они начали, но это должно быть хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...