SQLite做为本地缓存应注意的几大方面

发表于:2011-2-21 10:09

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Tecky Li    来源:51Testing软件测试网采编

  下面是控制器的接口定义:

  1. public interface ICdlCacheController  
  2.     {  
  3.         void BeginLoadRow();  
  4.         void EndLoadRow();  
  5.         System.Collections.Generic.IList<CdlCacheItem> GetCdlCacheItems(string moduleKey);  
  6.         CdlCacheItem GetCdlCacheItems(int id);  
  7.         void LoadRow(System.Data.DataRow row, string tableName);  
  8.         void LoadRow(IEnumerable<object> row, string tableName);  
  9.         string LoadTable(System.Data.DataTable dt, string moduleKey, string comments);  
  10.         System.Data.Common.DbDataReader QueryCdlTableReader(CdlCacheItem item);  
  11.         System.Data.DataTable QueryCdlTables(CdlCacheItem item);  
  12.         System.Data.DataTable QueryCdlTables(string sql);  
  13.         void RemoveAllTables();  
  14.         void RemoveCdlTables(string moduleKey);  
  15.         void RemoveCdlTables(System.Collections.Generic.IList<CdlCacheItem> items);  
  16.         void RemoveCdlTables(CdlCacheItem item);  
  17.         void RemoveCdlTables(int id);  
  18.     }

  上面的函数下面来做个说明:

  1、BeginLoadRow、LoadRow和EndLoadRow,三个函数组为了在我们查询主数据库时使用Reader方式读取数据时,可以一条条将数据同时存放在缓存中。

  2、RemoveAllTables和RemoveCdlTables是用来删除缓存项的。

  3、GetCdlCacheItems,通过moduleKey得到多个缓存项。比如用户想基于这几天内保存的某个功能的数据做一次快速分析,那么我们就可以通过这个函数得到缓存列表,由用户选择列表中的一个来继续。

  4、QueryCdlTableReader,得到某个缓存数据的Reader对象,这样可以一行行的分析,一次读出大数据量的数据到DataTable中,内存可能会溢出的。

  5、QueryCdlTables,将某个缓存项查询并装载到DataTable中。

  提高缓存数据写入效率

  Sqlite在保存数据的时候,比如一次保存一个亿条的数据,一条条插入效率非常低下,网上也有人对其进行讨论。

  效率低下的主要原因在于IO操作次数过于频繁,所以在LoadTable或者是使用BeginLoadRow·EndLoadRow的时候,使用了事务来减少数据提交的次数,结果保存的效率非常的高,我测试的结果是400万条数据查询,只需要几十秒钟,这点时间相对于重新查一次远程服务器那是可以忽略了。

  下面给出BeginLoadRow和EndLoadRow的具体代码(只有在EndRow的时候才会提交一次数据):

  1. SQLiteConnection m_connection;  
  2. SQLiteCommand m_command;  
  3. DbTransaction m_transaction;  
  4. public void BeginLoadRow()  
  5. {  
  6.     m_connection = new SQLiteConnection("Data Source=" + CACHEFILEPATH);  
  7.  
  8.     m_connection.Open();  
  9.     m_transaction = m_connection.BeginTransaction();  
  10.     m_command = new SQLiteCommand(m_connection);  
  11. }

54/5<12345>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号