说了又说——每个人都会遇到的问题——数据库连接优化问题(涉及到设计模式)

slex 2006-07-21 07:01:24
开发网站难免DataReader,但我看包括PetShop在内的所有项目的所有的DAL(数据访问层)提供的GetReader方法都没有(也不可能)做方法内的断开(因为调用它的方法需要通过这个连接来获取数据)。这个问题因该如何解决呢(包括模式的设计)?少用DataReader可不是个满意的答案阿。
...全文
336 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuqi92188 2007-04-12
  • 打赏
  • 举报
回复
其实还有一种很好的方式,可能要破坏现有的结构,有些需要嵌套调用DataReader的地方可以写成存储过程,直接使用sql语句获得结果。
xuqi92188 2007-04-12
  • 打赏
  • 举报
回复
把需要是数据先读出来存放到对象中,关闭DataReader,然后直接传递该对像。
如果用dataset效率更差
slex 2007-03-16
  • 打赏
  • 举报
回复
这个问题,郁闷。。。
heilong05 2006-07-24
  • 打赏
  • 举报
回复
Mark。



====CSDN 小助手 V2.5 2005年11月05日发布====
CSDN小助手是一款脱离浏览器也可以访问Csdn论坛的软件
界面:http://blog.csdn.net/Qqwwee_Com/archive/2005/11/05/523395.aspx
下载:http://szlawbook.com/csdnv2

yuan135 2006-07-24
  • 打赏
  • 举报
回复
用完DataReader后顺手关闭连接吧
对于网站,最好是将连接放回连接池而不是断开,这样可以减少向服务器请求连接的开销
slex 2006-07-23
  • 打赏
  • 举报
回复
请高手进来看看吧!!

等好几天了

上面的方法难道是最好的了?
slex 2006-07-23
  • 打赏
  • 举报
回复
十分感谢netmicro(麦)的建议!!
slex 2006-07-23
  • 打赏
  • 举报
回复
我这边的情况是,Web与Form共存,他们分别有自己的BLL(WebBll,AppBll),然后他们共用底层的Bll

这个底层的Bll下面的DAL就必须解决DataReader的问题啊
netmicro 2006-07-22
  • 打赏
  • 举报
回复
能自己干预的DAL才能用以下方法

首先要知道,ASP.NET的服务机制是用单一线程、用一个空余的HttpApplication对象加载一个HttpHandler(一般就是Page)处理用户的一次往返行程

其中,HttpApplication本身有一系列事件,下面要用的是BeginRequest和EndRequest。据我实验所得,这两个事件是肯定会触发的,中间有一大堆事件都可能因为一个提早的Response.End()而不会触发。

又,对于每次新的请求,ASP.NET都会生成一个“上下文集合”(HttpContext),并可以用HttpApplication.Context来访问。这个集合跟Session/Cache/Cookie/ApplicationState等集合类似,但是生存期就只局限于单用户单次请求。

所以,要解决你的关于数据库连接的问题,就比较简单了

首先,在 Global.asax[.cs] 里面响应 BeginRequest:

void Application_BeginRequest(object sender, EventArgs e)
{
// 这里建立一个 DbConnection 对象并连接好
// 然后放到 Context 里面
Context.Items["__MY_DB_CONNECTION"] = cnn; // 取个既有意义又没什么重复可能的名字
// 注意 Global.asax.* 是继承自 HttpApplication 的,所以可以直接访问 Context 属性
}

然后,修改你的DAL代码,将所有“创建新连接对象”的代码都改成:
XXXConnection cnn = (XXXConnection)HttpContext.Current.Items["__MY_DB_CONNECTION"];

这样,整个请求处理过程都用着同一个连接,而且不会断掉

最后由谁来断掉它?回到Global.asax.*

void Application_EndRequest(object sender, EventArgs e)
{
XXXConnection cnn = (XXXConnection)HttpContext.Current.Items["__MY_DB_CONNECTION"];
cnn.Close();
}

-------
注:更好的代码风格是到处都有查错、纠错的代码,为了例子容易看懂我都省掉了
slex 2006-07-22
  • 打赏
  • 举报
回复
硬件条件好了,不要太在乎这点性能吗,如果实在是对性能要求这么多,还是用静态html好。
-------------------
大家是做软件项目开发的,不是老总不是客户。对于硬件,只有提建议的权利,没有拨经费的权利。


哭死``又没看懂,白学的了````什么啊``郁闷了```
-------------------
可能表达不清,在解释一下,呵呵
在表现层中调用 含有DataReader操作并返回DataReader对象 的方法时,要求与数据库的这个连接是始终开着的。对于外界,方法内的DataReader肯定是容易忽视的东西,有没有好的方法去控制对DataReader所占资源的收回。回收的有效方法又是如何呢?


硬件肯定最好是升升级,DataReader最好也是少用点,但这毕竟不是最终解决方法
大菠萝III 2006-07-21
  • 打赏
  • 举报
回复
哭死``又没看懂,白学的了````什么啊``郁闷了```
lxhvc 2006-07-21
  • 打赏
  • 举报
回复
硬件条件好了,不要太在乎这点性能吗,如果实在是对性能要求这么多,还是用静态html好。
slex 2006-07-21
  • 打赏
  • 举报
回复
难道大家对这个问题已经无语了么?

能说多少说多少啊~

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