Tomcat 部署 war包以及Tomcat的理解
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
posted on 2022-07-22 14:39 与时具进&不忘初心 阅读(4958) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?