如何高效使用SQLite事务 .net (C#)

转载 2012年03月26日 21:29:50

今天有个朋友测试 SQLite,然后得出的结论是:
SQLite 效率太低,批量插入1000条记录,居然耗时 2 分钟!
下面是他发给我的测试代码。我晕~~~~~~ 

using System.Data;
using System.Data.Common;
using System.Data.SQLite;

// 创建数据库文件
File.Delete("test1.db3");
SQLiteConnection.CreateFile("test1.db3");

DbProviderFactory factory = SQLiteFactory.Instance;
using (DbConnection conn = factory.CreateConnection())
{
  // 连接数据库
  conn.ConnectionString = "Data Source=test1.db3";
  conn.Open();

  // 创建数据表
  string sql = "create table [test1] ([id] INTEGER PRIMARY KEY, [s] TEXT COLLATE NOCASE)";
  DbCommand cmd = conn.CreateCommand();
  cmd.Connection = conn;
  cmd.CommandText = sql;
  cmd.ExecuteNonQuery();

  // 添加参数
  cmd.Parameters.Add(cmd.CreateParameter());
  
  // 开始计时
  Stopwatch watch = new Stopwatch();
  watch.Start();
  
  // 连续插入1000条记录
  for (int i = 0; i < 1000; i++)
  {
    cmd.CommandText = "insert into [test1] ([s]) values (?)";
    cmd.Parameters[0].Value = i.ToString();

    cmd.ExecuteNonQuery();
  }

  // 停止计时
  watch.Stop();
  Console.WriteLine(watch.Elapsed);
}


哎~~~~ 一个常识性的错误,我加几行代码 (新增代码标记 "// <-------------------")。

using System.Data;
using System.Data.Common;
using System.Data.SQLite;

// 创建数据库文件
File.Delete("test1.db3");
SQLiteConnection.CreateFile("test1.db3");

DbProviderFactory factory = SQLiteFactory.Instance;
using (DbConnection conn = factory.CreateConnection())
{
  // 连接数据库
  conn.ConnectionString = "Data Source=test1.db3";
  conn.Open();

  // 创建数据表
  string sql = "create table [test1] ([id] INTEGER PRIMARY KEY, [s] TEXT COLLATE NOCASE)";
  DbCommand cmd = conn.CreateCommand();
  cmd.Connection = conn;
  cmd.CommandText = sql;
  cmd.ExecuteNonQuery();

  // 添加参数
  cmd.Parameters.Add(cmd.CreateParameter());
  
  // 开始计时
  Stopwatch watch = new Stopwatch();
  watch.Start();
  
  DbTransaction trans = conn.BeginTransaction(); // <-------------------
  try 
  {
    // 连续插入1000条记录
    for (int i = 0; i < 1000; i++)
    {
      cmd.CommandText = "insert into [test1] ([s]) values (?)";
      cmd.Parameters[0].Value = i.ToString();

      cmd.ExecuteNonQuery();
    }

    trans.Commit(); // <-------------------
  }
  catch
  {
    trans.Rollback(); // <-------------------
    throw; // <-------------------
  }

  // 停止计时
  watch.Stop();
  Console.WriteLine(watch.Elapsed);
}

执行一下,耗时 0.2 秒。这差距是不是太大了点?

为什么只是简单启用了一个事务会有这么大的差距呢?很简单,SQLite 缺省为每个操作启动一个事务,那么原代码 1000 次插入起码开启了 1000 个事务,"事务开启 + SQL 执行 + 事务关闭" 自然耗费了大量的时间,这也是后面显示启动事务后为什么如此快的原因。其实这是数据库操作的基本常识,大家要紧记,不好的代码效率差的不是一点半点。

在c#中使用sqlite的两个注意点

在C#中使用sqlite,遇到了找不到SQLite.Interop.dll。窗体设计器不能打开。 怀疑过代码是否支持x64,还是其他mode。换了很多sqlite版本,包括nuget. Insta...

C# SQLite数据库 访问封装类

在客户端配置文件节点下,添加: 其中【localdb】是本地SQLite数据库的名称,【config/local.db】是在当前程序运行目录下SQLite数据库位置C# SQLite数据库  访问...

C#对SQLite的常用操作

Author: Kagula Date: 2013-2-18   环境 [1]Visual Studio 2010 Ultimate with SP1 正文 准备工作   从参考资料中下...

sqlite的事务和锁,很透彻的讲解 【转】

原文:sqlite的事务和锁 http://3y.uu456.com/bp-877d38906bec097sf46se240-1.html事务事务定义了一组SQL命令的边界,这组命令或者作为一个整体...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Sqlite笔记3--C#中事务支持

在C#中使用Sqlite增加对transaction支持

C#使用System.Data.SQLite操作SQLite

使用System.Data.SQLite 下载地址:http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki 得...
  • whChina
  • whChina
  • 2016年05月16日 09:36
  • 2518

Sqlite事务理解

大家在使用sqlite的时候应该都知道每一条操作都是通过一个SQL语句来完成的,例如: SQLiteDatabase db = ...; db.execSQL("insert into person...
  • chuwe1
  • chuwe1
  • 2016年06月02日 09:47
  • 1096

使用事务操作SQLite数据批量插入

在开发过程中,有时候需要批量写入数据的情况,发现传统的插入数据模式非常慢,几千条数据的写入或者更新可能需要好几分钟时间 就是采用事务提交,默认SQLite的数据库插入操作,如果没有采用事务的话,它每...

SQLite 外键 级联更新 删除

自身关联 CREATE TABLE Business (ID varchar(50) NOT NULL PRIMARY KEY,Name varchar(200) NOT NULL,"Parent_...
  • jjhua
  • jjhua
  • 2012年06月28日 19:47
  • 6068
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何高效使用SQLite事务 .net (C#)
举报原因:
原因补充:

(最多只允许输入30个字)