Возможны ли транзакции с HTML5 Storage в Safari - PullRequest
1 голос
/ 26 ноября 2009

Вместо того, чтобы выполнять каждый цикл в файле JSON, содержащем список операторов SQL, и передавать их по одному за раз, можно с помощью хранилища на стороне клиента Safari просто обернуть данные в «BEGIN TRANSACTION» / «COMMIT TRANSACTION» и передать это в систему базы данных в один вызов? Зацикливание 1000+ операторов занимает слишком много времени.

В настоящее время повторяется одна транзакция за раз:

$j.getJSON("update1.json",
  function(data){
    $j.each(data, function(i,item){
            testDB.transaction(
                function (transaction) {
                    transaction.executeSql(data[i], [], nullDataHandler, errorHandler);
                }
            );
   });
});

Попытка выяснить, как сделать только один звонок:

$j.getJSON("update1.json",
  function(data){
            testDB.transaction(
                function (transaction) {
                    transaction.executeSql(data, [], nullDataHandler, errorHandler);
                }
            );
});

Кто-нибудь пробовал это еще и преуспел?

Ответы [ 3 ]

1 голос
/ 30 ноября 2009

Каждый пример, который я мог найти в документации, показывает только один оператор SQL на команду executeSql. Я бы просто предложил показать график загрузки «ajax spinner» и выполнить ваш SQL в цикле. Вы можете хранить все это в транзакции, но цикл все равно должен быть там:

$j.getJSON("update1.json",
    function(data){
       testDB.transaction(
           function (transaction) {
               for(var i = 0; i < data.length; i++){
                   transaction.executeSql(data[i], [], nullDataHandler, errorHandler);
               }
           }
       );
    }
);

Перемещение цикла внутри транзакции и использование for i = должно помочь немного увеличить скорость вашего цикла. $.each подходит менее чем для 1000 итераций, после этого нативный for(var = i..., вероятно, будет быстрее.

Примечание Используя мой код, если какой-либо из ваших операторов SQL выдает ошибки, вся транзакция завершится неудачей. Если это не ваше намерение, вам нужно будет оставить цикл вне транзакции.

0 голосов
/ 08 ноября 2011

Да, в одной транзакции с WebSQL можно обрабатывать целую группу операторов. На самом деле вам даже не нужно использовать BEGIN или COMMIT, об этом позаботятся автоматически, если вы выполняете все вызовы executeSql из одной транзакции. Пока вы делаете это, каждый оператор включается в транзакцию.

Это значительно ускоряет процесс, а также приводит к тому, что при возникновении ошибки в одном из ваших операторов выполняется откат всей транзакции.

0 голосов
/ 26 ноября 2009

Я никогда не сталкивался с хранилищем базы данных HTML5 (хотя с local / sessionStorage), и я предположил бы, что можно выполнить одну огромную строку операторов. Используйте data.join(separator here), чтобы получить строковое представление массива data.

...