zoukankan      html  css  js  c++  java
  • 最佳实践: 勿在 Servlet 中实现 SingleThreadModel

    摘要

    请不要实现 SingleThreadModel 接口。这种实践将导致 Web 容器创建多个 servlet 实例;即为每个用户创建一个实例。对于任何大小的应用程序,这种实践都将导致严重的性能问题。 


    建议

    SingleThreadModel 是一种标记接口,servlet 可以通过实现它来将自己的重入(re-entrancy)问题传送给 servlet 引擎。javax.servlet.SingleThreadModel 本身就是 J2EE 规范的一部分。WebSphere servlet 引擎通过为每个用户创建单独的 servlet 实例来处理 servlet 的重入问题。因为这种方法导致极大的系统开销,所以,应该避免实现 SingleThreadModel。 

    通常,开发人员在多线程环境下使用 javax.servlet.SingleThreadModel 来保护可更新的 servlet 实例变量。 

    最佳方法 -- 不使用 SingleThreadModel

    public class BpAllBadThingsServletsV1c extends HttpServlet
    {
               private int numberOfRows = 0;
               private javax.sql.DataSource ds = null;
               public void doGet(HttpServletRequest request,
                                 HttpServletResponse response)
                                   throws ServletException, IOException
               {
                         Connection conn = null;
                         ResultSet rs = null;
                         PreparedStatement pStmt = null;
                         int startingRows = numberOfRows;
                         try
                         {                            String employeeInformation = null;
                                conn = ds.getConnection ("db2admin","db2admin");
                                pStmt = conn.prepareStatement
                                   ("select * from db2admin.employee");
                                rs = pStmt.executeQuery();
                         }
                         catch (Exception es)
                         {
                                   // Error handling code here.
                         }
               }
    }


    应被取代的方法 

    通常,开发人员在多线程环境下使用 javax.servlet.SingleThreadModel 来保护可更新的 servlet 实例。下列代码片断举例说明了什么是要避免的。

    避免这种情况!!!-- javax.servlet.SingleThreadModel

    public class BpAllBadThingsServletsV1c extends HttpServlet
                                           implements SingleThreadModel
    {
                 private int numberOfRows = 0;
                 private javax.sql.DataSource ds = null;
                 public void doGet(HttpServletRequest request,
                                   HttpServletResponse response)
                                     throws ServletException, IOException
                 {
                            Connection conn = null;
                            ResultSet rs = null;
                            PreparedStatement pStmt = null;
                            int startingRows = numberOfRows;
                            try
                            {
                                  String employeeInformation = null;
                                  conn = ds.getConnection ("db2admin","db2admin");
                                  pStmt = conn.prepareStatement
                                      ("select * from db2admin.employee");
                                  rs = pStmt.executeQuery();
                            }
                            catch (Exception es)
                            {
                                      // Error handling code here.
                            }
                 }
    }
  • 相关阅读:
    redis主从配置
    mysql被动模式下的主主配置
    centos7 重启网卡报错
    mysql innodb_data_file_path配置增加
    sql语句偶记录
    nginx 做前端代理时proxy参数配置
    firewalld实现网关功能
    mysql负载飙高原因分析
    nginx 直接返回状态码
    (转)Yale CAS + .net Client 实现 SSO(6)
  • 原文地址:https://www.cnblogs.com/soundcode/p/6296519.html
Copyright © 2011-2022 走看看