在 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 执行大量任务。
所以,我的问题是如何处理这种情况。请给我一些处理此类案件的想法。我想到了两个想法:
- 批量插入时停止后台服务(在后台,
有一系列长任务,比如调用网络服务和做工作
使用 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
恐怕唯一的选择是在访问数据库之前使用 lock 或 semaphore。
锁机制保证只有一个线程做inner code block。其他线程同步等待。
readonly object sync = new object();
void MyMethod() {
lock (sync) {
...
}
}
Semaphore类似,但内部代码块最多可由n个线程执行。
请在 MSDN 上查看有关 SemaphoreSlim
的更多信息。
以前我使用 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 执行大量任务。
所以,我的问题是如何处理这种情况。请给我一些处理此类案件的想法。我想到了两个想法:
- 批量插入时停止后台服务(在后台, 有一系列长任务,比如调用网络服务和做工作 使用 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
恐怕唯一的选择是在访问数据库之前使用 lock 或 semaphore。
锁机制保证只有一个线程做inner code block。其他线程同步等待。
readonly object sync = new object();
void MyMethod() {
lock (sync) {
...
}
}
Semaphore类似,但内部代码块最多可由n个线程执行。
请在 MSDN 上查看有关 SemaphoreSlim
的更多信息。