技术开发 频道

SQLite应用在本地缓存上需注意的几点

    【IT168 技术】今天看到了园友陆敏计的一篇文章<C#数据本地存储方案之SQLite>, 写到了SQLite的诸多优点,尤其适应于本地数据缓存和应用程序。

  转自陆兄的内容,来夸夸Sqlite:

  SQLite官方网站: http://www.sqlite. org/ 时第一眼看到关于SQLite的特性。

  1. ACID事务

  2. 零配置 – 无需安装和管理配置

  3. 储存在单一磁盘文件中的一个完整的数据库

  4. 数据库文件可以在不同字节顺序的机器间自由的共享

  5. 支持数据库大小至2TB

  6. 足够小, 大致3万行C代码, 250K

  7. 比一些流行的数据库在大部分普通数据库操作要快

  8. 简单, 轻松的API

  9. 包含TCL绑定, 同时通过Wrapper支持其他语言的绑定

  10. 良好注释的源代码, 并且有着90%以上的测试覆盖率

  11. 独立: 没有额外依赖

  12. Source完全的Open, 你可以用于任何用途, 包括出售它

  13. 支持多种开发语言,C, PHP, Perl, Java, ASP .NET,Python

  正好前一段时间我做了这方面的应用,我就结合陆兄的这篇文章,谈谈我在Sqlite本地缓存业务数据时的经验,给大家借鉴一下。我开发时比较仓促,很多地方请大家多提意见。

  解决的问题

  首先介绍我用Sqlite解决的实际问题是什么?

  问题1:某个功能的数据需要连接一个远程数据库查询速度很慢,查一次数据不容易,希望能够重复利用之前查过的数据集。

  问题2:非常大的数据量比如几千万甚至几亿条数据,一次性读取到DataTable中,会内存溢出的,所以在第一次分析时就是通过Reader的方式,分析完一条后并不在内存中保存,但是紧接着用户的第二次分析、第三次分析还是要用到的第一次分析的数据,如果我们重新查询一次远程服务器,效率可想而知啊。

  结合上面的2个问题,为了解决效率问题和数据重复利用度,减少数据库服务器的压力,我才用Sqlite缓存数据(当然这不是唯一也不是最好的解决方案) 。

  优化SQLiteHelper

  陆兄的SQLiteHelper类我增加了几个有用的方法:

  第一个方法是GetSchema,得到某个表的表结构。

        /// <summary>  
        /// 查询数据库中的所有数据类型信息  
        /// </summary>  
        /// <returns></returns>  
        public DataTable GetSchema()
        {
            using (SQLiteConnection connection
= new SQLiteConnection(connectionString))
            {
                connection
.Open();
                DataTable data
= connection.GetSchema("TABLES");
                connection
.Close();
                
//foreach (DataColumn column in data.Columns)  
                //{  
                //    Console.WriteLine(column.ColumnName);  
                //}  

                return data;
            }
        }

  第二个方法是IsTableExist,判断SQLite数据库重某个表是否存在。

/// <summary>  
        /// 判断SQLite数据库表是否存在  
        /// </summary>  
        /// <param name="dbPath">要创建的SQLite数据库文件路径</param>  
        public bool IsTableExist(string tableName)
        {
            using (SQLiteConnection connection
= new SQLiteConnection(connectionString))
            {
                connection
.Open();
                using (SQLiteCommand command
= new SQLiteCommand(connection))
                {

                    command
.CommandText = "SELECT COUNT(*) FROM sqlite_master where type='table' and name='" + tableName + "'";
                    int iaaa
= Convert.ToInt32(command.ExecuteScalar());
                    
if (Convert.ToInt32(command.ExecuteScalar()) == 0)
                    {
                        
return false;
                    }
                    
else
                    {
                        
return true;
                    }
                }
            }
        }

  第三个方法是Query,执行查询语句,返回DataSet。

/// <summary>
        /// 执行查询语句,返回DataSet
        /// </summary>
        /// <param name="SQLString">查询语句</param>
        /// <returns>DataSet</returns>
        public DataSet Query(string SQLString)
        {
            using (SQLiteConnection connection
= new SQLiteConnection(connectionString))
            {
                DataSet ds
= new DataSet();
                
try
                {
                    connection
.Open();
                    SQLiteDataAdapter command
= new SQLiteDataAdapter(SQLString, connection);
                    command
.Fill(ds, "ds");
                }
                
catch (System.Data.SQLite.SQLiteException ex)
                {
                    
throw new Exception(ex.Message);
                }
                
return ds;
            }
        }

 

0
相关文章