servlet 是多线程的。基于 servlet 的应用程序必须认识并适当地处理这一点。如果应用程序有很多大段的代码是同步的,那么这个应用程序实际上就变成单线程的,而且吞吐量会显著下降。
在 servlet 中不出现同步是最佳选择,然而,如果应用程序设计无法避免同步,那么请使用“锁对象(lock Object)”并且锁定可用性最小的代码路径。请不要同步 servlet 的 service 方法或 doGet 以及 doPost 方法。这些方法是主要代码路径。同步这些方法或任何这些 servlet 方法之一将锁定整个 servlet 实例。下列代码显示了一个使用“锁对象”来保护 servlet 实例变量 numberOfRows 的示例。
public class BpAllBadThingsServletsV1b extends HttpServlet
{
private int numberOfRows = 0;
private javax.sql.DataSource ds = null;
private Object lockObject = new Object();
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
Connection conn = null;
ResultSet rs = null;
PreparedStatement pStmt = null;
int startingRows = 0;
synchronize(lockObject) {
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
}
}
}
应被取代的方法
以下代码显示如何同步主要代码路径来保护称为 numberOfRows 的 servlet 实例变量。
使用 javax.servlet.SingleThreadModel 仍是另一种保护 servlet 实例变量的方法,但最好还是避免使用这种方法。 锁定主要代码路径:过度的同步
public class BpAllBadThingsServletsV1a 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;
try
{
synchronized(this) // Locks out Most of the Servlet Processing
{
startingRows = numberOfRows;
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
}
}
}
下面的图显示了同步的性能影响
- 大小: 4.4 KB
分享到:
相关推荐
如果Servlet内部有共享状态(如成员变量),需要采取同步机制,如`synchronized`关键字或使用线程局部变量来避免数据竞争。 2. **Servlet容器的多线程模型**: - Tomcat使用了Coyote Connector来处理HTTP请求,它...
在处理请求时,避免修改类级别的成员变量,或确保同步访问。 七、Servlet的性能优化 1. 使用HttpSession的最小化:频繁使用session会增加内存消耗,应尽量减少session的使用。 2. 缓存利用:可以缓存常访问的数据,...
线程同步是防止多个线程同时访问共享资源,以避免数据不一致,Java提供了synchronized关键字、wait()、notify()和notifyAll()等机制来实现线程同步。 【集合】 Java集合框架是Java中的核心部分,用于存储和操作对象...
应最小化Session使用,或使用其他存储机制。 2. 缓存响应:对于重复请求,可以考虑缓存响应,避免重复计算。 3. 使用过滤器:过滤器可以预先处理请求和响应,提高效率,比如GZIP压缩、字符集转换等。 五、EJB问题...
(2)建模简单:通过使用线程可以讲复杂并且异步的工作流进一步分解成一组简单并且同步的工作流,每个工作流在一个单独的线程中运行,并在特定的同步位置交互 (3)简化异步事件的处理:服务器应用程序在接受...
- **如何避免方法被重载**:在Java中不存在真正意义上的禁止方法被重载的概念,但可以通过命名规范或逻辑设计来减少重载的可能性。 以上是对给定文件中的知识点进行了详细的解析和扩展。希望这些内容能够帮助准备...
- **Catalina**:Catalina是Tomcat的核心组件,负责处理Servlet和JSP的生命周期,包括加载、初始化、服务和销毁等过程。 - **Connector**:连接器组件负责接收HTTP请求并将它们转换为内部Tomcat格式,同时将内部...
2. JSP和Servlet优化:利用缓存,避免不必要的计算,减少内存占用。 以上仅是WebLogic性能调优的部分关键参数和策略,实际操作中还需结合应用特性、硬件资源和业务需求进行综合考虑。通过监控和持续调整,可以有效...
受保护区域是指在多线程环境中,为了防止并发访问而导致的数据不一致性,而使用同步机制(如锁)保护的代码段。通过确保每次只有一个线程可以访问受保护区域,可以有效地避免竞态条件。 #### 33. 堆 (Heap) 堆是...
12. **Servlet**:`doGet()`和`doPost()`用于处理HTTP请求,`init()`初始化Servlet,`service()`根据请求类型调用`doGet()`或`doPost()`,`destroy()`在Servlet销毁前调用。 13. **EJB(Enterprise JavaBeans)**:...
负载均衡是一种网络技术,用于将工作负载分布到多个计算资源,如服务器,以优化资源使用、最大化吞吐量、最小化响应时间并防止过载。在Web服务领域,负载均衡常被用来分散到达服务器的网络流量,确保没有单点故障,...
- **servlet的配置**:在`web.xml`文件中进行,包括servlet的命名、映射URL、初始化参数等。 #### EJB - **EJB容器提供的服务**:生命周期管理、代码生成、持久性管理、安全性、事务管理、锁管理和并发控制。 - **...
5.10 选取序列中最小的第n个元素 200 5.11 三行代码的快速排序 203 5.12 检查序列的成员 206 5.13 寻找子序列 208 5.14 给字典类型增加排名功能 210 5.15 根据姓的首字母将人名排序和分组 214 第6章 面向对象...
负载平衡是将工作负载分布到多个计算资源上,以优化资源使用、最大化吞吐量、最小化响应时间并避免过载。在Apache与Tomcat的组合中,Apache可以作为反向代理服务器,根据预设的策略(如轮询、最少连接数或IP哈希)将...
**为什么wait(), notify()和notifyAll()必须在同步方法或同步块中被调用** - 这些方法需要与锁的获取和释放配合使用,确保线程安全。 **Thread类中的yield方法的作用** - `yield()`方法让当前线程放弃CPU,让同...
与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。...
正确的做法是仅重启有问题的特定服务,以最小化对业务的影响。 定时主动重启适用于互联网服务软件的容错,是因为它可以迅速恢复服务,减少用户感知到的中断时间。当服务出现异常时,自动重启能够快速恢复服务状态,...
线程同步通过synchronized关键字、wait/notify机制、Lock接口等实现,避免并发问题。 6. 数据结构:ArrayList、LinkedList、HashMap、HashSet等是Java中常见的数据结构。了解它们的内部实现原理,如ArrayList的动态...