在 Windows 个运行时应用程序中同时使用 SQLite-net 和 SQLite-WinRT

SQLite-net and SQLite-WinRT at the same time in Windows runtime apps

以前我使用 SQLITE-NET 库来完成我所有的 sqlite 数据库任务,它运行良好。 但是我的应用程序有大量数据要插入并且花费了很多时间。因此,我决定仅在需要批量插入的地方使用 SQLITE-WinRT 包装器,因为 SQLITE-WinRT 包装器似乎提供了诸如准备语句、绑定数据然后执行它们的功能,从而加快处理速度并提高性能。

在我的应用程序中,有很多使用 SQLITE-NET 方法的 CRUD 操作,我保留原样,因为很难完全从 SQLITE-NET 库切换到 SQLITE-WinRT 包装器。

我的应用程序有后台任务,仅使用 SQLITE-NET 库运行和处理一些 Web 服务调用和大量 CRUD 操作。

每当我尝试使用准备好的语句使用 SQLITE-WinRT 包装器进行批量插入时,如果后台任务是 运行,它总是会在 SQLITE-NET 库中引发 Busy 异常。我知道它的原因,后台服务使用 SLITE-NET 库进行大量 CRUD 操作。因此,当使用 SQLITE-WinRT 包装器进行批量插入时,它会抛出 Busy 异常,因为 sqlite 数据库已经在后台使用 SQLITE-NET 执行大量任务。

所以,我的问题是如何处理这种情况。请给我一些处理此类案件的想法。我想到了两个想法:

如有任何帮助,我们将不胜感激。提前致谢。

批量插入时,我是这样开始的:

 string dbPath = "collection.sqlite";
 var file = await ApplicationData.Current.LocalFolder.GetFileAsync(dbPath);
 var db = new SQLiteWinRT.Database(file);
 await db.OpenAsync(SqliteOpenMode.OpenReadWrite);
 using (var statement = await db.PrepareStatementAsync("INSERT INTO Forms(ServerFormId,FormFileName,FormStatusId,PriorityId) VALUES(?,?,?,?)"))
                {
                    await db.ExecuteStatementAsync("BEGIN TRANSACTION");
                    statement.Reset();
                    statement.BindTextParameterAt(1, "0");
                    statement.BindTextParameterAt(2, formName);
                    statement.BindTextParameterAt(3, formStatusId);
                    statement.BindTextParameterAt(4, priorityId);
                    await statement.StepAsync().AsTask().ConfigureAwait(false);
                }
                await db.ExecuteStatementAsync("COMMIT TRANSACTION");

SQLite-WinRT:https://blogs.msdn.microsoft.com/andy_wigley/2013/11/21/how-to-massively-improve-sqlite-performance-using-sqlwinrt/

SQLite-网:http://www.codeproject.com/Articles/826602/Using-SQLite-as-local-database-with-Universal-Apps

恐怕唯一的选择是在访问数据库之前使用 locksemaphore

锁机制保证只有一个线程做inner code block。其他线程同步等待。

readonly object sync = new object();

void MyMethod() {
    lock (sync) {
        ...
    }
}

Semaphore类似,但内部代码块最多可由n个线程执行。

请在 MSDN 上查看有关 SemaphoreSlim 的更多信息。