您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息
三六零分类信息网 > 娄底分类信息网,免费分类信息发布

关于数据库连接的一些小知识点

2025/10/20 10:45:51发布47次查看
由于在数据库连接部分,新建连接的时候一直报 出错原因:超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大
由于在数据库连接部分,新建连接的时候一直报“出错原因:超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。”于是,我便想查看一下数据库的活动连接,看看究竟是哪个程序占用了过多的数据库连接。
我们可以用sp_who(或sp_who2)来显示所有活动的连接。
use master;goexec sp_who2;go
查询的结果如表1。为了可读性,表1中的结果有删减了一些列和一些行。但删去的内容不影响我们要讲的东西。
表1 sp_who2查询的结果
从表1中,我们可以看到有很多进程状态(见status列)显示sleeping,并且当前正在执行的命令类型(见command)显示awating command。
     我们就有疑问,为什么有这么多的连接进程。首先,我们要明确一个概念,sql server 不会建立任何连接池,ado.net会。当我们在c#代码中打开一个数据库连接后,如果是首次连接,sqlclient就会打开一个sql server的连接。当我们从程序里面关闭这个连接时,sqlclient并不是真正地关闭了这个数据库的连接,而是延后一段时间才关闭,默认是60秒。如果你没有在指定延时内重新连接,sqlclient就真正地关闭这个连接。但如果你重连接了,sqlclient就会重用这个连接。这样子,我们就可以使用相同的连接属性。
     但是有几种可能的情况可能导致失败,也就是连接不能重用(或在指定的时间内没有关闭)。比如当你使用executereader的时候,没有成功地取回所有的行和结果集,继而在连接上没有将reader关闭,可能导致这个问题。
     常用的排查数据库连接问题的方法是运行sql server profiler(使用默认模板)。如果你看到一个audit login事件,就说明有一个新的连接已经被建立。如果你看到event rpc:completed with the text sp_reset_connection,这说明在连接池中的一个连接被重用。如果你一直没有看到任何的sp_reset_connection,那就意味着你遇到问题了。sql server profiler如图1所示。
图1 sql server profiler
补充知识:sp_who和 sp_who2的区别sp_who是官方支持的,有文档可查。sp_who2不是官方支持的,查不到对应的文档,但它更常被使用。他们返回相同的信息:提供有关 microsoft sql server 数据库引擎实例中的当前用户、会话和进程的信息。但是sp_who2额外添加了一些sp_who没有提供的列。并且,sp_who2中的信息更紧凑,更适合用文本来显示。kalman 写道:它增加了额外的spid列来增加结果的可读性.
后记:”超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小 这个问题可能是进行查询的时候,没有成功的查询造成的。比如说执行存储过程的时候,原来需要提供给存储过程3个参数,但你只提供了两个,这就会导致查询出现错误。当错误发生的时候,原先的数据库连接就不能成功被释放或重用,这就导致了ado.net要继续创建新的数据库连接,最终导致了线程池中达到了池本身能够容纳的指定连接数,最终导致新的连接不能继续在线程池中创建。
参考链接:sql server profiler使用方法sql server 2005联机丛书
sp_who, sp_who2和sp_who3
sleeping/awaiting command question
娄底分类信息网,免费分类信息发布

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product