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.
                            }
                 }
    }
  • 相关阅读:
    iOS 苹果开发证书失效的解决方案(Failed to locate or generate matching signing assets)
    iOS NSArray数组过滤
    App Store2016年最新审核规则
    iOS 根据字符串数目,自定义Label等控件的高度
    iOS 证书Bug The identity used to sign the executable is no longer valid 解决方案
    Entity FrameWork 增删查改的本质
    EF容器---代理类对象
    Entity FrameWork 延迟加载本质(二)
    Entity FrameWork 延迟加载的本质(一)
    Entity FrameWork 增删查改
  • 原文地址:https://www.cnblogs.com/soundcode/p/6296519.html
Copyright © 2011-2022 走看看