- Rongsen.Com.Cn 版权所有 2008-2010 京ICP备08007000号 京公海网安备11010802026356号 朝阳网安编号:110105199号
 - 北京黑客防线网安工作室-黑客防线网安服务器维护基地为您提供专业的
服务器维护
,企业网站维护
,网站维护
服务 - (建议采用1024×768分辨率,以达到最佳视觉效果) Powered by 黑客防线网安 ©2009-2010 www.rongsen.com.cn
 
 
    
        作者:黑客防线网安JSP教程基地 来源:黑客防线网安JSP教程基地 浏览次数:0 | 
作者:徐春金
JSP默认是以多线程方式执行的,这是JSP与ASP,PHP,PERL等脚本语言不一样的地方,也是它的优势之一,但如果不注意多线程中的同步问题,会使所写的JSP程序有难以发现的错误。下面以一个例子说明JSP中的多线程问题及解决方法。
<!----------------------- 第一篇文章: JSP的中存在的多线程问题 ----------------------->一、JSP的中存在的多线程问题:
当客户端第一次请求某一个JSP文件时,服务端把该JSP编译成一个CLASS文件,并创建一个该类的实例,然后创建一个线程处理CLIENT端的请求。如果有多个客户端同时请求该JSP文件,则服务端会创建多个线程。每个客户端请求对应一个线程。以多线程方式执行可大大降低对系统的资源需求,提高系统的并发量及响应时间.对JSP中可能用的的变量说明如下:
二、下面的例子存在的多线程问题:
  <%@ page import="
  javax.naming.*,
  java.util.*,
  java.sql.*,
  weblogic.common.*
  " %>
   
  
  <%
  String name
  String product;
  long  quantity;
  
  name=request.getParameter("name");
  product=request.getParameter("product");
  quantity=request.getParameter("quantity"); /*(1)*/
  savebuy();
  %>
  
  <%!
  public void  savebuy()
  {
      /*进行数据库操作,把数据保存到表中*/
      try {
        Properties props = new Properties(); 
        props.put("user","scott");
        props.put("password","tiger");
        props.put("server","DEMO");  
        Driver myDriver = (Driver) iver").newInstance();
        conn = myDriver.connect("jdbc:weblogic:oracle", props);
        stmt = conn.createStatement();
      
        String inssql = "insert into buy(empid, name, dept) values (?, ?, ?,?)";
        stmt = conn.prepareStatement(inssql); 
  
        stmt.setString(1, name);
        stmt.setString(2, procuct);   
        stmt.setInt(3, quantity);
        stmt.execute();
      }
      catch (Exception e) 
      {
          System.out.println("SQLException was thrown: " + e.getMessage());
      } 
      finally //close connections and     { 
          try {
            if(stmt != null)
              stmt.close();
            if(conn != null)
              conn.close();
          } catch (SQLException sqle) {
              System.out.println("SQLException was thrown: " + sqle.getMessage());
          }
      }
  }
  %>
<!----------------------- 第三篇文章: 解决方法 ------------------->
三、解决方法
  name=request.getParameter("name");
  product=request.getParameter("product");
  quantity=request.getParameter("quantity"); 
  savebuy(name,product,quantity)
  %>
  
如果savebuy的参数很多,或这些数据要在很多地方用到,也可声明一个类,并用他做参数,如:
public class buyinfo  public void savebuy(buyinfo info)
  {
        ......
  }
  调用方式改为:
  <%
  buyinfo userbuy = new buyinfo();
  userbuy.name=request.getParameter("name");
  userbuy.product=request.getParameter("product");
  userbuy.quantity=request.getParameter("quantity"); 
  savebuy(userbuy);
  %>
  所以最好是用3,因为1,2会降低系统的性能.
  多线程问题一般只有在在大并发量访问时,才有可能出现,并且很难重复出现,所以应在编程时就时刻注意。
| 我要申请本站:N点 | 黑客防线官网 | | 
| 专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479 |