我已开发出flex应用程序。一个应用程序不断从互联网上检索数据,而另一个应用程序可以在您需要时打开和关闭,两个应用程序都使用相同的数据库。问题是我随机得到一个Error #3119: Database file is currently locked
。在Adobe AIR环境中不可能有两个稳定的连接吗?有人有任何解决方案吗?
答案 0 :(得分:2)
我想不是。不是一次。
答案 1 :(得分:2)
我知道这是一个非常古老的问题,但我自己遇到了这个问题,并为那些可能遇到此问题的人找到了解决方案。我希望这对某人有所帮助,因为我知道,在这个主题上我能找到的只是虚假的信息,就像Konrad给出的那样。实际上,您可以拥有多个开放式数据库连接。实际上,在我的应用程序中,我有一个异步连接用于将数据写入数据库(INSERT,UPDATE,DELETE),以及一个用于从数据库读取的同步只读连接。在异步连接上,对于每个执行,我总是通过使用
将所有语句放入事务中来获得立即锁定 conn.begin(SQLTransactionLockType.IMMEDIATE);
这将允许您在使用其他连接写入数据库时从数据库中读取数据。我遇到问题的地方是在提交此异步语句之后以及在实际完成数据写入之前尝试从一个连接读取数据库。因此,即使SQLTransactionLockType.IMMEDIATE
的文档声明您在锁定时仍然可以执行读取操作,但实际上您无法在写入数据的过程中主动执行另一条语句。
我通过编写自己的同步连接执行来解决这个问题。它只是尝试执行,如果由于错误#3119而失败,请再试一次,直到成功为止。在每次函数调用之间,数据将继续写入数据库,最终将不再繁忙。以下是该功能的代码:
public static function execute(stmt:SQLStatement):void {
try {
stmt.execute();
} catch (e:SQLError) {
if(e.errorID == 3119) {
execute(stmt);
} else {
trace(e.details + "\n" + e.getStackTrace());
if(stmt.sqlConnection != null && stmt.sqlConnection.inTransaction) {
stmt.sqlConnection.rollback();
}
}
}
}
答案 2 :(得分:0)
另外要注意这个错误(如果你是像我一样的白痴)是 检查你是否在db浏览器中打开了SQLite db文件 ,它可以锁定数据库,并导致此错误(以及谷歌搜索和刺激的时间)。