我用的jdbc去访问数据库的,在jsp上显示的,我的sql是嵌套循环的,用一个主sql,查询出来的id,作为循环里种其他的sql的条件,下面是我的部分代码。String strSQL="select ProcessID,NodeID from TTA_ProcessNode where FormID=?  order by NodeID ";
//String strSQL="select ProcessID,NodeID from (select ProcessID,NodeID from TTA_ProcessNode where FormID=?  order by NodeID desc)  where rownum<3";
  System.out.println(strSQL);
  ResultSet rs=JspAdmJdbc.strSQLSet(formid,strSQL);
          ResultSet rss;
           while (rs.next()){
           out.print("<tr bgcolor='#ffffff'>");
           String territory_r="";
           String territory_p="";
           String territory_c="";
           String territory_a="";
           String territory="";
           String modalityname="";
           String productname=""; 
           String functionname="";
           String account="";
           String titlename="";
           String FreeCondition="";
           String IsEnd="";
           String Channel="";
           String IsDirect="";
           //rs.getInt("ProcessID");
           String strSQL_r="select RegionID,RegionName from TTG_Region where ltrim(rtrim(RegionID)) in" +
           "(select ltrim(rtrim(territory)) from TTA_ProNodeTerritory where ProcessID = "+rs.getInt("ProcessID")+" and territory like 'R%')";
           rss=JspAdmJdbc.strSQLSet(strSQL_r);
           while(rss.next()){
           territory_r=territory_r+rss.getString("RegionName")+",";
           }
           rss.close();
          
           String strSQL_p =  "select ProvinceID,ProvinceName from TTG_Province where ltrim(rtrim(ProvinceID)) in"+
           "(select ltrim(rtrim(territory)) from TTA_ProNodeTerritory where ProcessID ="+rs.getInt("ProcessID")+" and territory like 'P%')";
           rss=JspAdmJdbc.strSQLSet(strSQL_p);
           while(rss.next()){
           territory_p=territory_p+rss.getString("ProvinceName")+",";
           }
           rss.close();
          
           String strSQL_c = "select CityID,CityName from TTG_City where ltrim(rtrim(CityID)) in "+
           "(select ltrim(rtrim(territory)) from TTA_ProNodeTerritory where ProcessID = "+rs.getInt("ProcessID")+" and territory like 'C%')";
           rss=JspAdmJdbc.strSQLSet(strSQL_c);
           while(rss.next()){
           territory_c=territory_c+rss.getString("CityName")+",";
           }
           rss.close();
          
           String strSQL_a = "select AccountID,EnglishName from TTG_Account where ltrim(rtrim(AccountID)) in"+
           "(select ltrim(rtrim(territory)) from TTA_ProNodeTerritory where ProcessID ="+rs.getInt("ProcessID")+" and territory like 'H%')";
           rss=JspAdmJdbc.strSQLSet(strSQL_a);
           while(rss.next()){
           territory_a=territory_a+rss.getString("EnglishName")+",";
           }
           rss.close();
          
           territory=territory_r+territory_p+territory_c+territory_a;
            if ("".equals(territory)){
           territory="All"; 
            } 
            
           String strSQL_f="select FunctionID,FunctionName from TTG_Function where FunctionID in "+
           "(select FunctionID from TTA_ProNodeFunction  where ProcessID ="+rs.getInt("ProcessID")+")"; 
           rss=JspAdmJdbc.strSQLSet(strSQL_f);
           while(rss.next()){
           functionname=functionname+rss.getString("FunctionName")+",";
           }
           rss.close();
           if ("".equals(functionname)) {
           functionname="All";
           }
          
           String  strSQL_m = "select modalityID,ModalityName from ttg_modality where modalityID in"
           +"(select Replace(product,'m','') as modalityid from tta_ProNodeProduct where processid ="+rs.getInt("ProcessID")+"  and product like 'm%')";
           rss=JspAdmJdbc.strSQLSet(strSQL_m);
           while(rss.next()){
           modalityname=modalityname+rss.getString("ModalityName")+",";
           }
           rss.close();
           if ("".equals(modalityname)) {
           modalityname="All";
           }   
          
           String strSQL_pd = "select productID,productName from TTG_Product where productid in"
           +"(select Replace(product,'p','') as productid from tta_ProNodeProduct where processid ="+rs.getInt("ProcessID")+" and product like 'p%')";
           rss=JspAdmJdbc.strSQLSet(strSQL_pd);
           while(rss.next()){
           productname=productname+rss.getString("ProductName")+",";
           }
           rss.close();
           if ("".equals(productname)) {
           productname="All";
           } 
          
           String strSQL_ac ="select ProcessID,AccountProperty from TTA_ProNodeAccount where processid ="+rs.getInt("ProcessID")+"";
           rss=JspAdmJdbc.strSQLSet(strSQL_ac);
           System.out.println(strSQL_ac);
           if(!rss.next()){
           account="All";
           }else{
           if ("1".equals(rss.getString("AccountProperty")))
      account="Key Account";
    
     if ("2".equals(rss.getString("AccountProperty")))
     account="General Account"; 
 
     if ("3".equals(rss.getString("AccountProperty")))
      account="Value Account";
 
     if ("0".equals(rss.getString("AccountProperty")))
     account="All";
           }
           System.out.println("acount: "+account);
     rss.close();
     
     String  strSQL_t="select TitleID,TitleName from TTA_Title where TitleID in (select TitleID from TTA_ProcessToEmp where ProcessID ="+rs.getInt("ProcessID")+") ";
    rss=JspAdmJdbc.strSQLSet(strSQL_t);
    if(rss.next()){
   titlename=rss.getString("TitleName");
    }
    if ("".equals(titlename)){
   titlename="None";
    }
    rss.close();
    
    String  strSQL_ch="select ProcessID,IsEnd,Channel from TTA_ProNodeCondition where ProcessID="+rs.getInt("ProcessID")+"";
    rss=JspAdmJdbc.strSQLSet(strSQL_ch);
    if(rss.next()){
    if(rss.getInt("IsEnd")==0){
   IsEnd="No";
    }else{
   IsEnd="Yes";
    }
    if(rss.getInt("Channel")==1){
   Channel="Direct";
    }
   if(rss.getInt("Channel")==2){
   Channel="InDirect";
    }
   if(rss.getInt("Channel")==0){
   Channel="All";
    }
    }
    rss.close();
    
   strSQL_ch="select IsDirect from TTA_ProcessToEmp where ProcessID="+rs.getInt("ProcessID")+"";
   rss=JspAdmJdbc.strSQLSet(strSQL_ch);
   if(rss.next()){
   if(rss.getInt("IsDirect")==1){
  IsDirect="Yes";
   }else{
   IsDirect="No";
   }
   }
   rss.close();
   
   String strSQL_con="select FreeCondition from TTA_ProNodeCondition where ProcessID="+rs.getInt("ProcessID")+"";
   rss=JspAdmJdbc.strSQLSet(strSQL_con);
   if(rss.next()){
   if(rss.getString("FreeCondition")==null){
  FreeCondition="None";
   }else{
     FreeCondition=(rss.getString("FreeCondition")).trim();
             }
   }  
           rss.close();
          
          
           String ChangeIndex_3="";
           out.print("<td><div align='center' class='style1'>"+rs.getInt("NodeID")+"</div></TD>");           out.print("<td style='word-wrap:break-word;width:50px'><div align='center' class='style1'><A HREF=Edit_Territory.jsp?ProcessID="+rs.getInt("ProcessID")+">"+territory+"</a></div></TD>");           out.print("<td><div align='center' class='style1'><A HREF=Edit_Channel.jsp?ProcessID="+rs.getInt("ProcessID")+">"+Channel+"</a></div></TD>");           out.print( "<td style='word-wrap:break-word;width:50px'><div align='center' class='style1'><A HREF=Edit_function.jsp?ProcessID="+rs.getInt("ProcessID")+">"+functionname+"</a></div></TD>");           out.print( "<td style='word-wrap:break-word;width:175px'><div align='center' class='style1'><A HREF=Edit_Modality.jsp?ProcessID="+rs.getInt("ProcessID")+">"+modalityname+"</a></div></TD>");           out.print( "<td style='word-wrap:break-word;width:50px'><div align='center' class='style1'><A HREF=Edit_Product.jsp?ProcessID="+rs.getInt("ProcessID")+"&actionIndication="+ChangeIndex_3+"&showTableIndication=3>"+productname+"</a></div></TD>");           out.print( "<td style='word-wrap:break-word;width:50px'><div align='center' class='style1'><A HREF=Edit_Account.jsp?ProcessID="+rs.getInt("ProcessID")+">"+account+"</a></div></TD>");
           out.print( "<td style='word-wrap:break-word;width:50px'><div align='center' class='style1'>" + FreeCondition + "</div></TD>");           out.print( "<td style='word-wrap:break-word;width:50px'><div align='center' class='style1'><A HREF=Edit_IsEnd.jsp?ProcessID="+rs.getInt("ProcessID")+">"+IsEnd+"</a></div></TD>");           out.print( "<td style='word-wrap:break-word;width:50px'><div align='center' class='style1'><A HREF=Edit_IsDirect.jsp?ProcessID="+rs.getInt("ProcessID")+">"+IsDirect+"</a></div></TD>");           out.print( "<td style='word-wrap:break-word;width:80px'><div align='center' class='style10'><A HREF=Edit_Title.jsp?ProcessID="+rs.getInt("ProcessID")+">"+titlename+"</a></div></TD>");
           out.print("<td align='center' style='word-wrap:break-word;width:25px'><img src='../../images/button_del.gif' hspace=0 vspace=0 border=0  style='cursor:hand'onMouseUp=ConfirmDel("+rs.getInt("ProcessID")+")></td>");
          }
           rs.close();
