Sleeping会话导致阻塞原理(上)
背景
我在处理客户问题的时候,客户经常搞不懂sleeping 的由来,和他可能导致的问题。下面来详细说下
什么是sleeping
其实我们经常可以在数据库中看到“”sleeping“状态的连接,但是这个sleeping 的状态是怎么来的,如果有很多sleeping状态的连接对数据库有什么影响吗?sleeping 代表建立了数据库连接,但是,程序段没有发出SQL命令. 因为很多应用程序为了减少打开和关闭连接的开销,在完成数据库中的操作后,仍然保持数据库的连接。这些连接最主要的目的是重用。举例:如果一个应用程序使用数据库连接提取数据,如果已经存在一个连接可以重用,那么建立连接的消耗当然能够最小化。那么,维护大量的sleeping连接会是一种开销吗?虽然,它相对来说是比较低的,但的确也是有开销的。如果代码编写的合适,我们不应该看到大量的sleeping连接。
举个栗子
新建一个控制台应用程序,先加入下面的代码
1.建立连接并打开
SqlConnection sqlConnection = new SqlConnection("Server=(local);Database=Mydb;UId=test;Pwd=password;");
sqlConnection.Open();
查看数据库会看到,此时就会出现SLEEPING状态。这就是建立了连接但是没有发出任何SQL命令

2.SQL执行语句完成
我们执行下面的代码 。在执行的过程中可能有(running,suspened,runnale状态)等他执行完。查看数据库中的状态变为sleeping.
SqlCommand sqlCommand = new SqlCommand("select name from dbo.Student", sqlConnection);
sqlCommand.ExecuteScalar();

问题
到目前为止,sleepig是怎么来的应该很清楚了,,但他可能到导致的问题是什么呢。具体看下面案例,
会话77就是sleeping操作,他阻塞了会话81,81又阻塞了75. 看看等待时间,,有点不忍直视了,数学好的同学可以数一下。

