【问题标题】:SQLite-net and SQLite-WinRT at the same time in Windows runtime apps在 Windows 运行时应用程序中同时使用 SQLite-net 和 SQLite-WinRT
【发布时间】:2016-06-02 05:28:14
【问题描述】:

以前我使用 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 db,可能不会立即停止后台服务 好主意)
  • 关闭所有 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-net:http://www.codeproject.com/Articles/826602/Using-SQLite-as-local-database-with-Universal-Apps

【问题讨论】:

    标签: windows sqlite windows-runtime win-universal-app sqlite-net


    【解决方案1】:

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

    锁机制保证只有一个线程做内部代码块。其他线程同步等待。

    readonly object sync = new object();
    
    void MyMethod() {
        lock (sync) {
            ...
        }
    }
    

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

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

    【讨论】:

    • 感谢您的回答。您能否详细说明如何使用锁或信号量?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    相关资源
    最近更新 更多