当前位置:编程学习 > C#/ASP.NET >>

當我的網站程序出現有很多的connection連接沒關閉時,我該怎么辦?

如題,網站程序的connection滿了,很多都處於open狀態,我該怎么辦?
項目太大不能一個一個關閉。希望大俠給出個主意,謝謝! --------------------编程问答-------------------- 晕死
不是用的底层连的数据库???
难道每个页面都有连接数据库方法
应该写个底层专门操作数据库
那样就好改多了 --------------------编程问答-------------------- 我看你肯定到处写open 数据库的代码

应用找个操作数据库的基类,比如SqlHelper --------------------编程问答-------------------- 而且每一次操作都应该关闭数据库的啊
--------------------编程问答-------------------- 那個項目時由幾個程序員一起搞的,我時來接手的,他們之前都沒由數據庫底層的設計,現在出問題了,我得想辦法解決,希望大家幫忙出主意,謝謝
--------------------编程问答-------------------- 去找.open()吧,找到后一个一个的在后面添加关闭代码吧。。 --------------------编程问答-------------------- 不能用一些方法一次性搞定么?或者一個頁面一次性調用一個方法將它解決,有沒有這樣的代易做图? --------------------编程问答-------------------- 都用using --------------------编程问答--------------------
引用 2 楼 winner2050 的回复:
我看你肯定到处写open 数据库的代码 

应用找个操作数据库的基类,比如SqlHelper

封装个连接数据库的方法 --------------------编程问答-------------------- 假设你是使用的是ado.net(一般都是,例如SQLConnection来建立连接)。理想的编程结果是:你的程序中从来也不用显式关闭连接,从来也不出现“conn.Close();”这类代码!

使用using{}结构来确保正确地和及时地关闭了数据库连接。

如果你写:

using(SqlConnection conn=new SqlConnection(connstr))
{
    conn.Open();
    SQLCommand cmd=new SqlCommand(conn,sql);
    ........
}


这样,程序一旦离开using{}结构结尾,就会立刻去关闭数据库连接,不会拖延到GC回收conn这个变量时才关闭。即使运行中出现异常,也会立刻关闭数据库连接。


最后,你要看看剩下的有没有递归的地方反复创建新的数据库逻辑连接。例如有一个方法:

void abc(){
  .....
}

如果你认为它内部递归调用栈很深从而打开了许多的逻辑连接,那么你可以为另外写一个


void abc(DBConnection conn)
{
    .....
}

的方法,将外部的数据库逻辑连接作为参数传入,而不是在内部打开数据连接。

注意,此时不要删除原来的abc程序(可以改造为原来的无参数abc程序调用后边的这个abc方法)。而且,如果顺序地调用了无参数的abc达到1000次之多,由于SqlConnection是自动地维护缓冲池的,所以也无需这样改造。只有当方法内部的递归深度较深时才值得进行这样的改造。

对于使用OleDbConnection,写法类似。但是你要知道,它没有数据库连接缓冲池机制。如果你使用Jet数据库,那么你实际上是反复地打开数据库物理连接的。但是对Jet这样的嵌入式系统的建立数据库连接非常快,就算是反复地去建立物理连接也无需花代价去维护缓冲池。 --------------------编程问答-------------------- 没有,一个一个添加关闭吧. --------------------编程问答-------------------- 当你使用using{}结构时,你不需要写代码去Close()数据库(逻辑)连接,程序员就没有义务去写这条代码,避免了责任,反而比那些一味强调程序员要在思想上上非常重视去关闭连接的做法更加有效。 --------------------编程问答--------------------
引用 6 楼 mohuai 的回复:
不能用一些方法一次性搞定么?或者一個頁面一次性調用一個方法將它解決,有沒有這樣的代易做图?


不论怎么做,总之你是需要对每一个Open()数据库连接的地方动点手脚的。改造为using{}结构其实所添加的代码最少(只需要增加一个“Using”以及一对圆括号和中括号),而且得到的结果最直观。 --------------------编程问答-------------------- 其实,“去封装一个数据库操作Helper类”这个说法一点也看不出技术上是怎样能够确保你的程序及时关闭连接的。你把所有的Open()连接的代码换为某一个class中定义的方法,只是增加了此处去阅读代码困难层次,而并没有解决问题。是否使用数据库操作Helper类,跟确保及时关闭数据库连接并没有直接的联系。 --------------------编程问答-------------------- 謝謝樓上,謝謝謝謝
补充:.NET技术 ,  ASP.NET
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,