use*_*723 5 sqlite xamarin sqlite-net
我们在Xamarin应用程序中使用SQLite.NET PCL.
通过插入多个表将数据库置于压力之下,我们看到抛出BUSY异常.
任何人都可以解释BUSY和LOCKED之间的区别吗?是什么导致数据库忙?
我们的代码使用与使用以下代码创建的数据库的单个连接:
var connectionString = new SQLiteConnectionString(GetDefaultConnectionString(),
_databaseConfiguration.StoreTimeAsTicks);
var connectionWithLock = new SQLiteConnectionWithLock(new SQLitePlatformAndroid(), connectionString);
return new SQLiteAsyncConnection (() => { return connectionWithLock; });
Run Code Online (Sandbox Code Playgroud)
...当前操作无法继续,因为所需资源已锁定...
我假设您正在使用async样式的插入并且在不同的线程上,因此插入超时等待不同插入的锁定完成。您可以使用同步插入来避免这种情况。我个人在需要时通过创建一个 FIFO 队列并在专用线程上同步使用该队列来避免这种情况。您还可以通过重试您的事务 X 次,然后让Exception涟漪上升来处理这种情况。
SQLiteBusyException 是一个特殊的异常,每当 SQLite 返回 SQLITE_BUSY 或 SQLITE_IOERR_BLOCKED 错误代码时就会抛出。这些代码意味着当前操作无法继续,因为所需资源被锁定。
当通过 SQLiteConnection.setBusyTimeout(long) 设置超时时,SQLite 将在返回此错误之前尝试在指定的超时期间获取锁。
参考:http : //www.sqlite.org/lockingv3.html
参考:http : //sqlite.org/capi3ref.html#sqlite3_busy_timeout
所以我们的问题结果是,虽然我们已经确保在类中我们写了它只创建了一个到数据库的单一连接,我们还没有确保这个类是一个单例,因此我们仍然创建了多个连接到数据库.一旦我们确定它是单身,那么繁忙的错误就会停止
我从中得到的是:
锁定意味着您有多个线程试图访问数据库,代码本质上不是线程安全的.
繁忙意味着你有一个线程在另一个线程上等待完成,你的代码是线程安全的,但你看到使用数据库的争用.
| 归档时间: |
|
| 查看次数: |
3067 次 |
| 最近记录: |