数据库连接池关闭的时间

上一篇说到分析关闭连接与不关闭连接的性能,到后来我发现自己得出的结论有误。经过多次测试发现关闭连接和不关闭连接耗费的时间基本一样。进哥也说了这是有连接池的原因。其实,自己以前对Ado.net了解的不深,于是就到网上搜了下连接池。发现好多文章都差不多,现在网上文章到处转载啊。ASP.NET数据库连接池设置浅析就是一篇,话说里面关于连接池关闭的时间是这样描述的

2.何时关闭连接池?

当连接池中的所有连接都已经关闭时关闭连接池。

看了之后我也迷糊了,在我的程序中也没有其他的连接:

public static  void InsertError() {
    SqlConnection conn = new SqlConnection(connString);
    string cmdtxt = "INSERT INTO [NcuhomeORG].[dbo].[SysErrorLogs]([ErrorLogID],[ErrorMsg] ,[ErrorUrl],[ErrorDatetime])VALUES (1,'hahah','fffff','2009-12-26 11:33:08')";
    SqlCommand cmd = new SqlCommand(cmdtxt, conn);
    conn.Open();
    cmd.ExecuteNonQuery();
    conn.Close();
}

上面程序一直在循环执行(如有不清楚可以查看上一盘文章),而且每次都关闭了连接,那岂不是每次都要创建连接池。

在我之前的测试中我发现,每次我重启电脑之后的第一次运行程序的时间一定比其他的时间长,我想在是这是创建连接池花费了很多时间。相比之下每次new SqlConnection(),并执行SQl操作所需的时间只要创建连接池的十分之一时间。

现在基本上确定了那篇文章关于连接池关闭的时间是错误的,于是我就在想连接池到底是在什么时候关闭的。也提出了些想法:

  • 在所有连接关闭之后的一定时间内关闭;
  • 应用程序关闭的时候关闭;

那么我也就开始测试了,我在每次执行过方法后让进程阻塞。5s,10s,20s,发现多没有明显的变化。纠结,我总不能去测试1h吧。就这样我暂时放弃了这个测试。

在应用程序结束的时候关闭,不就是关闭浏览器吗?简单,但是测试了好多次发现运行时间没有明显的差距。不是这个问题了。

最后还是到网上去找连接池关闭的时间,查看官方的文档吧:了解连接池。这篇文章里讲了连接池关闭的时间:

连接的移除

如果连接长时间空闲,或池进程检测到与服务器的连接已断开,连接池进程会将该连接从池中移除。请注意,只有在尝试与服务器进行通信后,才可以检测到这种情况。如果发现某连接不再连接到服务器,则会将其标记为无效。连接池管理程序会定期扫描连接池,查找已释放到池中并标记为无效的对象。找到后,这些连接将被永久移除。

如果存在一个与已消失的服务器的连接,如果连接池进程尚未检测到断开的连接并将连接标记为无效,可以从池中提取此连接。当发生这种情况时,将生成异常。但是,为了将该连接释放回池中,仍必须将其关闭。

连接池的问题算是解决了,我又有了问题,可这是概念理解的问题:

protected void Page_Load(object sender, EventArgs e) {
    Action c = () => tests();
    test.Profile(c, 15);
}
protected void tests() {
    SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["NcuhomeORGConnectionString"].ConnectionString);
    if (conn.State != ConnectionState.Open)
        conn.Open();
    else
    {
        Response.Write("不用连接<br />");
    }
}     

最终页面一篇空白,我那时候是不明白啊。这里想到了,没有关闭的连接就一直占用着的,于是在new的时候肯定是一个新的连接了。也就是说每次new出来的SqlConnection的状态一定是关闭的。也就想到了上一篇文章的测试没有用啊,在连接之前判断反而是画蛇添足啊!

以上的内容是个人见解,如有任何意见或见解希望能提出来!

转载于:https://www.cnblogs.com/lvfei/archive/2009/12/26/1632921.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值