[C#]记录一次异常排查,关于using语法、sqlserver数据库session、DBHelper类
最近在做一个基于asp.net和sqlserver的网站项目,发现网站运行一段时间之后,会报异常:
超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小
这异常明显是sqlserver数据库连接池超出了默认大小,估计是代码哪里忘了释放DB链接了。
排查数据访问层代码跟DBHelper,搞了半天解决了。
总结一点东西,记录一下。
DBHelperA代码:
public class DBHelperA
{
public string connStr = "你的sqlserver数据库连接"; public IDbConnection _conn; public IDbConnection Conn
{
get
{
if (_conn == null)
{
_conn = new SqlConnection(connStr);
}
return _conn;
}
}
}
ClassA代码:
public class ClassA :DBHelperA
{
public void DoItFirst()
{
using (Conn)
{
if (Conn.State == ConnectionState.Closed)
{
Conn.Open();
Console.WriteLine(Conn.GetHashCode());
}
}
} public void DoItSecond()
{
using (Conn)
{
if (Conn.State == ConnectionState.Closed)
{
Conn.Open();
Console.WriteLine(Conn.GetHashCode());
}
}
}
}
创建ClassA对象并调用两个方法:
public static void TestA()
{
for (int i = ; i < ; i++)
{
ClassA a = new ClassA();
a.DoItFirst();
a.DoItSecond();
Console.WriteLine(i);
}
Console.ReadLine();
}
以上代码乍一看没啥问题,但是一运行,会在 a.DoItSecond()方法抛出异常:ConnectionString属性未初始化
这是因为,在执行完DoItFirst()方法之后,using语句释放了Conn对象占用的资源,但是Conn对象并不为空
所以在执行DoItSecond()方法时,并不会重新创建Conn对象。导致还用那个已经释放了资源的Conn对象去打开数据库连接,导致异常的发生
DBHelperB代码:
public class DBHelperB
{
public string connStr = "你的sqlserver数据库连接"; public IDbConnection Conn
{
get
{
var conn = new SqlConnection(connStr);
Console.WriteLine(conn.GetHashCode());
return conn;
}
}
}
ClassB代码:
public class ClassB :DBHelperB
{
public void DoIt()
{
using (Conn)
{
if (Conn.State == ConnectionState.Closed)
{
Conn.Open();
Console.WriteLine(Conn.GetHashCode());
}
}
}
}
创建ClassB对象并调用方法:
public static void TestB()
{
for (int i = ; i < ; i++)
{
ClassB b = new ClassB();
b.DoIt();
Console.WriteLine(i);
}
Console.ReadLine();
}
执行抛出异常:
此时查看数据库的session连接,发现有100个连接:
这是因为DoIt方法中,每次对Conn对象的引用,都会返回一个新的连接,所以using语句打开和释放的不是同一个conn对象,导致数据库中创建了很多连接
DBHelperC代码:
public class DBHelperC
{
public string connStr = "你的sqlserver数据库连接";
}
ClassC代码:
public void DoIt()
{
using (var Conn = new SqlConnection(connStr))
{
if (Conn.State == ConnectionState.Closed)
{
Conn.Open();
Console.WriteLine(Conn.GetHashCode());
}
}
}
创建ClassC对象并调用方法:
public static void TestC()
{
for (int i = ; i < ; i++)
{
ClassC c = new ClassC();
c.DoIt();
Console.WriteLine(i);
}
Console.ReadLine();
}
执行代码,不会报任何异常。且数据库有且只有一个session
因为每次是在using语句块儿里面创建connection对象,using创建和释放的是同一个对象。
另外因为数据库的connectionString没有指定pooling参数,所以默认是启用连接池的。
所以c#代码中connection对象的创建与销毁不会影响sqlserver数据库中的对象。
每次代码创建connection对象,调用open()方法,数据库用的还都是连接池中第一次构建的那个session
现在我把连接字符串的pooling改成false
第一次循环时,数据库session创建时间
第一次循环跳出using语句之后,session没了
第二次循环,又重新创建了新的db session
综上所述:
在构造DBHelper类和数据库访问层的时候,一定要注意connection对象的释放。否则就会导致数据库中一堆的无效session
代码在这儿,有兴趣的可以试一下( 把数据库连接改成你自己的sqlserver数据库地址就可以了):
[C#]记录一次异常排查,关于using语法、sqlserver数据库session、DBHelper类的更多相关文章
- redis 异常排查
异常排查 redis-server redis.windows.conf D:\redis-2.8.17>redis-server.exe redis.windows.conf[4692] 27 ...
- PHP的日志记录-错误与异常记录
PHP的日志记录-错误与异常记录 提到 Nginx + PHP 服务的错误日志,我们通常能想到的有 Nginx 的 access 日志.error 日志以及 PHP 的 error 日志.虽然看起来是 ...
- CPU负载过高异常排查实践与总结
昨天下午突然收到运维邮件报警,显示数据平台服务器cpu利用率达到了98.94%,而且最近一段时间一直持续在70%以上,看起来像是硬件资源到瓶颈需要扩容了,但仔细思考就会发现咱们的业务系统并不是一个高并 ...
- SpringSecurity权限管理系统实战—八、AOP 记录用户、异常日志
目录 SpringSecurity权限管理系统实战-一.项目简介和开发环境准备 SpringSecurity权限管理系统实战-二.日志.接口文档等实现 SpringSecurity权限管理系统实战-三 ...
- 服务器 CPU 100% 异常排查实践与总结
一个执着于技术的公众号 问题背景 昨天下午突然收到运维邮件报警,显示数据平台服务器cpu利用率达到了98.94%,而且最近一段时间一直持续在70%以上,看起来像是硬件资源到瓶颈需要扩容了,但仔细思考就 ...
- sqlserver数据库脱机时发生异常:由于无法在数据库 'SMS' 上放置锁,ALTER DATABASE 失败。请稍后再试。 ALTER DATABASE 语句失败。 (.Net SqlClient Data Provider)
sqlserver数据库脱机时发生异常,如下: =================================== 设置脱机 对于 数据库“SMS”失败. (Microsoft.SqlServe ...
- jsp连接sqlServer数据库教程、jsp连接sqlServer数据库报ClassNotFoundException异常
jsp连接sqlServer数据库教程: 首先讲下我用的工具版本以供参考: jar包:jtds1.3.1.jar 下载地址:点击进入 数据库:SQL Server2012 服务器:Tomcat8.0 ...
- SQLServer数据库之SQL Server 获取本周,本月,本年等时间内记录
本文主要向大家介绍了SQLServer数据库之SQL Server 获取本周,本月,本年等时间内记录,通过具体的内容向大家展现,希望对大家学习SQLServer数据库有所帮助. datediff(we ...
- 【Redis连接超时】记录线上RedisConnectionFailureException异常排查过程
项目架构: 部分组件如下: SpringCloudAlibaba(Nacos+Gateway+OpenFeign)+SpringBoot2.x+Redis 问题背景: 最近由于用户量增大,在高峰时期, ...
随机推荐
- 决策树(Decision Tree)算法 python简单实现
"" """ import numpy as np from math import log import operator import json ...
- 树的性质——cf1244D
特别简单,只有链的形式才符合要求,那么枚举前两个点的颜色搞一下就可以 #include <bits/stdc++.h> using namespace std; ][],pos[],ok= ...
- spring之循环依赖问题如何解决
首先,spring是支持循环依赖的.但是循环依赖并不好. 最近,我在使用jenkins自动化部署,测试打出来的jar包,出现了循环依赖的问题. 在这里说一下,我解决问题的过程 我首先根据提示找到循环依 ...
- centos coreseek
下载稳定版 coreseek wget http://www.coreseek.cn/uploads/csft/3.2/coreseek-3.2.14.tar.gz 解压 .tar.gz cd cor ...
- [bzoj2287]消失之物 题解(背包dp)
2287: [POJ Challenge]消失之物 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1138 Solved: 654[Submit][ ...
- 导入安全证书到jdk
一:.导入证书 1.打开doc窗口,打开cmd,执行命令: keytool -import -file f:\ca.crt -keystore "%JAVA_HOME%\jre\lib\se ...
- scrapy主要防止封IP策略
scrapy如果抓取太频繁了,就被被封IP,目前有以下主要策略保证不会被封: 策略1:设置download_delay下载延迟,数字设置为5秒,越大越安全 策略2:禁止Cookie,某些网站会通过Co ...
- Dubbo入门到精通学习笔记(十):dubbo服务集群 、Dubbo分布式服务子系统的划分、Dubbo服务接口的设计原则
文章目录 dubbo服务集群 Dubbo服务集群部署 Dubbo服务集群容错配置--集群容错模式 1.Failover Cluster 失败自动切换,当出现失败,重试其它服务器.`(缺省) 通常用于读 ...
- git clone后切换分支,和远端的不一样。
原因 git clone后再master分支,切换后到了别的分支,分支里面的文件目录是不一样的,导致出现错误. 解决 删除原来的全部文件 git pull 可是git pull报错, git匹配的文件 ...
- Cuckoo架构
cuckoo在部署阶段,只在Guest系统里塞了一个agent,这个agent在运行阶段负责与Host端程序进行通信,从Host端接收sample, 整个客户端程序,以及配置文件. 在Host端主要的 ...