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

解决SqlTransaction用尽的问题(SQL处理超时)有时候程序处理的数据量比较小时,四平八稳,一切安然无恙,但数据量一大,原先潜伏的问题就暴露无遗了。原访问数据库的代码为: 1SqlConnection conn = new SqlConnection(strConn); 2conn.Open(); 3SqlTransaction trans = conn.BeginTransaction(); 4try 5{ 6    CEngine.Exe…

大家好,又见面了,我是你们的朋友全栈君。

有时候程序处理的数据量比较小时,四平八稳,一切安然无恙,但数据量一大,原先潜伏的问题就暴露无遗了。
原访问数据库的代码为:

 1
None.gif
SqlConnection conn 
=
 new SqlConnection(strConn);

 2
None.gifconn.
Open
();

 3
None.gifSqlTransaction trans 
=
 conn.BeginTransaction();

 4
None.giftry

 5
None.gif{


 6
None.gif    CEngine.ExecuteNonQuery(trans,CommandType.
Text
,sql);

 7
None.gif    trans.
Commit
();

 8
None.gif}

 9
None.gifcatch(SqlException ex)

10
None.gif{


11
None.gif    trans.
Rollback
();

12
None.gif    ErrorCode 
=
 ex.
Number
;

13
None.gif    Info 
=
 “数据操作失败:” 
+
 ex.Message;

14
None.gif}

15
None.giffinally

16
None.gif{


17
None.gif    trans.Dispose();

18
None.gif    conn.
Close
();

19
None.gif} 

20
None.gif

21
None.gif

22
None.gif

运行时,一旦出现数据量过大或者处理时间较长,则系统会提示
出错。错误提示为“
SqlTransaction
已经用完;它再也不能使用。
”

开始时,我怀疑是跟内存有关。因为系统需要做好事务回滚的准备,每执行一条插入或修改的SQL,都要有一定的开销,数据量一大,恐怕就吃不消了。不过我查了一下SQL SERVER的资料,未见提到内存的问题。
后来想到,数据库连接SqlTransaction有个时间问题。默认是15秒。数据量大的时候,这个时间很可能就不够了。于是改为:

 1
None.gif
SqlConnection conn 
=
 new SqlConnection(strConn);

 2
None.gifconn.
Open
();

 3
None.gifSqlTransaction trans 
=
 conn.BeginTransaction();

 4
None.giftry

 5
None.gif{


 6
None.gif    SqlCommand cmd 
=
 new SqlCommand();

 7
None.gif    cmd.CommandType 
=
 CommandType.
Text
;

 8
None.gif    
//
连接时限改为300秒

 9
None.gif    cmd.CommandTimeout 
=
 
300
;

10
None.gif    cmd.CommandText 
=
 sql;

11
None.gif    cmd.Connection 
=
 conn;

12
None.gif    cmd.
Transaction
 
=
 trans;

13
None.gif    cmd.ExecuteNonQuery();

14
None.gif    trans.
Commit
();

15
None.gif}

16
None.gifcatch(SqlException ex)

17
None.gif{


18
None.gif    trans.
Rollback
();

19
None.gif    ErrorCode 
=
 ex.
Number
;

20
None.gif    Info 
=
 “数据操作失败:” 
+
 ex.Message;

21
None.gif}

22
None.giffinally

23
None.gif{


24
None.gif    trans.Dispose();

25
None.gif    conn.
Close
();

26
None.gif}

修改后在测试,问题解决:)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/145004.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux下搭建kafka集群,linux系统zk+Kafka集群搭建

    linux下搭建kafka集群,linux系统zk+Kafka集群搭建Kafka集群搭建与配置准备工作安装java环境搭建zookeeper集群搭建kafka集群1.准备工作1.1安装包1.2准备至少3台主机(ubuntu系统)如果没有物理机,也可以弄3台虚拟机。ubuntu系统不会安装的话可以自己百度哦,这里就不细说了。作者用的是虚拟机,下面是3台电脑的配置主机名IP地址硬件配置kafka-1192.168.1.424CPU、4G内存、128G存储kafka…

    2022年4月29日
  • [排序算法]–冒泡排序的三种实现(Java)

    [排序算法]–冒泡排序的三种实现(Java)冒泡排序是非常好理解的,以从小到大排序为例,每一轮排序就找出未排序序列中最大值放在最后。设数组的长度为N:(1)比较前后相邻的二个数据,如果前面数据大于后面的数据,就将这二个数据交换。(2)这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置。(3)N=N-1,如果N不为0就重复前面二步,否则排序完成。以上就是冒泡排序的基本思想,按照这个定义很快就能写

    2022年6月22日
  • releasecapture 函数_整理怎么解释

    releasecapture 函数_整理怎么解释setCapture一.什么是setCapture函数?MDN解释:在处理一个mousedown事件过程中调用这个方法来把全部的鼠标事件重新定向到这个元素,直到鼠标按钮被释放或者document.releaseCapture()被调用。函数作用:程序中主要是要捕获onmousemove和onmouseup事件语法:element.setCapture(retargetToElement);如果被设置为true,所有事件被直接定向到这个元素;如果是false,事件也可以在这

    2022年5月3日
  • 计算机代码1e1代表什么意思,热水器上显示E1是什么意思

    计算机代码1e1代表什么意思,热水器上显示E1是什么意思再好的产品也有可能会出现故障,如果家里的壁挂炉出现故障了,显示了一些字母代码,你知道这些字母代码是什么意思吗?又该采取什么措施去解决呢?下面小编总结了一些品牌壁挂炉的故障代码,供大家参考。威能壁挂炉威能燃气壁挂炉运行时吐过发生故障,显示屏上会出现一个故障代码,多个代码交替出现,则说明是同时发生了多个故障。威能壁挂炉故障代码含义解析:F.0含义:供水温度传感器(NTC)故障原因:NTC故障,…

    2022年5月30日
  • 【windows屏幕扩展】把你多余屏幕利用起来,spacedesk屏幕扩展超低延迟解决方案[通俗易懂]

    【windows屏幕扩展】把你多余屏幕利用起来,spacedesk屏幕扩展超低延迟解决方案[通俗易懂]目录扫盲扫盲spacedesk是一款基于TCP/IP协议的屏幕扩展工具,通过这款工具你可以把自己身边的闲置的平板手机或者笔记本利用起来,扩展你的屏幕。只要你的两台设备处于同一个网络环境下(只要互相能够ping通),你就可以实现屏幕扩展(卡不卡我就不知道了)。用过win10中的wifi扩展屏幕的同学都知道,扩展的屏幕显示质量和网络环境成正比。而win10的屏幕扩展很玄学,…

    2022年8月13日
  • tar命令的详解

    tar命令的详解

    2021年12月6日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号