这个问题怎么产生的呢? 其实就是在运行 sqlCommand.ExecuteScalar(); 的时候开启了事务,但是这个语句由于超时或者查询被取消了,会话变成了sleeping状态。但是事务在数据库中中还是开启的状态。
解决
通过查看上面图中的工具,查看77 执行的语句,定位对应到程序中的代码段,然后进行下面的改善措施:
1.在代码中加入try catch的异常处理,在处理的的代码中加入 :IF @@TRANCOUNT > 0 ROLLBACK TRAN
2.找到对应的执行的SQL,找出他执行超时的原因加以解决。
3.使用 SET XACT_ABORT ON; 他表示 如果执行 Transact-SQL 语句产生运行时错误,则整个事务将终止并回滚。
Sleeping会话导致阻塞原理(上)的更多相关文章
- Sleeping会话导致阻塞原理(下)
背景 最近给客户做优化时,有几个客户都存在.SLEEPING 会话中开启了事务,导致的大量阻塞,从而产生严重的性能问题.虽然在之前的文章我分享了Sleeping会话导致阻塞原理(上) .说明了什么是S ...
- JEP 尝鲜系列 3 - 使用虚线程进行同步网络 IO 的不阻塞原理
相关 JEP: JEP 353 Reimplement the Legacy Socket API JEP 373 Reimplement the Legacy DatagramSocket API ...
- 从原理上搞定编码(二)-- Web编码
周末宅在家里睡完觉就吃饭,吃完饭接着睡觉,这日子过的实在是没劲啊.明明还有计划中的事情没有做, 为什么就是不想去做呢,这样的生活持续下去,必然会成为一个彻头彻尾的loser.上一篇写的 初识编码 ,这 ...
- SQL Server Sleeping会话占用内存资源浅析?
在SQL Server中,会话的状态有运行(Running).睡眠(Sleeping).休眠(Dormant).Preconnect 等状态,有时候你会在数据库中看到很多会话处于睡眠(Sleepi ...
- java web Session会话技术(原理图解+功能+与Cookie的区别+基本使用)
java web Session会话技术(原理图解+功能+与Cookie的区别+基本使用) 这是我关于会话技术的第二篇文章,对 Cookie有不了解的兄弟可以点击下方的Cookie跳转 Cookie链 ...
- 从原理上理解MySQL的优化建议
从原理上理解MySQL的优化建议 预备知识 B+树索引 mysql的默认存储引擎InnoDB使用B+树来存储数据的,所以在分析优化建议之前,了解一下B+树索引的基本原理. 上图是一个B+树索引示意图, ...
- AJAX练习(一):制作可以自动校验的表单(从原理上分析ajax的作用)
继上文(AJAX(一)AJAX的简介和基础)作为联系. 传统网页在注册时检测用户名是否被占用,传统的校验显然缓慢笨拙. 当ajax出现后,这种体验有了很大的改观,因为在用户填写表单时,签名的表单项已经 ...
- VIM从原理上认识^M问题
问题背景 VIM在打开文件的时候如果遇到两种换行符风格(dos与unix)共存的文件,通常会在行尾显示出烦人的^M.如果^M较少,比较容易定位到哪几行出了问题,但是如果^M较多,就很难搞.下面先给出解 ...
- 从原理上理解NodeJS的适用场景
NodeJS是近年来比较火的服务端JS平台,这一方面得益于其在后端处理高并发的卓越性能,另一方面在nodeJS平台上的npm.grunt.express等强大的代码与项目管理应用崛起,几乎重新定义了前 ...
随机推荐
- Linux 下解压 rar 文件
网上下载rar 压缩文件的使用,在linux在我们需要对其进行解压缩,这个时候,我们需要安装 rar相关的文件,来进行解压缩. 1. 下载 我们进入rarlab网站,进行下载 rar for linu ...
- Springboot系列:Springboot与Thymeleaf模板引擎整合基础教程(附源码)
前言 由于在开发My Blog项目时使用了大量的技术整合,针对于部分框架的使用和整合的流程没有做详细的介绍和记录,导致有些朋友用起来有些吃力,因此打算在接下来的时间里做一些基础整合的介绍,当然,可能也 ...
- opensuse编译安装Python3后缺少zlib
目录 opensuse编译安装Python3后缺少zlib 前言 编译安装 python导入zlib 重新编译python并指定zlib opensuse编译安装Python3后缺少zlib 前言 由 ...
- C#程序如何捕捉未try/catch的异常——不弹“XXX已停止工作”报错框
诚意满满直接上代码: static void Main(string[] args) { //Main函数中增加此句 AppDomain.CurrentDomain.UnhandledExceptio ...
- 数据库事务总结(一)-ACID
概述 数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作. 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源.通过将 ...
- Visual Studio内存泄露检測工具
使用简单介绍 在敲代码的过程中.难免会遇到内存泄露的时候.这个时候假设手工查找内存泄露,不说方法没有通用的,就是真的要自己手工查找也是非常耗时间和精力的.诚然.我们能够借助一些工具,并且我们还 ...
- Moleskine智能笔+专用本:写完随时传到手机
http://www.totiot.com/61805.html Moleskine公司生产的速写本和速写板一直是涂鸦爱好者和速记员们的首选.该公司还联合Adobe. Livescribe. Ever ...
- 企业案例--生产环节更改mysql字符集
查看数据库字符集: show database create dbname \G; 查看数据库表字符集: show table create tbname \G; 查看现有数据库字符集设置: show ...
- mysql 批量修改字段方法
一.正式环境操作注意事项: .关闭应用访问或者设置数据库只读 mysql设为只读方法: 开启只读: mysql> show global variables like "%read_o ...
- VC++环境下单文档SDI与OpenGL多视图分割窗口的实现-类似3DMAX的主界面
本文主要讲述如何在VC++环境下实现单文档SDI与OpenGL多视图分割窗口,最终的界面类似3DMAX的主界面.首先给出我实现的效果图: 整个实现过程网络上有很多零散的博文,请各位自行搜索,在基于对话 ...