1、IDEA 把ssm项目打成一个war包
打开项目结构,找到Artifacts,点加号,找webapplication
此时 会在out/artifacts/ssm下出现一个ssm.war的包
2、把 ssm.war包部署在tomcat 目录下
启动tomcat
访问页面
3、服务发布后的调整
3.1 查看tomcat的日志
catalina.out 目录
3.2 设置应用的端口
1)war 包部署到 tomcat 时,server.port=9090 不生效,tomcat 运行时 访问端口 统一使用 tomcat 设置的端口 8080 等,位置是 D:\apache-tomcat-9.0.62\conf\server.xml
3.3 设置 访问路径为 localhost:8087/或者自定义访问路径
war 包部署到 tomcat时,tomcat 默认以 webapps下的文件夹来作为 context-path路径的,配置文件中的 context-path 只是对于 springboot 打包成 jar 包,才有用。
修改server.xml
在 根目录创建一个叫wars的文件夹,删除webapps 下的所有文件,把打好的war包ssm.war放在wars目录下,启动tomcat。
在 根目录创建一个叫wars的文件夹,删除webapps 下的所有文件,自定义Context标签中的 path 路径就行。
访问页面
4、应用打jar包是否需要tomcat
这里的意思是项目用的架构是Spring+Mybatis 不用SpringMVC,不和浏览器进行交互,所以不打war包 打jar包,运行方式是javar -jar就行
IDEA里面用Maven构建时需要再pom.xml配置打jar包的插件和打war包还不一样
<build>
<!-- jar bao de name -->
<finalName>JarPackageFileName</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<!--这里写你的main函数所在的类的路径名,也就是Class.forName的那个字符串-->
<mainClass>com.ali.gts.sofa.MyApp</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
5、Tomcat的理解和优化
Tomcat 进程的名字 叫 org.apache.catalina.startup.Bootstrap,Tomcat是java语言写的。Tomcat优化的方向有两个优化方向
1、tomcat 自身参数的优化 2、tomcat所运行的jvm的优化
5.1 Tomcat 自身参数的优化
1、修改tomcat-users.xml配置文件,配置tomcat的管理用户
tomcat/conf 目录下 的tomcat-users.xml 添加如下的代码
<role rolename="manager-gui"/>
<role rolename="manager"/>
<role rolename="admin"/>
<role rolename="admin-gui"/>
<user username="tomcat" password="tomcat" roles="manager-gui,manager,admin,admin-gui"/>
保存退出
2、修改webapps/manager/META-INF/context.xml文件,修改后就可以登陆tomcat系统了,tomcat7 不用修改
Context 这个标签下的value标签内容注视掉
3、此时可以启动tomcat了。
此时http://localhost:8080 就可以方案tomcat 首页了
4、禁用AJP
一般用不着所以会禁用掉
tomcat/conf server.xml 目录下 ajp的部分注释掉就行
5、tomcat线程池的配置
在tomcat中 每一个用户请求都是一个线程,所以可以使用线程池提高性能
还是修改server.xml就行
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="500" minSpareThreads="50" prestartminSpareThreads="true"
maxQueueSize="100"
/>
参数说明
maxThreads:最大并发数,默认是200 一般建议在500--1000 根据硬件设施和业务来判断
minSpareThreads:tomcat 初始化时创建的线程数,默认设置是25
prestartminSpareThreads: 在Tomcat 初始化的时候就初始化 minSpareThreads的参数值,如果不等于true,minSpareThreads
的值就没有效果了
maxQueueSize 最大的等待队列数,超过则拒绝请求
namePrefix:线程前缀
在Connector 中设置excutor 属性指向上面的执行器
<Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
在tomcat的 manager页面的 http-nio-8080 模块下发现 最大线程数是 -1,当前线程数是 50
显示-1的原因是 我们配置了excuter 导致的,只要配置了excuter就显示是-1,是正常的,说明我们的执行器配置生效了
6、tomcat 3中运行模式
分别是 bio、nio和apr三种模式
1、bio
tomcat 8 以下都是bio 性能非常低下,没有经过任何优化处理和支持,建议改成nio的模式
2、nio
比 bio 性能好,性价比比较高,tomcat8 是中默认是nio,并且有最新的nio2,速度更快,建议使用nio2
<Connector executor="tomcatThreadPool" port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
connectionTimeout="20000"
redirectPort="8443" />
把原来的协议HTTP/1.1改掉
重启tomcat
3、此时 nio2 模式已经生效了
7、tomcat的进程
org.apache.catalina.startup.Bootstrap
8、开始测试
接口 return-string-ajax.do
第一次测试接口 禁用掉了ajp的服务
吞吐量 757 /秒 rt 1168
第二次测试接口
吞吐量 652 /秒 rt 1232
设置线程池
1、最大线程数为500,初始化为50,最大队列等待数100,协议是nio2
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="500" minSpareThreads="50" prestartminSpareThreads="true"
maxQueueSize="100"
/>
<Connector executor="tomcatThreadPool" port="8087" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
connectionTimeout="20000"
redirectPort="8443" />
吞吐量 714 /秒 rt 1260
2、最大线程数为1000,初始化为200,最大队列等待数100,协议是nio2
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="1000" minSpareThreads="200" prestartminSpareThreads="true"
maxQueueSize="100"
/>
<Connector executor="tomcatThreadPool" port="8087" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
connectionTimeout="20000"
redirectPort="8443" />
吞吐量 651 /秒 rt 1357 测试了三次发现 这次没有第一次好
3、最大线程数为200,初始化为100,协议是nio2
吞吐量 590 /秒 rt 1535 测试了三次发现 这次没有第一次好
4、设置最大等待队列数为50
默认情况下,请求发送到tomcat,如果tomcat忙,那么请求就会一直等待,如果设置了最大等待队列
大小,如果等待队列也满了,那么请求就不等待了,虽然此时请求会失败 但是请求响应时间会缩短
最大线程数为500,初始化为50,最大队列等待数50,协议是nio2
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="500" minSpareThreads="50" prestartminSpareThreads="true"
maxQueueSize="50"
/>
5.2、TomcatJVM参数的优化
1、设置并行垃圾回收器 在 bin/catalina.sh 这个执行脚本里面 补充如下的代码
年轻代、老年代均使用并行收集器,初始化堆内存64M,最大堆内存512M 垃圾处理器是并行的默认也是并行的
JAVA_OPTS="-XX:+UseParallelGC -XX:+UseParallelOldGC -Xms64m -Xmx512m -XX:+PrintGCDetails -XX
:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:../logs/gc.log"
位置cygwin=false前
jps -lv | grep 进程号 看是否生效以及gc.log 是否生效
压测结果
fullgc 6次
minorgc 105次
说明年轻代大小需要调整,避免出现gc
fullgc 6次 说明堆内存需要调整
使用的是在线的gc分析工具 gceasy.io
2、设置堆和年轻代大小
堆初始化128m,最大堆内存1024m,初始化年轻代大小64m 最大年轻代大小 256m
JAVA_OPTS="-XX:+UseParallelGC -XX:+UseParallelOldGC -Xms128m -Xmx1024m -XX:NewSize=64m -XX:MaxNewSize=256m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:../logs/gc.log"
此时发现 吞吐量 860 /秒 平均响应时间 1012
minorgc 47次
fullgc 2次
说明调整有效果
3、使用G1垃圾回收器
设置了最大停顿时间100毫秒,初始堆内存128m,最大堆内存1024m,这里年轻代相关的参数
JAVA_OPTS="-XX:+UseG1GC -XX:MaxGCPauseMillis=100 -Xms128m -Xmx1024m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:../logs/gc.log"
此时发现 吞吐量 870 /秒 平均响应时间 1008
理论上G1垃圾处理器比并行的垃圾处理器好
调优要不断的测试,学会方法就行。
6、Tomcat配置数据库连接池
conf/context.xml中配置数据库连接信息
<Resource name="jdbc/mysqlds"
auth="Container"
type="javax.sql.DataSource"
username="root"
password="root"
maxIdle="30"
maxWait="10000"
maxActive="100"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://192.168.54.248:3306/mybatis" />
测试
<%--
Created by IntelliJ IDEA.
User: gaoheqiang
Date: 2022/4/11
Time: 9:28 AM
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.sql.*" %>
<%@ page import="javax.naming.*" %>
<%@ page import="javax.sql.DataSource" %>
<html>
<head>
<title>Title</title>
</head>
<body>
hello.jsp, ${msg}
Tomcat连接池测试,获取数据源 <br>
<%
try {
//初始化查找命名空间
Context ctx = new InitialContext();
//参数java:/comp/env为固定路径
Context envContext = (Context)ctx.lookup("java:/comp/env");
//参数jdbc/mysqlds为数据源和JNDI绑定的名字
DataSource ds = (DataSource)envContext.lookup("jdbc/mysqlds");
Connection conn = ds.getConnection();
PreparedStatement pstmt = null;//PreparedStatement对象
String sql = " select * from t_emp ";//'?'动态设置
pstmt = conn.prepareStatement(sql);//预编译sql语句
// pstmt.setString(1,"hello");//第一个动态字段是String类型
// pstmt.setInt(2,123);//第二个动态字段是int类型
//pstmt.executeUpdate();//执行语句
ResultSet resultSet = pstmt.executeQuery();
while(resultSet.next()) {
String column = resultSet.getString(3);
out.println(column);
}
conn.close();
out.println("<span style='color:red;'>JNDI测试成功<span>");
} catch (NamingException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
%>
Tomcat连接池测试,获取数据源1 <br>
</body>
</html>
结果
7、新电脑拉取Servlet项目 IDEA的配置并启动项目
http://www.zztongyun.com/article/idea%E5%A6%82%E4%BD%95%E9%83%A8%E7%BD%B2web