最近开发一个数据展示、处理的一个管理类网站,开始没有考虑数据量问题,测试才发现,当excel数据导入数据库的时候,随着数据量的增加,越来越慢。慢的难易理解。
通过网上查找发现事务在数据库中是一个重要的概念,使用事务可以保证数据的统一和完整性。同时也可以提高效率。那么,如何启动,提交事务呢?以我当前用的SQLite3数据库为例:
1、之前的数据库执行语句代码:(没有启用事务)
#region 执行简单SQL语句
/// <summary>
/// 执行SQL语句,返回影响的记录数
/// </summary>
/// <paramname="SQLString">SQL语句</param>
/// <returns>影响的记录数</returns>
public static int ExecuteSql(stringSQLString)
{
using(SQLiteConnection connection = new SQLiteConnection(connectionString))
{
using (SQLiteCommand cmd = new SQLiteCommand(SQLString, connection))
{
try
{
connection.Open();
int rows = cmd.ExecuteNonQuery();
return rows;
}
catch (System.Data.SqlClient.SqlException e)
{
connection.Close();
connection.Dispose();
throw e;
}
}
}
}
2、修改后的代码启用事务处理
//声明一个连接对象
private SQLiteConnectiondbConnection;
/// 声明一个操作数据库命令
privateSystem.Data.SQLite.SQLiteCommand dbCommand;
/// 声明一个读取结果集的一个或多个结果流
privateSystem.Data.SQLite.SQLiteDataReader dbRreader;
/// 声明一个事务处理对象
private DbTransaction trans;
publicstatic string connectionString =ConfigurationManager.ConnectionStrings["sqlite"].ConnectionString;
//连接数据库
//connectionString- 连接字符串
public bool OpenSqlite()
{
try
{
dbConnection = new SQLiteConnection(connectionString);
dbConnection.Open();
}
catch(Exception e)
{
string temp1 = e.ToString();
return false;
}
returntrue;
}
//关闭数据库连接
public void CloseSqlite()
{
if(dbCommand != null)
{
dbCommand.Dispose();
}
dbCommand = null;
if(dbRreader != null)
{
dbRreader.Dispose();
}
dbRreader =null;
if(dbConnection != null)
{
dbConnection.Close();
}
dbConnection= null;
}
//开启事务
public void SqliteBegin()
{
trans =dbConnection.BeginTransaction();
}
//提交事务
public void SqliteCommit()
{
trans.Commit();
}
/// 执行查询sqlite语句操作
public SQLiteDataReaderExecuteQuery(string sqlQuery)
{
dbCommand =dbConnection.CreateCommand();
dbCommand.CommandText = sqlQuery;
dbRreader =dbCommand.ExecuteReader();
returndbRreader;
}
//应用介绍
SqliteDB.OpenSqlite();//连接数据库
SqliteDB.BeginTransaction();//开启事务
SqliteDB.ExecuteQuery(SQLstr);//执行SQL语句
SqliteDB.Commit();//注意关闭数据库连接之前一定要提交
SqliteDB.CloseSqlite();//关闭数据库连接
为什么只是简单启用了一个事务会有这么大的差距呢?很简单,SQLite 缺省为每个操作启动一个事务,那么原代码 1000 次插入起码开启了上万个事务,"事务开启 + SQL 执行 + 事务关闭" 自然耗费了大量的时间,这也是后面显示启动事务后为什么如此快的原因。其实这是数据库操作的基本常识,大家要紧记,不好的代码效率差的不是一点半点。