Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Adobe Air SQLite同步忙超时/SQLite并发访问/避免忙循环_Sqlite_Air_Adobe_Locked_Usleep - Fatal编程技术网

Adobe Air SQLite同步忙超时/SQLite并发访问/避免忙循环

Adobe Air SQLite同步忙超时/SQLite并发访问/避免忙循环,sqlite,air,adobe,locked,usleep,Sqlite,Air,Adobe,Locked,Usleep,这是我在这里的第一篇文章。我问这个问题是因为我没有线索了,我找不到关于这个具体问题的任何东西 我的问题是:在AdobeAIR中,有没有一种方法可以实现同步usleep()等效(延迟执行200ms),或者有没有一种方法可以指定SQLite繁忙超时? 我有一个AIR应用程序,它在同步模式下使用数据库,因为代码无法处理SQL查询中事件/回调的需要 数据库有时是从另一个应用程序访问的,因此它很忙。因此,语句的execute()抛出SQLerror 3119细节2206。在这种情况下,应在短暂延迟后重试命

这是我在这里的第一篇文章。我问这个问题是因为我没有线索了,我找不到关于这个具体问题的任何东西

我的问题是:在AdobeAIR中,有没有一种方法可以实现同步usleep()等效(延迟执行200ms),或者有没有一种方法可以指定SQLite繁忙超时?

我有一个AIR应用程序,它在同步模式下使用数据库,因为代码无法处理SQL查询中事件/回调的需要

数据库有时是从另一个应用程序访问的,因此它很忙。因此,语句的execute()抛出SQLerror 3119细节2206。在这种情况下,应在短暂延迟后重试命令

由于计算机上正在运行另一个应用程序,我想尽量避免繁忙的等待,但我还是被它卡住了,因为有三件事:

首先,我无法找到给SQLConnection一个忙超时值的方法,就像在C中使用函数sqlite3\u busy\u timeout()一样

其次,我在AdobeAIR/Actionscript中找不到与C usleep()命令等效的命令

第三,我无法在此位置使用事件/计时器/回调等。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个循环,以减少等待时的CPU负载,因为应用程序将在笔记本电脑上运行,同时使用电池

谢谢


-蒂诺

事实上,这个问题对我来说并不重要,因为我现在不再使用ActionScript了。