下面是控制器的接口定义:
- public interface ICdlCacheController
- {
- void BeginLoadRow();
- void EndLoadRow();
- System.Collections.Generic.IList<CdlCacheItem> GetCdlCacheItems(string moduleKey);
- CdlCacheItem GetCdlCacheItems(int id);
- void LoadRow(System.Data.DataRow row, string tableName);
- void LoadRow(IEnumerable<object> row, string tableName);
- string LoadTable(System.Data.DataTable dt, string moduleKey, string comments);
- System.Data.Common.DbDataReader QueryCdlTableReader(CdlCacheItem item);
- System.Data.DataTable QueryCdlTables(CdlCacheItem item);
- System.Data.DataTable QueryCdlTables(string sql);
- void RemoveAllTables();
- void RemoveCdlTables(string moduleKey);
- void RemoveCdlTables(System.Collections.Generic.IList<CdlCacheItem> items);
- void RemoveCdlTables(CdlCacheItem item);
- void RemoveCdlTables(int id);
- }
|
上面的函数下面来做个说明:
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的时候才会提交一次数据):
- SQLiteConnection m_connection;
- SQLiteCommand m_command;
- DbTransaction m_transaction;
- public void BeginLoadRow()
- {
- m_connection = new SQLiteConnection("Data Source=" + CACHEFILEPATH);
-
- m_connection.Open();
- m_transaction = m_connection.BeginTransaction();
- m_command = new SQLiteCommand(m_connection);
- }
|