轻松打造个人网站-关于数据访问

      今天早晨起来看到了好友jykStep By Step 一步一步写网站 系列文章,感觉自己是时候兑现一下之前的承诺 了,于是把这篇《关于数据访问》作为《轻松打造个人网站》系列文章的开篇,希望对各位有意架设个人网站的朋友有所帮助。我的水平有限,所以仅仅希望把自己在网站建设中的一些实战过程分享给大家,都是一家之谈,仅供各位参考。
      长篇大论之前先展示一下我的网站吧。
          活在沈阳:  http://www.024so.com/

      网站仍然处于测试调整阶段,欢迎各位原有访问,指正。最近仿佛不只一次在园子里提到我的网站了,呵呵。已经为流量开始不择手段了。
      先说说项目情况吧,asp.net 2.0技术,工期从春节放假前2月15日到315消费者权益日,整一个月,期间包括网站功能设计,页面绘制,代码编写,注册域名,联系网络空间...酸甜苦辣各种滋味尽在其中。

      罗嗦了半天,终于开始进入正题-“数据访问”了。大家都知道一般网站项目,从建立连接开始,到对数据操作或者返回结果集,关闭连接,整个过程中,最消耗时间不是对数据操作的过程,而是连接对象创建的过程,所以无论是.net阵营IIS服务器,或者java阵营Tom Cat都在自己web服务器中加入了连接池的概念,以减少连接对象创建和销毁过程中的消耗。如果你自己有一服务器,那么一切都没问题,连接池有多少触点你说了算,只需要手动配置一下连接字符串就ok了,像我这样比较穷酸的,只能租个廉价网络空间,而代理空间往往会限制IIS连接数量,所以为了提高网站访问速度,程序中对连接对象的控制就显得尤为重要。

      举例说明吧,一个门户网站首页,一定有很多信息列表,比如有10个信息列表,是不是做了“创建10个连接,查询数据,把数据装入结果集,关闭连接,把结果集在前台送显”的过程呢?不是。拿我的网站来说,IIS限制50连接,就是说同一时间允许50个连接对象创建,假设一个页面显示需要5个查询的过程,那我就只能祈祷同一时刻不要有第11个人访问我的网站,事实上我希望同一时刻有1万个用户访问我的网站,呵呵。例子有点极端,我的态度也有些夸张。于是开发人员想出了许多解决方案,比如缓存结果集,比如静态页技术,比如流操作技术,比如一连接返回所有结果集技术......

      对于我的网络空间实际情况,我采取了一连接技术和缓存结果集技术。详细讲:
            直接看代码吧:         

 

// 初始化首页显示信息


            大家看到了,这个方法用于返回首页用于显示的多个集合列表,是的,用一个方法返回多个结果集:    
            public void GetIndexData( 
                  out IList<TopicInfo> topicList, out IList<UserDetailInfo> userList,            
                  int topicCount, int userCount)

            这里用到了输出参数,方法中包含多个数据访问的过程,这些查询过程公用了一个Connection对象,把Connection对象放在Using操作空间中,限制了Connection的工作空间,保证所有数据访问结束之后Connection对象自动析构。还要注意的是Command对象,很多查询都是带参操作的,所以当一个数据访问结束之后一定要清空Command对象的参数:
            cmd.Parameters.Clear();

            这样就实现了一连接返回多个查询结果集。有些朋友可能会说这样的数据访问,代码量会不会比较大。
            的确会,不过其中的代码都比较规律,都是最纯朴的ado.net,所以老刘推荐使用诸如CodeSmith之类的代码生成工具写出模版,成批生成代码。
            还有不同页面显示相同的数据访问内容的情况,那么就会在多个方法中包含相同的数据访问部分,老刘的网站里没有多个页面显示相同内容的情况,所以用了上面的方法,如果你的项目里有多页通用结果集,那么老刘推荐你重构一下上面的方法,把数据访问部分提炼成方法,然后把Connection对象作为参数在方法中传递,或者你也可以把第一次查询出来的结果放到缓存中,其他页面调用缓存中的数据,不过自己要控制好这个过程,比较复杂,在此不详细叙述,关于缓存数据,我会结合我的项目实际情况,作为专题叙述一下。提到缓存不能不介绍一篇好文,偶像Bruce ZhangPetShop之ASP.NET缓存,这里仿佛应该引用韦小宝的滔滔江水之云云,呵呵。

            以上文字只代表了我不成熟的观点,如果能给你带来一丝灵感,老刘会感到非常开心,第一次把文章放在首页,欢迎各位园友拍砖。还会写几篇《轻松打造个人网站》系列的文章,也许不只包括技术方面的,还包括一些运营,推广方面的实践经验,衷心希望给各位有意打造个人网站的朋友带来帮主,因为我切身体会了其中的艰辛,呵呵。


