数据库Sqlite3在C#中的应用问题的解决(从死锁到性能成千上万倍的提升)

      初次使用Sqlite数据库,发现数据量大于200条数据的集中插入就会发生死锁,都准备放弃使用Sqlite3了,以下的程序就是会造成死锁的

                SQLiteConnection conn = new SQLiteConnection(connectString);
                SQLiteCommand cmd = new SQLiteCommand();
                conn.Open();
                sql = "INSERT INTO testtable values(1,2,3,4,5)";
                for (int i = 1; i<= 1330; i++)
                {
                    cmd.CommandText = sql;
                    cmd.ExecuteNonQueryAsync();
                 
                }

    当然,测试前,先要建好testtable表,插入100条记录,有时是5秒,长的时候,都到了48秒,关键是根本没法用,经常还死锁,网上有太多的文章写死锁的解决办法,这样的插入效率,即使解决了死锁,又怎么能用?

            cmd.CommandText = "PRAGMA synchronous = OFF";
            cmd.ExecuteNonQuery();

     以上两条语句,关掉同步的选项,彻底解决了死锁的问题,而且插入1330条数据不到200ms, 和原来相比是质的飞跃,Sqlite2这个默认值是NORMAL,而Sqlite3这个的默认值是FULL,默认值设为FULL,对于初学者真是一个大坑

    为了进一步提高效率,对于这种集中操作,采用事务,1330条数据的插入,才用了9ms, 示例程序如下:

                SQLiteConnection conn = new SQLiteConnection(connectString);
                SQLiteCommand cmd = new SQLiteCommand();
                conn.Open();

                // 使用事务测试
                IDbTransaction trans = conn.BeginTransaction();

                sql = "INSERT INTO testtable values(1,2,3,4,5)";
                for (int i = 1; i<= 1330; i++)
                {
                    cmd.CommandText = sql;
                    cmd.ExecuteNonQueryAsync();
                 
                }

                trans.Commit();

     若要进一步提升效率,还可以使用SQL语句的预编译,SQL语句采用参数等办法,我也不想再试了,这个效率对我来说己经足够使用了

     为了解决Sqlite的问题,花了我两天的时间,还花C币下载了无数没有用的解决死锁的办法,如果你也遇上同样的困扰,这篇文章能帮到你,我不需要C币,给个赞

  • 11
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值