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

时间:2010-10-28 19:17:50

标签: sqlite air adobe locked usleep

这是我在这里的第一篇文章。我问,因为我的线索已经用完,我无法找到有关此特定问题的任何内容。

我的问题是:在Adobe AIR中,有没有办法做同步的usleep()等效(延迟执行200ms),或者有办法在某处指定SQLite忙超时吗?

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

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

由于计算机上正在运行另一个应用程序,我想尽量避免忙碌等待,但是由于三件事我一直坚持:

首先,我无法找到一种方法来为SQLConnection提供一个繁忙的超时值,就像在C中使用函数sqlite3_busy_timeout()

一样。

其次,我无法在Adobe AIR / 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负载,因为应用程序将在使用笔记本电脑时运行。

感谢。

-Tino

0 个答案:

没有答案