对所有提出指正的朋友表示衷心感谢:)
============================================
引自 亚历山大同志

@老刘.
----------------------------------------------------------------
像我这样比较穷酸的,只能租个廉价网络空间,而代理空间往往会限制IIS连接数量,所以为了提高网站访问速度,程序中对连接对象的控制就显得尤为重要
----------------------------------------------------------------
这里需要纠正一下你的观点,可能对服务器配置你是不是很熟悉.所谓IIS连接数是指IIS同时能够处理的浏览器请求的数量,而不是服务器去连接数据库的连接的数量,我想你这点完全理解错误了,对于Access数据库来说数据连接数量毫无意义,本来就是文件型的数据库而SqlServer是要设置的一般来说很多虚拟主机商都会做出一定的限制,而IIS的连接数限制不管你的程序怎么优化怎么单连接阿什么的都是没有用的,因为那是IIS的地盘,超过同时请求的用户数IIS请求都不会转发给ASP.NET.我看你的基本出发点都弄错了. 
============================================




posted on 2007-03-24 20:22 老刘. 阅读(3343) 评论(32)  编辑 收藏 所属分类: 轻松打造个人网站

评论

#1楼 2007-03-24 21:39 JesseZhao      

咱们俩最近做的网站感觉差不多,有时间多交流以下啊
你这里介绍的缓存技术对我这个同样是很穷的穷学生很有用的
  回复  引用  查看    

#2楼 2007-03-24 22:05 JesseZhao      

你使用了out关键字,这个关键字我在学习C#的时候就是一跳而过,也没有想过设计这种类指针性质的函数,现在感觉你的代码很精炼也很高效。   回复  引用  查看    

#3楼[楼主] 2007-03-24 22:40 老刘.      

@JesseZhao
你的网站上线了吗?如果上线了,贴个地址呗,我学习学习。呵呵。
我的邮箱是oldbill@126.com,给我留个你的邮箱地址吧,方便交流。
  回复  引用  查看    

#4楼[楼主] 2007-03-24 22:41 老刘.      

@JesseZhao
哎,我直接去翻你的blog吧。呵呵。
  回复  引用  查看    

#5楼 2007-03-24 22:44 Leepy      

网站打开有点慢!   回复  引用  查看    

#6楼 2007-03-24 22:45 JesseZhao      

@老刘.
嘿嘿,刚看到 prolibertine@gmail.com
  回复  引用  查看    

#7楼[楼主] 2007-03-24 22:48 老刘.      

@Leepy
51la的问题。。。
  回复  引用  查看    

#8楼 2007-03-25 08:55 蛙蛙池塘      

代码写的很好,不过你下面这句是啥意思?
catch(Exception ex)
{
throw ex;
}
  回复  引用  查看    

#9楼 2007-03-25 10:28 torome      

期待你的系列文章,很实用   回复  引用  查看    

#10楼 2007-03-25 10:34 亚历山大同志      

单连接的问题我想提醒老赵同志的是,如果同时访问地人过多会造成拥塞,其实.NET自己会管理连接池,最好的策略是每个页面用一个Connection,最大限度的去挤占系统的连接,这样子在虚拟主机上才不会吃亏,而如果是自己单独的主机的话也可以最大限度的榨取系统的性能   回复  引用  查看    

