最近接触了一段时间的 Sqlite3 数据库,越来越喜欢这个轻巧的数据库了。其优点是不需要安装,体积小;程序中使用也不需服务器安装额外的驱动程序,这点在嵌入式开发中优势显而易见; 不过对于用惯了图形化界面操作的我来说,刚开始还不太习惯,操作尤其不方便;在网上看了一下资料,大致说其性能是和 Access 有得一拼(基本上是处于一个数量级上);我在想:对于一个用户几百万的网站来说能不能使用这一轻量级的数据库呢?我觉得可行。在数据库调优中我们常见的是分库分表,这个完全可以用于 Sqlite3 上,我的思路是:比如站点共有100万用户, 有一个要求是用户的每个动作都要记录,例如每发表一篇博文,都要记录其发布时间,发布 ip等信息, 而这个信息在其个人动态中展示出来,这个时候我们可以设计一个库出来: templateDB.db3 : 其中一个表结构如下(sample):
假如某个用户的 userid = 1051170 ; 那么我们可以通过一定的算法: userid/1000 = (int)1051 (意即每个 db 只服务于 1000 个用户的某些模块)将其放在 /data/action_1051.db3 中,在做插入之前检查一下 该库是否存在,如不存在则拷贝一份 templatedb 到为目标库;这样能很大程度上减少了数据并发带来的锁问题,减轻主数据库服务压力。
当然这样的设计也有不足之处:假如在投入实际生产过程一段时间后 ,我们需要改变表的某些结构或增加某个模块,这个改动将是灾难性的。
最后附上使用笔记(我使用的是 ms Entlib 4.1框架 + vs 2008 ):
1. 到官方网站下载 http://www.sqlite.org/ 下载 sqlite3 并创建数据库及表;
2. 到 http://sqlite.phxsoftware.com/ 上下载 System.Data.SQLite.dll ,然后在项目中添加引用;
3. web.config 配置
2 < add name = " sqlite " connectionString = " data source= E:/workspace/CSharpTest/SQLiteApp/App_Data/userscore.db " providerName = " System.Data.SQLite " />
3 </ connectionStrings >
4
4. 查询:
2 Database db = DatabaseFactory.CreateDatabase( " sqlite " );
3 string sql = " select * from userAction " ;
4 DataSet ds = db.ExecuteDataSet(CommandType.Text, sql);
5 if (ds != null )
6 {
7 if (ds.Tables[ 0 ].Rows.Count > 0 )
8 {
9 gdvlist.DataSource = ds;
10 gdvlist.DataBind();
11 }
12 }
13 }
14
5. 增加数据:
2 {
3 Database db = DatabaseFactory.CreateDatabase( " sqlite " );
4 string sql = " insert into userAction(userid, username,nickname, scoretype, score, content, addip) "
5 + " values(@userid, @username,@nickname, @scoretype, @score, @content, @addip) " ;
6 DbCommand cmd = db.GetSqlStringCommand(sql);
7 db.AddInParameter(cmd, " @userid " , DbType.String, int .Parse(tbuid.Text) );
8 db.AddInParameter(cmd, " @username " , DbType.String, tbuserName.Text);
9 db.AddInParameter(cmd, " @nickname " , DbType.String, tbnick.Text);
10 db.AddInParameter(cmd, " @scoretype " , DbType.String, tbsctype.Text );
11 db.AddInParameter(cmd, " @score " , DbType.Int32, int .Parse( tbscore.Text) );
12 db.AddInParameter(cmd, " @content " , DbType.String, tbcontent.Text);
13 db.AddInParameter(cmd, " @addip " , DbType.String, Request.UserHostAddress);
14 db.ExecuteNonQuery(cmd);
15 Response.Write( " 成功! " );
16 bind();
17 }
18
效果:
呵...和其他数据库操作没有两样。