SQLite WAL停止在Universal App

时间:2015-05-04 11:10:32

标签: sqlite windows-phone windows-phone-8.1 win-universal-app sqlite-net

我正在开发Windows / Windows Phone通用应用程序。我需要在后台将记录插入sqlite数据库,同时我还需要在不同的页面上显示一些数据。

我的sqlite数据库由20个不同的表组成,后台插入是在所有表中转储记录。

我在sqlite上实现了WAL(Write Ahead Logging),它正在创建wal文件和shm文件。 进程工作正常,直到一些读/写操作并行,但它停止,我的应用程序挂起。

我在firefox中使用sqlitemanager扩展配置了sqlite文件。我用户sqlite-net库。

我是WAL概念的新手。

有什么想法可以继续这个过程吗?

更新

  1. 我在firefox上使用sqlite manager扩展将journal mode = wal设置为.sqlite文件。
  2. 使用类文件处理数据库对象

    等待MyClass.ProcessTop10Records();

    Task.Run(()=> {MyClass.ProcessRestRecords();});

  3. 第一种方法只处理10条记录,然后我制作了另一种方法,它将在后台运行单独的任务,它在数据库中输入记录。

    方法逻辑:

    RootObject objRootObject = JsonConvert.DeserializeObject<RootObject>(sJsonData);
    

    (这个objRootObject包含一个复杂的json对象。差不多有50个其他子对象)

    我有近20张表格,其中插入不同的记录如下:

    if (objRootObject != null && objRootObject.objElement != null && objRootObject.objElement.lstRecords != null)
     {
            MYViewModel.SaveAllRecords(objRootObject.objElement.lstRecords, REFERENCE_ID);
     }
    
    public static int SaveAllRecords(List<Record> lst, int REFERENCE_ID)
            {
                int nResult = 0;
                try
                {
                    GlobalVariable.con.RunInTransaction(() =>
                    {
                       nResult =  GlobalVariable.con.InsertAll(lst.Select(c => new Record
                        {
                            Id = c.Id,
                            value1 = REFERENCE_ID,
                            value2 = c.value2,
                            value3 = c.value3,
                            value4 = Convert.ToString(c.value4),
                            value5 = Convert.ToString(c.value5),
                        }));
                    });
                }
                catch (Exception)
                {
                    nResult = 0
                }
                return nResult;
            } 
    
    1. 在MainPage和其他页面上,我正在从仍在进行插入的同一数据库文件中检索记录。 (我为并发读写操作实现了WAL。)

      public ObservableCollection GetRecords()         {             lstRecords = new ObservableCollection();

                  var query = GlobalVariable.con.Table<Record>().Where(c => c.bActive);
                  foreach (var _Item in query)
                  {
                      var Item = new Record()
                      {
                          nId = _Item.nId,
                          value1 = _Item.value1,
                          value2 = _Item.value2,
                          value3 = _Item.value3,
                          value4 = _Item.value4,
                          bActive = _Item.bActive
                      };
                      lstRecords.Add(Item);
                  }
      
              return lstRecords;
          }
      
    2. 上面的插入和选择是我放在这里给你看的样本。实际上,还有更多的insert和select方法。有几个记录需要插入到数据库中,这是一个耗时的过程。我不希望我的UI等到所有插入完成。将10-15条记录插入数据库后,我正在填充我的UI。此处并发处理如图所示。

    3. 但有时,它会挂起应用程序并且插入过程也会停止。

      观点: 1. WAL文件达到​​4MB后,它总是停止增加它的大小。 SHM文件大小始终为32 kb。

      1. 如果我不浏览页面(读取操作),则使用WAL可以正常插入。

      2. 当我移除沃尔玛时,事情工作正常,但太慢了。我无法使用多线程,因为手机设备上存在内存问题。

0 个答案:

没有答案