当前位置:首页 > 软件开发 > dev
firefox

解决SqlTransaction用尽的问题(SQL处理超时)

有时候程序处理的数据量比较小时,四平八稳,一切安然无恙,但数据量一大,原先潜伏的问题就暴露无遗了。
原访问数据库的代码为:
 1sqlconnection conn = new sqlconnection(strconn);
 2conn.open();
 3sqltransaction trans = conn.begintransaction();
 4try
 5{
 6    cengine.executenonquery(trans,commandtype.text,sql);
 7    trans.commit();
 8}
 9catch(sqlexception ex)
10{
11    trans.rollback();
12    errorcode = ex.number;
13    info = "数据操作失败:" + ex.message;
14}
15finally
16{
17    trans.dispose();
18    conn.close();
19}
20
21
22
运行时,一旦出现数据量过大或者处理时间较长,则系统会提示出错。错误提示为“sqltransaction已经用完;它再也不能使用。”

开始时,我怀疑是跟内存有关。因为系统需要做好事务回滚的准备,每执行一条插入或修改的sql,都要有一定的开销,数据量一大,恐怕就吃不消了。不过我查了一下sql server的资料,未见提到内存的问题。
后来想到,数据库连接sqltransaction有个时间问题。默认是15秒。数据量大的时候,这个时间很可能就不够了。于是改为:
 1sqlconnection conn = new sqlconnection(strconn);
 2conn.open();
 3sqltransaction trans = conn.begintransaction();
 4try
 5{
 6    sqlcommand cmd = new sqlcommand();
 7    cmd.commandtype = commandtype.text;
 8    //连接时限改为300秒
 9    cmd.commandtimeout = 300;
10    cmd.commandtext = sql;
11    cmd.connection = conn;
12    cmd.transaction = trans;
13    cmd.executenonquery();
14    trans.commit();
15}
16catch(sqlexception ex)
17{
18    trans.rollback();
19    errorcode = ex.number;
20    info = "数据操作失败:" + ex.message;
21}
22finally
23{
24    trans.dispose();
25    conn.close();
26}
修改后在测试,问题解决:)

 ↓相关文章:
© 2006-2008 All Rights Reserved