现在我领导给我个方案,让我把每个sql写在数据库中,用plsql,我试了下,还是要重复的连接数据库,效果不好,速度还是很慢,后来我想能不能把上面的java代码全放在plsql中,最后从plsql中传个集合到jsp页面,这样只需连接一次数据库。
    我还需要做个查询功能,因为加载速度很慢,查询也一定很慢,请问高手们能不能把这些在页面上显示得值保存的数据库中,通过创建一个view,或者表来,然后再去查询的时候直接去访问这个表或view
      有人遇到加载页面响应速度很慢的问题吗?大家能帮帮忙帮我解决吗?真是非常感谢大家了 

解决方案 »

  1.   

    如果是同一个页面需要多次访问,并且数据不是经常在变,可以把页面缓存到服务器的内存中,这方面的技术很多,比如OSCache,具体自行搜索
      

  2.   

    代码就不应该写在jsp里面吧 ajax局部加载
      

  3.   

    代码就不应该写在jsp里面吧 
      

  4.   

    高手能针对我这段jsp,给我例子吗?谢谢了。如何自行搜索
      

  5.   

     String strSQL_r="select RegionID,RegionName from TTG_Region where ltrim(rtrim(RegionID)) in" +
                      "(select ltrim(rtrim(territory)) from TTA_ProNodeTerritory where ProcessID = "+rs.getInt("ProcessID")+" and territory like 'R%')";
                      rss=JspAdmJdbc.strSQLSet(strSQL_r);
                      while(rss.next()){
                          territory_r=territory_r+rss.getString("RegionName")+",";
                      }
                      rss.close();      //这句是不是可以去掉啊。            
                      String strSQL_p =  "select ProvinceID,ProvinceName from TTG_Province where ltrim(rtrim(ProvinceID)) in"+
                      "(select ltrim(rtrim(territory)) from TTA_ProNodeTerritory where ProcessID ="+rs.getInt("ProcessID")+" and territory like 'P%')";
                      rss=JspAdmJdbc.strSQLSet(strSQL_p);
                      while(rss.next()){
                          territory_p=territory_p+rss.getString("ProvinceName")+",";
                      }
                      rss.close();
    还有,你查询了一次,只需要RegionName。你是不是可以把这两个SQL语句用一次查询呢?
    其他的情况类似,你看能不能把那些级联查询用一个SQL语句完成.可以一试。
      

  6.   

    有没有高人指点下,怎么做,才能提高访问数据库的速度,使用plsql怎么做?
      

  7.   

    我已经把能放在一起的sql都放在一起了,不过速度还是很慢,这是我的改的代码,高人看下String strSQL="select ProcessID,NodeID from TTA_ProcessNode where FormID=?  order by NodeID ";
    //String strSQL="select ProcessID,NodeID from (select ProcessID,NodeID from TTA_ProcessNode where FormID=?  order by NodeID desc)  where rownum<3";
      System.out.println(strSQL);
      ResultSet rs=JspAdmJdbc.strSQLSet(formid,strSQL);
              ResultSet rss;
               while (rs.next()){
    out.print("<tr bgcolor='#ffffff'>");
           String territory_r="";
           String territory_p="";
           String territory_c="";
           String territory_a="";
           String territory="";
           String modalityname="";
           String productname=""; 
           String functionname="";
           String account="";
           String titlename="";
           String FreeCondition="";
           String IsEnd="";
           String Channel="";
           String IsDirect="";
           //rs.getInt("ProcessID");
           String strSQL_r="select RegionID,RegionName from TTG_Region where ltrim(rtrim(RegionID)) in" +
           "(select ltrim(rtrim(territory)) from TTA_ProNodeTerritory where ProcessID = "+rs.getInt("ProcessID")+" and territory like 'R%')"+
           "union select ProvinceID,ProvinceName from TTG_Province where ltrim(rtrim(ProvinceID)) in"+
           "(select ltrim(rtrim(territory)) from TTA_ProNodeTerritory where ProcessID = "+rs.getInt("ProcessID")+" and territory like 'P%')"+
           "union select CityID,CityName from TTG_City where ltrim(rtrim(CityID)) in"+
           "(select ltrim(rtrim(territory)) from TTA_ProNodeTerritory where ProcessID = "+rs.getInt("ProcessID")+" and territory like 'C%')"+
           "union select AccountID,EnglishName from TTG_Account where ltrim(rtrim(AccountID)) in"+
           "(select ltrim(rtrim(territory)) from TTA_ProNodeTerritory where ProcessID ="+rs.getInt("ProcessID")+" and territory like 'H%')";       rss=JspAdmJdbc.strSQLSet(strSQL_r);
           while(rss.next()){
           territory_r=territory_r+rss.getString("RegionName")+",";
           }
           rss.close();                                                                
           territory=territory_r;
            if ("".equals(territory)){
           territory="All"; 
            } 
            System.out.println("territory:"+territory);
            
           String strSQL_ac ="select ProcessID,AccountProperty from TTA_ProNodeAccount where processid ="+rs.getInt("ProcessID")+"";
           rss=JspAdmJdbc.strSQLSet(strSQL_ac);
           System.out.println(strSQL_ac);
           if(!rss.next()){
           account="All";
           }else{
               if ("1".equals(rss.getString("AccountProperty")))
          account="Key Account";
        
         if ("2".equals(rss.getString("AccountProperty")))
         account="General Account"; 
     
         if ("3".equals(rss.getString("AccountProperty")))
          account="Value Account";
     
         if ("0".equals(rss.getString("AccountProperty")))
         account="All";
           }
           System.out.println("acount: "+account);
       rss.close();
       
       String  strSQL_m = "select modalityID,ModalityName from ttg_modality where modalityID in"
               +"(select Replace(product,'m','') as modalityid from tta_ProNodeProduct where processid ="+rs.getInt("ProcessID")+"  and product like 'm%')";
               rss=JspAdmJdbc.strSQLSet(strSQL_m);
               System.out.println(strSQL_m);
               while(rss.next()){
               modalityname=modalityname+rss.getString("ModalityName")+",";
               }
               rss.close();
               if ("".equals(modalityname)) {
               modalityname="All";
               }   
              
               String strSQL_pd = "select productID,productName from TTG_Product where productid in"
               +"(select Replace(product,'p','') as productid from tta_ProNodeProduct where processid ="+rs.getInt("ProcessID")+" and product like 'p%')";
               rss=JspAdmJdbc.strSQLSet(strSQL_pd);
               System.out.println(strSQL_pd);
               while(rss.next()){
               productname=productname+rss.getString("ProductName")+",";
               }
               rss.close();
               if ("".equals(productname)) {
               productname="All";
               } 
            
           String strSQL_f="select FunctionID,FunctionName from TTG_Function where FunctionID in "+
           "(select FunctionID from TTA_ProNodeFunction  where ProcessID ="+rs.getInt("ProcessID")+")"; 
           rss=JspAdmJdbc.strSQLSet(strSQL_f);
           while(rss.next()){
           functionname=functionname+rss.getString("FunctionName")+",";
           }
           rss.close();
           if ("".equals(functionname)) {
           functionname="All";
           }
          
             String  strSQL_ch="select ProcessID,IsEnd,Channel,FreeCondition from TTA_ProNodeCondition where ProcessID="+rs.getInt("ProcessID")+"";
      rss=JspAdmJdbc.strSQLSet(strSQL_ch);
      System.out.println(strSQL_ch);
      if(rss.next()){
      if(rss.getInt("IsEnd")==0){
     IsEnd="No";
      }else{
     IsEnd="Yes";
      }
      if(rss.getInt("Channel")==1){
     Channel="Direct";
      }
     if(rss.getInt("Channel")==2){
     Channel="InDirect";
      }
     if(rss.getInt("Channel")==0){
     Channel="All";
      }
     if(rss.getString("FreeCondition")==null){
      FreeCondition="None";
       }else{
         FreeCondition=(rss.getString("FreeCondition")).trim();
                 }
      }
      rss.close();
          
      String  strSQL_t="select a.TitleID,a.TitleName,b.IsDirect from (select TitleID,TitleName from TTA_Title where TitleID in (select TitleID from TTA_ProcessToEmp )) a ,TTA_ProcessToEmp b,TTA_ProNodeAccount c where a.TitleID=b.TitleID and b.processid="+rs.getInt("ProcessID")+"";
      rss=JspAdmJdbc.strSQLSet(strSQL_t);
      System.out.println(strSQL_t);
      if(rss.next()){
     titlename=rss.getString("TitleName");
     if(rss.getInt("IsDirect")==1){
    IsDirect="Yes";
     }else{
     IsDirect="No";
     }
      }
      if ("".equals(titlename)){
     titlename="None";
      }
      rss.close();
      

  8.   

    考虑用存储过程吧,你这样数据库访问太频繁,就是连接释放都要时间的,存储过程只要连接一次就行了,没仔细看你的逻辑,你用的是oracle吧,存储应该能满足你的要求....
      

  9.   

    很多的查询,你这样的首先里边的连接肯定是每次一个连接了
     rss=JspAdmJdbc.strSQLSet(strSQL_con);
    试试优化一下,或者直接拿一个连接出来,那么这么一个页面就只需要一个连接就OK了~~
    还有同一个语句你会执行很多次,所以请使用预编译,参数用?来设置.
    这样的话应该会有一定的提高了.
      

  10.   

    不要写多了java代码到jsp页面,写到专门的类文件里面,也就是用JavaBean。
    jsp+javabean,当然你要是懂servlet更好,加入servlet。
      

  11.   

    JSP 里面放这么多代码, 保证卡得死死
      

  12.   

    好乱!我看不了,你这么简单的逻辑,用PL/SQL干什么,浪费,我给你个建议,你这种编程方式早已经摒弃了,怎么页面还写在java代码里,而且你的SQL写的好乱,java代码也写的好乱,你不知道java有一种东西叫方法吗,怎么所有的逻辑全写在一个方法里了,我有项目,如果你想学习一下的话,给你发一个!
      

  13.   

    封装也只是逻辑上满足mvc结构而已页面写不写java从请求开始到页面加载完成是没多大差距的真正要速度提高明显1 : 不要用jdbc,换连接池2 : 对基础数据类型 比如行政省事关系,人员信息等等,可以在应用启动的时候读到内存里去,到时候访问比查数据库能快很多 . 3 : 能并做一句的就不要写2次查询希望对你有帮助  
      

  14.   

    我也想换连接池,不过我项目中框架已经写好了,我才进这个项目,对配置还不大懂,我头就让我用最简单的方法jsp, 数据库用jdbc 连接,我说用连接池,他说不行,让我用 存储过程来做,我也不懂,到底怎么去做,他就让我学习学习
      

  15.   

    1 试着下载 ie httpanalyzer 他可以看到从请求到页面完成。各个部分的耗时.应该是数据库查询慢了.
      看着语句不是很多.
    2 ltrim(rtrim(RegionID)) in ... 类似这样的是用不到索引的.
      首先每个sql都自己执行一下,看下效率,如果慢的,就需要换种写法,能用索引的最好用到索引,或者看看是不是有些查询没建立索引.
    3 如楼上所说rs不需要关闭,我的看法是必须关闭.
    4 使用preparedstatement来执行sql和传入参数,因为preparedstatement可以执行一个预编译.
      

  16.   

    2 ltrim(rtrim(RegionID)) in ... 类似这样的是用不到索引的.
      首先每个sql都自己执行一下,看下效率,如果慢的,就需要换种写法,能用索引的最好用到索引,或者看看是不是有些查询没建立索引.建立索引,他们都不是不同的表,你的意思是说在表中就建立索引,还是在新查询出来的结果中建立索引,能说的具体一点吗?谢谢 
      

  17.   

    最简单的方法不等于直接使用jdbc,
    如果你的JspAdmJdbc.strSQLSet()里面是直接打开Connect的话,
    不可能会快起来。给你想个办法,
    反正你是跑jsp,肯定用的tomcat之类的吧
    如果使用tomcat,可以参照下面的连接
    http://tomcat.apache.org/tomcat-7.0-doc/jndi-datasource-examples-howto.html在tomcat级别建立一个连接池,
    然后重写一下那个JspAdmJdbc.strSQLSet(),
    让它得到Connect的方法变为从tomcat里面“捞”,这样即满足了你头“简单的jsp”的需求,
    也使用上了连接池。good luck
      

  18.   

    可以自己写一个数据库操作的基类,怎么还在用纯JDBC?
    也可以用Ibatis
    如果不会 可以单独联系
    QQ:275080310
      

  19.   

    我按照你说的,用连接池来做了,我重写JspAdmJdbc.strSQLSet(),不过跑不了,你帮我看看呢这是我重写方法 public ResultSet strSQLSet(String str) {
     ResultSet rs  =null;  
     Statement stmt = null;  
     try{
     Context initContext = new InitialContext();
     Context envContext  = (Context)initContext.lookup("java:/comp/env");
     DataSource ds = (DataSource)envContext.lookup("jdbc/postgres");
     Connection conn = ds.getConnection();
     if(ds!=null){   
             conn = ds.getConnection();         
            stmt = conn.createStatement();  
             rs = stmt.executeQuery(str);           
         }
     }  
     catch(Exception ex){  
              ex.printStackTrace();  
              }  finally{
              }
     return rs;
    }
      

  20.   

    把你tomcat的配置文件信息也帖过来吧要注意的是,tomcat 5.0和5.5还有6之后的版本里面,
    配置文件位置是不一样的,
    一定要区分开,我之前给的是最新的7.0的,需要配置的文件的信息在下面这个连接,
    http://tomcat.apache.org/tomcat-7.0-doc/config/context.html其中这段话一定要看清楚
    Context elements may be explicitly defined: 之前的版本lz自己去找吧,就在tomcat.apache.org左面的documentation下面有相应版本的连接good luck
      

  21.   

    我tomcat连接池可以用了!我测试过了,不过我用方法去循环就跑一半就跑不下去了,
     <description>postgreSQL Datasource example</description>
     <res-ref-name>jdbc/postgres</res-ref-name>
     <res-type>javax.sql.DataSource</res-type>
     <res-auth>Container</res-auth>
    </resource-ref>  这是在web.xml
    <Resource name="jdbc/postgres" auth="Container"
              type="javax.sql.DataSource" driverClassName="oracle.jdbc.driver.OracleDriver"
              url="jdbc:oracle:thin:@3.36.234.24:1521:DEPOP3"
              username="epop3dbo" password="gtmepop3" maxActive="20" maxIdle="10"
    maxWait="-1"/>
    这是server.xml,  <ResourceLink global="jdbc/postgres" name="jdbc/postgres" type="javax.sql.DataSource"/> 这是context.xml
      

  22.   

    你每个查询都和ProcessID有关系,那么你可以把地区,省份,城市等和ProcessID有关系的属性放在一张表里
      

  23.   

    有人会用oscache吗?想做个jsp页面的查询,访问数据库太慢了,而且表单上的数据都是来自不同表的,查询就很困难,要把查询出来的结果集来再进行查询,有人能教教我吗?
      

  24.   

    谢谢在座得大家,我最后用SESSION来做的,把第一次加载页面的数据保存到SESSION中,查询时直接查询SESSION里面的值 ,效果还不错