CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  ASP.NET

有经验的应该都可以回答,进者有分!

楼主szc21(卖炭翁)2006-05-02 09:17:33 在 .NET技术 / ASP.NET 提问

我想问的是,像一般的大型网站的主页,上面有很多及时信息或者分类信息,如果做成动态的就是和数据库连接显示内容的话,那不是要每次进页面都连接数据库,显然不合理。如果做成静态的,那修改起来不是很麻烦吗?例如添加新闻联接,那网站还不要天天去修改修改整个页面?一般他们是怎么解决这种情况的?    
  在线等啊 问题点数:30、回复次数:16Top

1 楼i169net1(阿康)回复于 2006-05-02 09:59:25 得分 4

动态的,那肯定是要每次都从数据源里读取数据的啊...  
  这个没办法的,想要速度快些,可以考虑使用存储过程、session等其他办法~  
   
  Top

2 楼Netfe()回复于 2006-05-02 10:30:22 得分 4

那确实,用存储过程效率还是蛮高地Top

3 楼ice_frank(回归......)回复于 2006-05-02 10:32:02 得分 2

合理使用好缓存是关键Top

4 楼aspdotnet2005(天中之子、为中原喝采![我想找兼职MSN:Red-Maple@hotmail.com])回复于 2006-05-02 10:47:22 得分 4

缓存这个分类表!分类表如果有更新、插入、删除时失效Top

5 楼tomtown530(梦想一定会实现!)回复于 2006-05-02 11:38:14 得分 2

嗯,缓存,页面缓存Top

6 楼insiderc()回复于 2006-05-02 12:00:42 得分 2

数据库加缓存Top

7 楼winner2050(winner)回复于 2006-05-02 12:31:36 得分 2

静态的网页也不需要手工修改,只要按个按钮就能生成了。Top

8 楼hnzpz(我来自洞庭湖)回复于 2006-05-02 13:07:38 得分 2

 
   
    动态Top

9 楼yishanhai(一山海)回复于 2006-05-02 14:04:39 得分 2

现在实现动静结合,访问量大的,动态生成静态页面,这样节省服务器资源Top

10 楼gzlaspnet(爱程)回复于 2006-05-02 14:28:12 得分 2

aspdotnet2005(红枫(想找兼职))    
   
  我想问问:分类表如何在有更新,增加,删除时失效?  
  Top

11 楼hujunhua(骨感男人)回复于 2006-05-02 15:46:07 得分 2

网站的前台页面是事先设置好的模板    
   
  如果在网站的后台添加了新信息后,只需要点击自动生成页面,那么新的静态页面就按事先设置好的模板生成好了,很多生成静态页面的新闻管理系统都是这样的做法!Top

12 楼NuclearG(想不出这里写点什么好 不如就让它这么空着吧)回复于 2006-05-02 16:41:50 得分 2

基本思路就是每隔半小时用代码根据重新从数据库中取出来的东西做个HTML页面出来把首页换掉Top

13 楼sgd(阿司)回复于 2006-05-03 10:52:54 得分 0

NuclearG(不知道这里该写点什么好   不如让它空着吧)   (   )   信誉:100     2006-5-2   16:41:51     得分:   2      
     
     
         
  基本思路就是每隔半小时用代码根据重新从数据库中取出来的东西做个HTML页面出来把首页换掉  
   
       
     
  这法子到也可以,适合小型网站,大型的用这个更新太慢了吧Top

14 楼jackinelee()回复于 2006-05-03 18:26:14 得分 0

