ASP.Net中的缓存方案(不仅仅是Cache和Session)

智能大石头 2006-11-10 10:06:55
我想设计一个完善的缓冲方案,用于在程序的各个地方缓冲数据。

应用程序级的Cache和Application大家都懂,就不说了
用户会话级的Session也懂,也不说

我要说的是小一点作用范围的。

线程级:在且仅在某个线程内有效的缓存。比如,可以定义一个数据库连接对象,在线程级把它缓冲起来,那么,执行各种数据库操作的时候,就不用担心它会冲突,因为当前CPU只有一个线程在执行。我们对数据库连接的一般做法都是在每个对象内部声明一个数据库连接或者作为属性由对象外部传进去,我觉得这种做法都不方便,如果能够实现线程级,则可以在数据层各个数据对象内部直接使用这个被缓存了的数据库连接,没有冲突,也在最大限度上充分利用了数据库连接。

请求级:在且仅在某一次请求的范围内有效的缓存。有时候,对于数据库的连接,我们都希望,在程序使用时连接一次数据库,一直用到这次请求结束。这就是请求级啦。

我觉得,线程级比请求级更好,因为ASP.Net运行时是这样处理的,收到一个请求,就从线程池分派一个线程去处理这个请求,同时也是从HttpApplication实例池中拿一个HttpApplication实例去处理,所以,一个线程可以被用于多次请求,一个HttpApplication实例,也可能被用于多个请求。

经过半个月来查找资料,我已经解决了绝大部分难题,做起来也挺麻烦的。
现在想听听大家的意见,看看大家有没有更好的实现方法。

本文在我网站中的地址:http://nnhy.org/CMS/web/index.asp?Act=NewsDetail&NClassID=26&ID=63
...全文
6394 88 打赏 收藏 转发到动态 举报
写回复
用AI写文章
88 条回复
切换为时间正序
请发表友善的回复…
发表回复
China_Kungfu 2007-04-08
  • 打赏
  • 举报
回复
Mark
ylj718 2007-03-14
  • 打赏
  • 举报
回复
问题解决了吗?没看明白,我现在的问题,在jyk(今天由我来写的代码,明天就让程序自己完成!喜欢编程。和气生财。共同提高。共同进步!)的表达里是最准确的。
whanlx 2007-02-02
  • 打赏
  • 举报
回复
这个问题我前段时间也考虑过,因为connection的open和close管理确实比较麻烦
楼主的方法最大的问题是,每个线程独占了一个connection,并且线程不结束就不关闭
有可能大量的connection被浪费了,因为线程当前活动的那部分代码可能不需要connection
但是却占用了connection资源不放。我本来还想封装一下。net中所有使用connection的类,让他们自动开关连接,后来发现过于复杂,确实没那个水平。
至于楼主说的在多个类中完成一个操作或事务的问题,《深入浅出hibernate》提供了一个建议:在ADO的上层管理connection 和transaction
whanlx 2007-02-02
  • 打赏
  • 举报
回复
还能回复么?
智能大石头 2006-11-17
  • 打赏
  • 举报
回复
今天接帖

请求级主要可用于缓存整个请求中的全局数据

线程级的代码比较复杂,要迟点才能发上来

大家可以到这里看源码
http://www.nnhy.org/CMS/web/index.asp?NClassID=26
myminimouse 2006-11-16
  • 打赏
  • 举报
回复
等代码中。。。

代码+注释不就很明白么?整这么多名词

智能大石头 2006-11-16
  • 打赏
  • 举报
回复
忘了加了,呵呵

在Application_EndRequest中关闭

DbConn类中,还应该加一个开关来设置是否使用请求级缓存,如果不使用,则直接New一个返回

别的用途,原理一致
自然框架 2006-11-16
  • 打赏
  • 举报
回复
没看懂。

请问怎么清除这个连接对象呢?

智能大石头 2006-11-16
  • 打赏
  • 举报
回复
请求级:

public class DbConn
{
static public SqlConnection GetConn()
{
SqlConnection Conn=(HttpContext.Current.Items["Conn"] as SqlConnection);
if(Conn==null)
{
Conn=new SqlConnection();
HttpContext.Current.Items.Add("Conn", Conn);
}
return Conn;
}

使用:
DbConn.GetConn
cat_hsfz 2006-11-15
  • 打赏
  • 举报
回复
我打的比喻,是把Connection比作Thread,而你的做法就像回到单线程时代。

至于事务,这是一个和表现层无关的东西,本来就没“缓存”这个概念。你缓存的意思仅仅是为了跨越页面生命周期而读取。事务可以脱离表现层运行,你需要的只是确保每次表现层都能取回这个事务的指针/句柄一类的东西,然后在表现层更新你所要显示的信息。
clal 2006-11-15
  • 打赏
  • 举报
回复
mark
job_2006 2006-11-15
  • 打赏
  • 举报
回复
nnhy(大石头) ( ) 信誉:100 Blog 2006-11-10 19:04:43 得分: 0



谢谢支持

希望得到更多的暴风雨,更多的批评,让我去改进……

两年后结帖,同时公布源码




=======
吓了我一大跳,哈哈,帮顶帮顶,学习学习!~
yangye1211 2006-11-15
  • 打赏
  • 举报
回复
Mircrosoft有自己的解决方案,就集成在ADO.NET中,呵呵,点到为止。
思篆者 2006-11-15
  • 打赏
  • 举报
回复
http://blog.csdn.net/aafshzj/category/235149.aspx
这可能是楼主想要的
思篆者 2006-11-15
  • 打赏
  • 举报
回复
总的来说,楼主的思维还是基于线性过程上,没到基于OOP,基于事件.
一个大的程序,首先,要保证的是模块之间的正交性,(模块独立,模块之间的关联最小),楼主的框架与这个思路已经相反了.
其次,楼主对事务的思维也是线性的,其实完全可以用事件触发来很好的解决.
再次,对于分层,楼主也可能没有考虑,线程级的连接,他的地位到底是数据层,还是业务逻辑层?

菜鸟之言,看看就行了
flashccie 2006-11-15
  • 打赏
  • 举报
回复
一口气看完了所有的贴
这里讨论也是我所碰到的问题。
LZ想要的是在保证良好的业务操作的前提下来优化数据库操下。
前提是业务操作是好,有良好的可操作性
sp1234想要的是良好的数据库操作前提下来执行事务。
两者的前提是不一样的。

我现在天天碰到的就是多个数据库服务器之间的事务
我在A服务器做一个操作后,必须等操作完B服务器后才能知道是提交事务还是回退事务。
你说这种操作不能一开一做一关的数据库连接,有什么好的办法优化呢?

  • 打赏
  • 举报
回复
仔细看了下各位的发言

//不要看错了,这是线程级,如果线程销毁,连接当然没有了,何来的占住不用
感觉楼猪的争议就在这。一个劲的争论说是线程级的问题~
问题来了,如上众大虾所言,执行线程也是需要时间和资源的,根据楼猪的言论,感觉你是不是小网站做的太多了,从来都没有考虑多多用户同时并发请求的问题?
如果像LZ说的这样,一个线程保持一个conntion,执行一段(是一段不是一个)数据处理事物的话,LZ需要买一个什么样的服务器?你能保证你的服务器能承受到多大的压力?
LZ说的业务处理逻辑的想法很理想~想执行完某请求的所有操作才释放连接,如是想到独占线程的方法,呵呵~~其实在业务逻辑中,真正需要的同步处理数据的地方有很多种方法可以操作~数据库事务、触发器等等。。都可以去研究的。。。
qiusp001 2006-11-15
  • 打赏
  • 举报
回复
mark
智能大石头 2006-11-15
  • 打赏
  • 举报
回复
To ljf840303(校园X怪怪)

为什么要做线程级?就是为了防止和别的线程读同一资源嘛。不好意思,我解释起来吃力……
线程池是ASP.Net本身就使用的,不用我管

To jyk
从上面的回复看来,很多人都没有过我和你一样的经历哦。
嗯,可能我的“缓存”的确误导了。
但是,不要仅仅把这个东西用于数据库连接呀,我还用在别的方面了^_^
自然框架 2006-11-15
  • 打赏
  • 举报
回复
1、我对搂主的理解完全是感觉上的理解,而不是字面意思上的理解。
也就是说如果我没有和楼主类似的经历(包括表述能力),我是不会有这样的理解的。

2、缓存 —— 我觉得在这里“缓存”是一个误导。我觉得搂主要说的和缓存根本没有什么关系,呵呵。

3、楼主可以看看我的几篇文章,也许会有所帮助。

http://www.cnblogs.com/jyk/category/67121.html

里面有我的数据访问层的说明,和一个我的“三层结构”的说明。


ps:
我的表述能力是很差的,最近一直在努力提高中。
加载更多回复(68)

62,072

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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