#11楼 2007-03-25 12:29 tim[未注册用户]

言之有理   回复  引用    

#12楼 2007-03-25 13:00 goalbell[未注册用户]

看了你的网站,我很有感触.请问这种"http://www.024so.com/topics.html?q= "怎样实现的?有什么技巧吗?   回复  引用    

#13楼 2007-03-25 20:35 太阳神

其实可以考虑程序生成XML或者HTML等的方式去建站,那样的话对系统资源耗费的最好,可以达到最快的访问速度,而且也更有利与搜索。   回复  引用    

#14楼[楼主] 2007-03-25 21:12 老刘.      

@蛙蛙池塘
这个是向调用这个方法的函数抛出异常,比如A类中包含这样的代码:
Class A
{
try
{
ThrowExceptionClass exClass = new ThrowExceptionClass();

}
catch(Exception ex)
{
// 做一些异常处理,比如异常记档,比如显示层报错等等
}
}
如果ThrowExceptionClass 类发生异常,ThrowExceptionClass 类throw ex,把异常抛给A类处理。

不知道我解释的清楚不清楚:)
  回复  引用  查看    

#15楼[楼主] 2007-03-25 21:13 老刘.      

@太阳神
考虑到服务器空间的问题,就不采纳您的建议了,依然表示感谢,静态页性能永远是最好的:)
  回复  引用  查看    

#16楼[楼主] 2007-03-25 21:17 老刘.      

@goalbell
不太清楚你表达的意思,我简单说一下我的实现方法吧,首先是用url重写把.aspx页重写成.html页,至于参数就用Request.QueryString处理了。可能我说的不够详细,不过我会在《轻松打造个人网站》系列文章中详细叙述一下我的网站的url重写实现过程。
  回复  引用  查看    

#17楼 2007-03-26 05:36 Vincent Yang      

你这种优化以后,维护和后续开发会怎样?   回复  引用  查看    

#18楼[楼主] 2007-03-26 08:35 老刘.      

@Vincent Yang
功能结构没有什么冗余,基本上一个功能实现一次。至于后续开发和维护,由于没有团队,时间有限,所以进度不敢保证。
  回复  引用  查看    

#19楼 2007-03-26 08:52 金色海洋(jyk)      

“一连接返回多个查询结果集”
最简单的方法就是
stirng sql = "";
sql = " select Col1,clo2,... from yourTable where ..." ;
sql +=" select Col1,clo2,... from yourTable2 where ..." ;
sql +=" select Col1,clo2,... from yourTable3 where ..." ;
......

DataSet ds ;

cmd.CommandText = sql;

SqlDataAdapter da = new SqlDataAdapter();
da.Fill(ds);

ds 里面的Tables[] ,就是你要的多个记录集了。
换成存储过程效果更好,尤其适用于首页。

另外建议把
conn.Open();

这类的对象都提炼出来单独处理,这样更便于维护,代码也清晰很多。
  回复  引用  查看    

#20楼 2007-03-26 09:59 duhaha[未注册用户]

http://*** 网站让人开心就行   回复  引用    

#21楼 2007-03-26 10:24 金色海洋(jyk)      

原来你也是沈阳的呀。老乡欧。   回复  引用  查看    

#22楼 2007-03-26 11:10 张小峰 程序员的原创吉他谱天地 www.gtp.cn[未注册用户]

我也是   回复  引用    

#23楼 2007-03-26 17:34 Artech      

@金色海洋(jyk)
你建议使用DataSet, Performace方面会大打折扣,不如楼主的方法。不过可以像你说的一样,把两个Select语句放在一起,生成两个结果集,那么我们就可以使用一个DataReader返回所有的结果,可以获得Performance的提升。
  回复  引用  查看    

#24楼[楼主] 2007-03-26 19:33 老刘.      

@金色海洋(jyk)
我是bangoi,呵呵。谢谢你的指点:)
  回复  引用  查看    

#25楼 2007-03-27 13:12 okay[未注册用户]