哈哈,这就体现出用jsp做网站得优势了呀,jsp中使用数据库连接池链接数据库,不用每次都连接,可以直接从其中取出空闲得连接,下面给出经典得源码,供参考  
  package   com.laoer.bbscs.db;  
   
  /**  
    *   Title:                 BBS-CS  
    *   Description:     BBS-CS(BBS式虚拟社区系统)  
    *   Copyright:         Copyright   (c)   2002  
    *   Company:             loveroom.com.cn  
    *   @author   laoer  
    *   @version   3.0  
    */  
   
  import   java.io.*;  
  import   java.sql.*;  
  import   java.util.*;  
  import   java.util.Date;  
   
  /**  
  *   管理类DBConnectionManager支持对一个或多个由属性文件定义的数据库连接  
  *   池的访问.客户程序可以调用getInstance()方法访问本类的唯一实例.  
  */  
  public   class   DBConnectionManager   {  
   
          static   private   DBConnectionManager   instance;   //   唯一实例  
          static   private   int   clients;  
   
          private   Vector   drivers   =   new   Vector();  
          private   PrintWriter   log;  
          private   Hashtable   pools   =   new   Hashtable();  
   
  /**  
  *   返回唯一实例.如果是第一次调用此方法,则创建实例  
  *  
  *   @return   DBConnectionManager   唯一实例  
  */  
  static   synchronized   public   DBConnectionManager   getInstance()   {  
   
          if   (instance   ==   null)   {  
                  instance   =   new   DBConnectionManager();  
          }  
                  clients++;  
                  return   instance;  
  }  
   
   
  /**  
  *   建构函数私有以防止其它对象创建本类实例  
  */  
  private   DBConnectionManager()   {  
          init();  
  }  
   
   
  /**  
  *   将连接对象返回给由名字指定的连接池  
  *  
  *   @param   name   在属性文件中定义的连接池名字  
  *   @param   con   连接对象  
  */  
  public   void   freeConnection(String   name,   Connection   con)   {  
          DBConnectionPool   pool   =   (DBConnectionPool)   pools.get(name);  
          if   (pool   !=   null)   {  
                  pool.freeConnection(con);  
          }  
  }  
   
   
  /**  
  *   获得一个可用的(空闲的)连接.如果没有可用连接,且已有连接数小于最大连接数  
  *   限制,则创建并返回新连接  
  *  
  *   @param   name   在属性文件中定义的连接池名字  
  *   @return   Connection   可用连接或null  
  */  
  public   Connection   getConnection(String   name)   {  
          DBConnectionPool   pool   =   (DBConnectionPool)   pools.get(name);  
          if   (pool   !=   null)   {  
                  return   pool.getConnection();  
          }  
          return   null;  
  }  
  Top

15 楼jackinelee()回复于 2006-05-03 18:27:47 得分 0

续:/**  
  *   获得一个可用连接.若没有可用连接,且已有连接数小于最大连接数限制,  
  *   则创建并返回新连接.否则,在指定的时间内等待其它线程释放连接.  
  *  
  *   @param   name   连接池名字  
  *   @param   time   以毫秒计的等待时间  
  *   @return   Connection   可用连接或null  
  */  
  public   Connection   getConnection(String   name,   long   time)   {  
          DBConnectionPool   pool   =   (DBConnectionPool)   pools.get(name);  
          if   (pool   !=   null)   {  
                  return   pool.getConnection(time);  
          }  
          return   null;  
  }  
   
   
  /**  
  *   关闭所有连接,撤销驱动程序的注册  
  */  
  public   synchronized   void   release()   {  
  //   等待直到最后一个客户程序调用  
          if   (--clients   !=   0)   {  
                  return;  
          }  
   
          Enumeration   allPools   =   pools.elements();  
          while   (allPools.hasMoreElements())   {  
                  DBConnectionPool   pool   =   (DBConnectionPool)   allPools.nextElement();  
                  pool.release();  
          }  
          Enumeration   allDrivers   =   drivers.elements();  
          while   (allDrivers.hasMoreElements())   {  
                  Driver   driver   =   (Driver)   allDrivers.nextElement();  
                  try   {  
                          DriverManager.deregisterDriver(driver);  
                          //log("Deregistered   JDBCdriver   "   +   driver.getClass().getName());  
                  }  
                  catch   (SQLException   e)   {  
                          //log(e,   "Can   not   deregistered   JDBC   driver:   "   +   driver.getClass().getName());  
                  }  
          }  
  }  
   
   
  /**  
  *   根据指定属性创建连接池实例.  
  *  
  *   @param   props   连接池属性  
  */  
  private   void   createPools(Properties   props)   {  
          Enumeration   propNames   =   props.propertyNames();  
          while   (propNames.hasMoreElements())   {  
                  String   name   =   (String)   propNames.nextElement();  
                  if   (name.endsWith(".url"))   {  
                          String   poolName   =   name.substring(0,   name.lastIndexOf("."));  
                          String   url   =   props.getProperty(poolName   +   ".url");  
                                  if   (url   ==   null)   {  
                                  //log("No   URL   specified   for"   +   poolName);  
                                  continue;  
                                  }  
                          String   user   =   props.getProperty(poolName   +   ".user");  
                          String   password   =   props.getProperty(poolName   +   ".password");  
                          String   maxconn   =   props.getProperty(poolName   +   ".maxconn",   "0");  
                          int   max;  
                          try   {  
                                  max   =   Integer.valueOf(maxconn).intValue();  
                          }  
                          catch   (NumberFormatException   e)   {  
                                  //log("Invalid   maxconn   value:   "   +   maxconn   +   "   .for:   "   +   poolName);  
                                  max   =   0;  
                          }  
                          DBConnectionPool   pool   =  
                          new   DBConnectionPool(poolName,   url,   user,   password,   max);  
                          pools.put(poolName,   pool);  
                          //log("Initialized   pool:"   +   poolName);  
                  }  
          }  
  }  
   
   
  /**  
  *   读取属性完成初始化  
  */  
  private   void   init()   {  
          InputStream   is   =   getClass().getResourceAsStream("db.properties");  
          Properties   dbProps   =   new   Properties();  
          try   {  
                  dbProps.load(is);  
          }  
          catch   (Exception   e)   {  
                  System.err.println("Can   not   read   the   properties   file;   "   +   "Make   sure   db.properties   is   in   the   Classpath");  
                  return;  
          }  
          String   logFile   =   dbProps.getProperty("logfile",   "DBConnectionManager.log");  
          try   {  
                  log   =   new   PrintWriter(new   FileWriter(logFile,   true),   true);  
          }  
          catch   (IOException   e)   {  
                  System.err.println("Can   not   open   the   log   files:   "   +   logFile);  
                  log   =   new   PrintWriter(System.err);  
          }  
          loadDrivers(dbProps);  
          createPools(dbProps);  
  }  
   
   
  /**  
  *   装载和注册所有JDBC驱动程序  
  *  
  *   @param   props   属性  
  */  
   
  private   void   loadDrivers(Properties   props)   {  
          String   driverClasses   =   props.getProperty("drivers");  
          StringTokenizer   st   =   new   StringTokenizer(driverClasses);  
          while   (st.hasMoreElements())   {  
                  String   driverClassName   =   st.nextToken().trim();  
                  try   {  
                          Driver   driver   =   (Driver)  
                          Class.forName(driverClassName).newInstance();  
                          DriverManager.registerDriver(driver);  
                          drivers.addElement(driver);  
                          //log("Registered   JDBC   driver:"   +   driverClassName);  
                  }  
                  catch   (Exception   e)   {  
                          //log("Can   not   register   JDBC   driver   "   +   driverClassName   +   ",Exception:"   +   e);  
                  }  
          }  
  }  
   
  /**  
  *   将文本信息写入日志文件  
  */  
  private   void   log(String   msg)   {  
          log.println(new   Date()   +   ":   "   +   msg);  
  }  
   
  /**  
  *   将文本信息与异常写入日志文件  
  */  
  private   void   log(Throwable   e,   String   msg)   {  
          log.println(new   Date()   +   ":   "   +   msg);  
          e.printStackTrace(log);  
  }  
   
  /**  
  *   此内部类定义了一个连接池.它能够根据要求创建新连接,直到预定的最  
  *   大连接数为止.在返回连接给客户程序之前,它能够验证连接的有效性.  
  */  
  class   DBConnectionPool   {  
          private   int   checkedOut;  
          private   Vector   freeConnections   =   new   Vector();  
          private   int   maxConn;  
          private   String   name;  
          private   String   password;  
          private   String   URL;  
          private   String   user;  
   
  /**  
  *   创建新的连接池  
  *  
  *   @param   name   连接池名字  
  *   @param   URL   数据库的JDBC   URL  
  *   @param   user   数据库帐号,或   null  
  *   @param   password   密码,或   null  
  *   @param   maxConn   此连接池允许建立的最大连接数  
  */  
  public   DBConnectionPool(String   name,   String   URL,   String   user,   String   password,int   maxConn)   {  
          this.name   =   name;  
          this.URL   =   URL;  
          this.user   =   user;  
          this.password   =   password;  
          this.maxConn   =   maxConn;  
  }  
   
  /**  
  *   将不再使用的连接返回给连接池  
  *  
  *   @param   con   客户程序释放的连接  
  */  
  public   synchronized   void   freeConnection(Connection   con)   {  
  //   将指定连接加入到向量末尾  
          freeConnections.addElement(con);  
          checkedOut--;  
          notifyAll();  
  }  
   
  /**  
  *   从连接池获得一个可用连接.如没有空闲的连接且当前连接数小于最大连接  
  *   数限制,则创建新连接.如原来登记为可用的连接不再有效,则从向量删除之,  
  *   然后递归调用自己以尝试新的可用连接.  
  */  
  public   synchronized   Connection   getConnection()   {  
          Connection   con   =   null;  
          if   (freeConnections.size()   >   0)   {  
          //   获取向量中第一个可用连接  
                  con   =   (Connection)   freeConnections.firstElement();  
                  freeConnections.removeElementAt(0);  
                  try   {  
                          if   (con.isClosed())   {  
                                  //log("Removed   bad   connection   from   "   +   name);  
                                  //   递归调用自己,尝试再次获取可用连接  
                                  con   =   getConnection();  
                          }  
                  }  
                  catch   (SQLException   e)   {  
                          //log("Removed   bad   connection   from   "   +   name);  
                          //   递归调用自己,尝试再次获取可用连接  
                          con   =   getConnection();  
                  }  
          }  
          else   if   (maxConn   ==   0   ||   checkedOut   <   maxConn)   {  
                  con   =   newConnection();  
          }  
          if   (con   !=   null)   {  
                  checkedOut++;  
          }  
          return   con;  
  }  
   
  Top

16 楼jackinelee()回复于 2006-05-03 18:28:22 得分 0

续:/**  
  *   从连接池获取可用连接.可以指定客户程序能够等待的最长时间  
  *   参见前一个getConnection()方法.  
  *  
  *   @param   timeout   以毫秒计的等待时间限制  
  */  
  public   synchronized   Connection   getConnection(long   timeout)   {  
          long   startTime   =   new   Date().getTime();  
          Connection   con;  
          while   ((con   =   getConnection())   ==   null)   {  
                  try   {  
                          wait(timeout);  
                  }  
                  catch   (InterruptedException   e)   {}  
                  if   ((new   Date().getTime()   -   startTime)   >=   timeout)   {  
                  //   wait()返回的原因是超时  
                          return   null;  
                  }  
          }  
          return   con;  
  }  
   
  /**  
  *   关闭所有连接  
  */  
  public   synchronized   void   release()   {  
          Enumeration   allConnections   =   freeConnections.elements();  
          while   (allConnections.hasMoreElements())   {  
                  Connection   con   =   (Connection)   allConnections.nextElement();  
                  try   {  
                          con.close();  
                          //log("Closed   connection   for   pool   "   +   name);  
                  }  
                  catch   (SQLException   e)   {  
                          //log(e,   "Can   not   close   connection   for   pool   "   +   name);  
                  }  
          }  
          freeConnections.removeAllElements();  
  }  
   
  /**  
  *   创建新的连接  
  */  
  private   Connection   newConnection()   {  
          Connection   con   =   null;  
          try   {  
                  if   (user   ==   null)   {  
                          con   =   DriverManager.getConnection(URL);  
                  }  
                  else   {  
                          con   =   DriverManager.getConnection(URL,   user,   password);  
                  }  
                  //log("Created   a   new   Connection   in   pool   "   +   name);  
          }  
          catch   (SQLException   e)   {  
                  //log(e,   "Can   not   create   a   new   Connection   for   "   +   URL);  
                  return   null;  
          }  
          return   con;  
  }  
   
  }  
  }Top

相关问题

关键词

得分解答快速导航

  • 帖主:szc21
  • i169net1
  • Netfe
  • ice_frank
  • aspdotnet2005
  • tomtown530
  • insiderc
  • winner2050
  • hnzpz
  • yishanhai
  • gzlaspnet
  • hujunhua
  • NuclearG

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo