Adobe Air SQLite: синхронный тайм-аут занятости / параллельный доступ к SQLite / цикл избегания занятости - PullRequest
1 голос
/ 28 октября 2010

это мой первый пост здесь. Я спрашиваю, потому что у меня закончились подсказки, и я не смог ничего найти по этому конкретному вопросу.

У меня такой вопрос: В Adobe AIR есть ли способ сделать синхронный эквивалент usleep () (задержка выполнения 200 мс), или есть способ указать где-нибудь время ожидания занятости SQLite? 1005 * У меня есть приложение AIR, которое использует базу данных в синхронном режиме, поскольку код не может справиться с необходимостью событий / обратных вызовов в запросах SQL.

Иногда к базе данных обращаются из другого приложения, так что она занята. Следовательно, execute () оператора выдает SQLerror 3119 деталь 2206. В этом случае команда должна быть повторена после небольшой задержки.

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

Во-первых, мне не удалось найти способ присвоить SQLConnection значение времени ожидания занятости, как это возможно в C с функцией sqlite3_busy_timeout ()

Во-вторых, мне не удалось найти эквивалент команды C usleep () в Adobe AIR / Actionscript.

В-третьих, я не могу использовать события / таймеры / обратные вызовы и т. Д. В этом месте. SQL execute () должен быть синхронным, потому что он вызывается из глубоко вложенных классов и функций в миллионе мест по всему приложению.

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

Самый низкий уровень кода выглядит так:

private static function retried(fn:Function):void {
    var loops:int = 0;
    for (;;) {
        try {
            fn();
            if (loops)
                trace("database available again, "+loops+" loops");
            return;
        } catch (e:Error) {
            if (e is SQLError && e.errorID==3119) {
                if (!loops)
                    trace("database locked, retrying");
                loops++;
                // Braindead AIR does not provide a synchronous sleep
                // so we busy loop here
                continue;
                }
            trace(e.getStackTrace());
            trace(e);
            throw e;
        }
    }
}

Пример использования этой функции:

protected static function begin(conn:SQLConnection):void {
    retried(function():void{
        conn.begin(SQLTransactionLockType.EXCLUSIVE);
    });
}

Вывод этого кода выглядит примерно так:

database locked, retrying
database available again, 5100 loops

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

Спасибо.

-Tino

...