这里用到了输出参数,方法中包含多个数据访问的过程,这些查询过程公用了一个Connection对象,把Connection对象放在Using操作空间中,限制了Connection的工作空间,保证所有数据访问结束之后Connection对象自动析构。还要注意的是Command对象,很多查询都是带参操作的,所以当一个数据访问结束之后一定要清空Command对象的参数:
cmd.Parameters.Clear();

上面是楼主写的内容,我这还是头一回看见Connection放在using中让系统析构释放的!当初人家ms设计的初衷是为了事务开发的没想到被你这么用了,真是悲哀...连接用完就关然后再开看似合理的过程实际浪费大量的资源,反正是个人的小破网站因该看不出来。
代码写的太烂,没法看了
  回复  引用    

#26楼[楼主] 2007-03-27 17:36 老刘.      

@okay
首先说Connection放在using中吧,ado.net 2.0开发指南 明确指出用using代替conn.Close(),老兄这么崇尚ms的设计出衷,还要好好看看ms的官方指南啊,我虽然不崇尚权威,但是我觉得using的做法没有任何问题;
至于“连接用完就关然后再开看似合理的过程实际浪费大量的资源,反正是个人的小破网站因该看不出来。 ”
你把你的意思想明白了再表达,除了你自己之外,不一定有其他人明白你要干什么,也许你自己都不明白。
“代码写的太烂,没法看了”。
就像写不写是我的自由一样,看不看也是你的自由,倒是okay忘我贬低他人的精神,让人无奈啊,无奈...
  回复  引用  查看    

#27楼 2007-03-31 11:34 亚历山大同志      

@老刘.
----------------------------------------------------------------
像我这样比较穷酸的,只能租个廉价网络空间,而代理空间往往会限制IIS连接数量,所以为了提高网站访问速度,程序中对连接对象的控制就显得尤为重要
----------------------------------------------------------------
这里需要纠正一下你的观点,可能对服务器配置你是不是很熟悉.所谓IIS连接数是指IIS同时能够处理的浏览器请求的数量,而不是服务器去连接数据库的连接的数量,我想你这点完全理解错误了,对于Access数据库来说数据连接数量毫无意义,本来就是文件型的数据库而SqlServer是要设置的一般来说很多虚拟主机商都会做出一定的限制,而IIS的连接数限制不管你的程序怎么优化怎么单连接阿什么的都是没有用的,因为那是IIS的地盘,超过同时请求的用户数IIS请求都不会转发给ASP.NET.我看你的基本出发点都弄错了.
  回复  引用  查看    

#28楼[楼主] 2007-03-31 20:09 老刘.      

@亚历山大同志
拍砖也要温柔一些,哈哈。
  回复  引用  查看    

#29楼[楼主] 2007-03-31 20:20 老刘.      

@亚历山大同志
感谢亚同志的指正:)还要多向您请教啊。哈哈。
  回复  引用  查看    

#30楼 2007-04-02 01:37 hfyb      

最外面的using中直接应用conn,这不是表明已经打开了数据库连接了,为什么还要用代码conn.open()再次打开呢?能否指点这样做是不是多余了?
我个人觉得这样使用using 很好,好像vs中的关于web开发的初学者安装包里就是这样使用的。
  回复  引用  查看    

#31楼 2007-04-05 10:39 踏浪[未注册用户]

using类似于生成了一个使用域,在结束这个域时,自动调用Close(),但并不会去执行Open()这样的方法。试想其它对象呢,哪些是Using的时候应该去执行的呢?这是无法规定的。   回复  引用    




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 686594




相关文章:

相关链接:

导航

公告

发现最近好多书都是69块~
<2007年3月>
25262728123
45678910
11121314151617
18192021222324
25262728293031
1234567

统计

与我联系

搜索

 

常用链接

留言簿

我管理的小组

我参与的团队

我的标签

随笔分类

随笔档案

文章分类

收藏夹

我的链接

我的朋友

最新评论

阅读排行榜

评论排行榜