• 最佳实践: 勿在 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.
                            }
                 }
    }
  • 相关阅读:
    git使用
    silverlight与wcf双向通讯 例子
    Oracle 存储过程
    C# 视频教程
    佩服的技术大牛 “赵劼”
    setTimeout setInterval
    js闭包
    MVC Razor视图引擎控件
    MVC json
    springboot创建多环境profile打包
  • 原文地址:https://www.cnblogs.com/soundcode/p/6296519.html
Copyright © 2020-2023  润新知