三连接池
用TCP来连接你的应用程序与数据库是一件昂贵的事情(很费时的事情)微软的开发者可以通过用连接池来反复的使用数据库的连接比起每次请求都用TCP来连一次数据库连接池只有在不存在有效的连接时才新建一个TCP连接当关闭一个连接的时候它会被放到池中它仍然会保持与数据库的连接这样就可以减少与数据库的TCP连接次数
当然你要注意那些忘记关的连接你应在每次用完连接后马上关闭它我要强调的是无论什么人说net framework中的GC(垃圾收集器)总会在你用完连接对象后调用连接对象的Close或者Dispose方法显式的关闭你的连接不要期望CLR会在你想象的时间内关掉连接虽然CLR最终都要销毁对象和关闭边接但是我们并不能确定它到底会在什么时候做这些事情
要用连接池优化有两条规则第一打开连接处理数据然后关闭连接如果你必须在每次请求中多次打开或关闭连接这好过一直打开一个边接然后把它传到各个方法中第二用相同的连接字符串(或者用相同的用户标识当你用集成认证的时候)如果你没有用相同的连接字符串如你用基于登录用户的连接字符串这将不能利用连接池的优化功能如果你用的是集成的论证因为用户很多所以你也不能充分利用连接池的优化功能NET CLR提供了一个数据性能计数器它在我们需要跟蹤程序性能特性的时候非常有用当然也包括连接池的跟蹤了
无论你的应用程序什么时候要连在另一台机子的资源如数据库你都应该重点优化你连资源所花的时间接收和发送数据的时间以及往返回之间的次数优化你的应用程序中的每一个处理点(process hop)它是提高你的应用的性能的出发点
应用程序层包含与数据层连接传送数据到相应的类的实例以及业务处理的逻辑例如在Community Server中要组装一个Forums或者Threads集合然后应用业务逻辑如授权更重要的这里要完成缓存逻辑
四ASPNET缓存API
在写应用程序之前你要做的第一件事是让应用程序最大化的利用ASPNET的缓存功能
如果你的组件是要在Aspnet应用程序中运行你只要把SystemWebdll引用到你的项目中就可以了然后用HttpRuntimeCache属性就可访问Cache了(也可以通过PageCache或HttpContextCache访问)
有以下几条缓存数据的规则第一数据可能会被频繁的被使用这种数据可以缓存第二数据的访问频率非常高或者一个数据的访问频率不高但是它的生存周期很长这样的数据最好也缓存起来第三是一个常常被忽略的问题有时候我们缓存了太多数据通常在一台X的机子上如果你要缓存的数据超过M的话就会出现内存溢出的错误所以说缓存是有限的换名话说你应该估计缓存集的大小把缓存集的大小限制在以内否则它可能会出问题在Aspnet中如果缓存过大的话也会报内存溢出错误特别是如果缓存大的DataSet对象的时候
这里有几个你必须了解的重要的缓存机制首先是缓存实现了最近使用原则( a leastrecentlyused algorithm)当缓存少的时候它会自动的强制清除那些无用的缓存其次 条件依赖强制清除原则(expiration dependencies)条件可以是时间关键字和文件以时间作为条件是最常用的在aspnet中增加一更强的条件就是数据库条件当数据库中的数据发生变化时就会强制清除缓存要更深入的了解数据库条件依赖请看Dino Esposito 在MSDN杂志年七月刊的Cutting Edge专栏文章Aspnet的缓存架构如下图所示
五预请求缓存
在前面我提到过即使我们只对某些地方作了一个小小的性能改进也可以获得大的性能提升我非常喜欢用预请求缓存来提升程序的性能
虽然Cache API设计成用来保存某段时间的数据而预请求缓存只是保存某个时期的某个请求的内容如果某个请求的访问频率高而且这个请求只需要提取应用修改或者更新数据一次那么就可以预缓存该请求我们举个例子来说明
在CS的论坛应用程序中每一个页面的服务器控件都要求得到用于决定它的皮肤(skin)的自定义的数据以决定用哪个样式表及其它的一些个性化的东西这里面的某些数据可能要长时间的保存有些时间则不然如控件的skin数据它只需要应用一次而后就可以一直使用
要实现预请求缓存用Aspnet 的HttpContext类HttpContext类的实例在每一个请求中创建在请求期间的任何地方都可以通过HttpContextCurrent属性访问HttpContext类有一个Items集合属性在请求期间所有的对象和数据都被添加到这个集合中缓存起来和你用Cache缓存访问频率高数据一样你可以用HttpContextItems缓存那些每个请求都要用到的基础数据它背后的逻辑很简单我们向HttpContextItems中添加一个数据然后再从它里面读出数据
六后台处理
通过上面的方法你的应用程序应该运行得很快了是不是?但是在某些时候程序中的一次请求中可能要执行一个非常耗时的任务如发送邮件或者是检查提交的数据的正确性等
当我们把aspnet Forums 集成在CS中的时侯发现提交一个新的帖子的时候会非常的慢每次新增一个帖子的时侯应用程序首先要检查这个帖子是不是重复提的然后用badword过滤器来过滤检查图片附加码作帖子的索引把它添加到合适的队列中验证它的附件最后发邮件到它的订阅者邮件箱中显然这个工作量很大
[] [] []