初次使用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币,给个赞