• 用Sqlite3 构建中小型网站数据库


         最近接触了一段时间的 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 配置

    1     <connectionStrings>
    2         <add name="sqlite" connectionString="data source= E:/workspace/CSharpTest/SQLiteApp/App_Data/userscore.db" providerName="System.Data.SQLite"/>
    3     </connectionStrings>
    4 

    4. 查询:

    查询数据
     1         private void bind() {
     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. 增加数据:

    插入数据
     1         protected void Button1_Click(object sender, EventArgs e)
     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 


    效果:

    呵...和其他数据库操作没有两样。







  • 相关阅读:
    sublime使用及插件
    Unity 查找
    Unity 3D 的四种坐标系
    C#知识点<4>
    C#知识点<3>
    C#知识点<2>
    排序算法
    OOP的三大特性------封装、继承、多态
    C#常用函数
    C++-------------类和对象
  • 原文地址:https://www.cnblogs.com/infozero/p/1618202.html
Copyright © 2020-2023  润新知