Skip to content

J2EE 012 Servlet性能优化笔记

目录


简介

在开发基于J2EE的Web应用程序时,优化Servlet的性能至关重要。以下是一些关键点和实际可运行的代码示例。


配置JDK以提高Java程序效率

  1. 设置JVM参数
    在启动Tomcat服务器时,可以通过设置JVM参数来优化内存使用和垃圾回收行为。

  2. 配置文件路径
    确保所有资源(如数据库连接池、日志文件)的路径尽可能短,并且避免不必要的I/O操作。

  3. 启用G1垃圾收集器
    G1垃圾收集器是JDK 9+中的默认选项,适合大内存应用程序。在tomcat/bin/catalina.sh中添加以下参数:

bash
JAVA_OPTS="-XX:+UseG1GC -XX:MaxHeapFreeRatio=70"

调整Tomcat服务器参数以提升性能

  1. 调整线程池配置
    conf/server.xml文件中,修改 Connector 的 connectionTimeoutmaxThreads 参数:
xml
<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443"
           maxThreads="500" minSpareThreads="50"/>
  1. 启用压缩
    conf/server.xml中,添加以下配置以启用响应正文的压缩:
xml
<Connector port="8080" protocol="HTTP/1.1"
           compression="on"
           compressableMimeTypes="text/html,text/xml,application/json"/>
  1. 调整JDBC连接池
    conf/context.xml中,优化数据源配置:
xml
<Resource name="jdbc/myDB"
          auth="Container"
          type="javax.sql.DataSource"
          driverClassName="com.mysql.jdbc.Driver"
          url="jdbc:mysql://localhost:3306/testdb?useUnicode=true&characterEncoding=UTF-8"
          username="root" password="<PASSWORD>"
          maxActive="-1" maxIdle="-1" minIdle="5"/>

编写高效的Servlet代码

低效的示例代码

java
public class LowEfficientServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 模拟耗时操作
        Thread.sleep(1000);
        
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<h1>Low Efficiency Servlet</h1>");
    }
}

高效的优化代码

java
public class EfficientServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 使用线程池异步处理耗时操作
        ExecutorService executor = Executors.newSingleThreadExecutor();
        executor.execute(() -> {
            try {
                Thread.sleep(1000);
                
                synchronized (response) {
                    response.setContentType("text/html");
                    PrintWriter out = response.getWriter();
                    out.println("<h1>Efficient Servlet</h1>");
                }
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        });
        
        executor.shutdown(); // 确保线程池关闭
    }
}

总结

通过优化JDK配置、调整Tomcat服务器参数以及编写高效的Servlet代码,可以显著提升Web应用程序的性能。实际运行时可以根据具体需求进一步调优。