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