整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

Tomcat 原理、调优和错误汇总

Tomcat 原理、调优和错误汇总

地环境:Tomcat 6、Windows 10、Java 1.7、myeclipse 10

一、使用方法

1.1 Tomcat 部署静态页面

参考链接:https://blog.csdn.net/qq_32786873/article/details/79609314

二、使用错误

2.1 503 Service Unavailable

原因:

2.2 The web application [/project-name] registered the JDBC driver [oracle.jdbc.driver.OracleDriver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.

或者The web application [/project-name] registered the JDBC driver [com.alibaba.druid.proxy.DruidDriver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.

可能存在的问题

  • 数据库账号密码错误
  • 有多个数据库配置源
  • jar包问题,把连接jdbc的jar包,拷贝到tomcate的lib目录下就可以了,如:ojdbc14.jar
  • 服务器内存冲突,重启系统
  • Tomcat内存不够
  • Window->Preferences->tomcat 点击右侧的按钮,
  • Creat Launch Configuration,在你对应的tomcat属性Aarguments下面添加一句话:
  • -Xms256m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=256m
  • 误报:https://github.com/alibaba/druid/issues/1699

实现ServletContextListener,然后再contextDestroyed()方法中添加如下代码:

Enumeration drivers=DriverManager.getDrivers();

while (drivers.hasMoreElements()) {

Driver driver=drivers.nextElement();

try {

DriverManager.deregisterDriver(driver);

logger.info(String.format(“deregistering jdbc driver: %s”, driver));

} catch (SQLException e) {

e.printStackTrace();

logger.error(String.format(“deregistering jdbc driver: %s”, driver));

}

}

最后在web.xml中注册自己的监听器,问题解决。

2.3 lib1.so: lib2.so: 无法打开共享对象文件: 没有那个文件或目录

(1)如果共享库文件安装到了/lib或/usr/lib目录下, 那么需执行一下ldconfig命令

(2)

 # cat /etc/ld.so.conf
 include ld.so.conf.d/*.conf
 # echo "/usr/local/lib" >> /etc/ld.so.conf
 # ldconfig

(3) export LD_LIBRARY_PATH=…/webapps/项目名称/WEB-INF/classes

参考链接:https://www.cnblogs.com/Anker/p/3209876.html

myeclipse修改代码后无法实时加载到tomcat

暂未解决

三、原理

概述

HTTP server主要用来给浏览器等客户端提供静态资源的访问功能,还有代理服务器、负载均衡等功能。当然,通过CGI/Servlet技术,也可以将处理过的动态内容通过HTTP Server分发,但是一个HTTP Server始终只是把服务器上的文件如实的通过HTTP协议传输给客户端。

而tomcat属于application server,也是绑定服务器IP并监听TCP端口。它实现了部分HTTP server的功能,没有nginx和Apache的功能丰富。主要用于处理动态内容。没有提供java EE规范,如下图:

架构

两大核心部分connector(连接器)和container(容器)。

tomcat的work目录是工作目录,在浏览器访问jsp=》java=》.class。tomcat定时扫描work目录,不是实时的,因此修改jsp文件后不会立马生效,可以立即删除work目录。

针对由jsp转换成的java文件,比如my-jsp.java,tomcat编译支持的文件大小最大为64k。改进:1.把jsp中的业务逻辑写入单独的类,在jsp中通过调用这个类的静态方法来执行;2.将jsp页面中的js提取出来放到单独的js文件内。

AJP协议:二进制协议

客户端< - http / s->代理< - http / s - >应用

VS

客户端< - http / s->代理< - AJP - >应用

xshell 关闭后 linux的tomcat断掉解决

方法一:

输入命令

nohup ./catalina.sh run &

显示为:

[1]8579

如何关掉?

输入命令查看进程号

ps -ef |grep tomcat

显示处root 456 33345 99。。。省略

其中33345为端口号

输入命令结束进程 kill -9 进程号

kill -9 33345

方法二:

启动方式

(1)Catania

(2)startup

使用startup方式启动tomcat,tomcat运行不受shell影响。

Several ports (8005, 8080, 8009) required by Tomcat Server at localhost are already in use

方法一:进入tomcat bin目录执行shutdown.sh或者shutdown.bat。

方法二:进一步排查——任务管理器或者命令行kill杀掉Java、tomcat相关进程,重启eclipse。

tomcat 调优

动静分离

nginx+tomcat,使用nginx实现静态资源的访问,tomcat处理jsp。

tomcat线程池

打开tomcat的server.xml

配置Executor

??<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="150" minSpareThreads="4" maxIdLeTime="60000"/>

参数解释

name

给执行器(线程池)起一个名字

namePrefix

指定线程池中的每一个线程的name前缀

maxThreads

线程池中最大的线程数量

假设:请求的数量超过了“750”,这将不是意味着将maxThreads属性值设置为“750”,它的最好解决方案是使用“Tomcat集群”。

也就是说,如果有“1000”请求,两个Tomcat实例设置“maxThreads=500”,而不在单Tomcat实例的情况下设置maxThreads=1000。

minSpareThreads

线程池中允许空闲的线程数量(多余的线程都杀死)

maxIdLeTime

一个线程空闲多久算是一个空闲线程

其他的配置其实阅读官方文档是最好的。

 <Connector port="8081" protocol="HTTP/1.1" executor="tomcatThreadPool"
 connectionTimeout="20000"
 redirectPort="8443" enableLookups="false"/>

enableLookups="false"

关闭dns解析,减少性能损耗

minProcessors

服务器启动时创建的最少线程数

maxProcessors

最大可以创建的线程数

acceptCount=“1000”

线程池中的线程都被占用,允许放到队列中的请求数

maxThreads=“3000”

最大线程数

minSpareThreads=“20”

最小空闲线程数,这里是一直会运行的线程

和压缩有关系的配置

通过修改tomcat的运行模式

BIO

Tomcat8以下版本,默认使用的就是BIO(阻塞式IO)模式。

对于每一个请求都要创建一个线程来进行处理,不适合高并发

APR(Apache Portable Runtime)

是Tomcat生产环境运行的首选方式

如果操作系统未安装apr或者apr路径未指到Tomcat默认可识别的路径,

则apr模式无法启动,自动切换启动nio模式。

所以必须要安装apr和native,直接启动就支持apr

apr是从操作系统级别解决异步IO问题,apr的本质就是使用jni(java native interface)

技术调用操作系统底层的IO接口,所以需要提前安装所需要的依赖

提升Tomcat对静态文件的处理性能,当然也可以采用动静分离。

禁用AJP连接器 Apache JServer Protocol

使用Nginx+tomcat的架构,所以用不着AJP协议,所以把AJP连接器禁用

Linux 下修改 TOMCAT_HOME/bin/catalina.sh,在其中加入,可以放在 CLASSPATH=下面:

JAVA_OPTS="-server -XX:PermSize=512M -XX:MaxPermSize=1024m -Xms2048m -Xmx2048m"

windows 下修改 TOMCAT_HOME/bin/catalina.bat,在其中加入,可以放在 set CLASSPATH=下面:

set JAVA_OPTS=-server -XX:PermSize=512M -XX:MaxPermSize=1024m -Xms2048m -Xmx2048m

这些参数在我们学习 JVM 部分文章时已经都认识过了,不过这里还是简单介绍下:

-server:启用 JDK的 server 版本;

-Xms:Java虚拟机初始化时堆的最小内存,一般与 Xmx配置为相同值,这样的好处是GC不必再为扩展内存空间而消耗性能;

-Xmx:Java虚拟机可使用堆的最大内存;

-XX:PermSize:Java虚拟机永久代大小;

-XX:MaxPermSize:Java虚拟机永久代大小最大值;

线程池配置

<Executor name="tomcatThreadPool" 
 namePrefix="catalina-exec-" 
 maxThreads="1000" 
 minSpareThreads="100" 
 maxIdleTime="60000" 
 maxQueueSize="Integer.MAX_VALUE" 
 prestartminSpareThreads="false" 
 threadPriority="5" 
 className="org.apache.catalina.core.StandardThreadExecutor"/> 

name:线程池名称,用于 Connector中指定。 namePrefix:所创建的每个线程的名称前缀,一个单独的线程名称为

namePrefix+threadNumber。 maxThreads:池中最大线程数。

minSpareThreads:活跃线程数,也就是核心池线程数,这些线程不会被销毁,会一直存在。

maxIdleTime:线程空闲时间,超过该时间后,空闲线程会被销毁,默认值为6000(1分钟),单位毫秒。

maxQueueSize:在被执行前最大线程排队数目,默认为Int的最大值,也就是广义的无限。除非特殊情况,这个值不需要更改,否则会有请求不会被处理的情况发生。

prestartminSpareThreads:启动线程池时是否启动 minSpareThreads部分线程。默认值为false,即不启动。

threadPriority:线程池中线程优先级,默认值为5,值从1到10。

className:线程池实现类,未指定情况下,默认实现类为org.apache.catalina.core.StandardThreadExecutor。如果想使用自定义线程池首先需要实现

org.apache.catalina.Executor接口。

线程池配置完成后需要在 Connector 中指定:

<Connector executor="tomcatThreadPool" 
... 

<Connector port="9027"
   ...........
   compression="on"
   compressionMinSize="2048"
 connectionTimeout="20000"
 compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
 ................
   />

compression 打开压缩功能

compressionMinSize 启用压缩的输出内容大小,这里面默认为2KB

compressableMimeType 压缩类型

connectionTimeout 定义建立客户连接超时的时间. 如果为 -1, 表示不限制建立客户连接的时间

参考链接:1.Tomcat 性能优化——

https://gitbook.cn/books/5ad3405a1b0f9f64ea5f7758/index.html#writeCommentDiv

本信息

姓名:七分简历

年龄:28岁

电话:186****7462

邮箱:449375****@qq.com

经验:6年

意向:java软件工程师

教育背景

时间:2012-09 - 2014-06

学校:【七分简历】师范大学 | 专业:计算机软件 | 学历:大专

工作经历

工作时间:2014-08 - 2017-07

公司名称:【七分简历】信息科技有限公司 | 所在部门: | 所在岗位:java软件工程师

工作描述:

职 位:Java软件工程师

工作描述:

1.参与项目的需求分析,研究项目功能实现细节。

2.根据新项目开发进度和任务分配,开发相应软件;根据需求及时修改完善软件。

3.在编程中积累解决问题的经验能高效且规范书写代码。

4.在自行编写完成时进行软件的测试和修复。

工作时间:2015-09 - 2016-04

公司名称:【七分简历】网络科技有限公司 | 所在部门: | 所在岗位:java软件开发实习工程师

工作描述:

在该公司,作为java开发实习生主要负责的工作有:

1、按照软件开发管理规范等的要求,根据主管分配的任务,参与程序开发、测试以及文档准备工作;

2、根据业务需求参与业务系统的系统设计或开发实现模块的设计、编码和单元测试工作;

项目经历

项目时间:2015-04 - 2016-04

项目名称:鲜果之家 | 项目工具:Windows

项目描述:

项目介绍

此电商系统属于B2C模式的一个水果商城,该商城致力于为客户提供选购、定制、配送、售后的全方位服务。商城主要功能模块有:用户管理、角色管理、权限管理、商品管理、公告管理、产品交易,订单管理,退款管理,账目统计,有问有答,界面管理。

根据项目需求,采用 Spring, SpringMVC,Mybatis作为底层框架,对项目进行一个分布式开发,采用MySql数据库,使用SVN对代码进行版本控制。使用Ajax异步以及正则表达式验证输入信息是否合法;使用fileupload组件实现用户信息的文件上传,使用init函数实现用户管理、商品管理、角色管理四个模块的分页操作;使用BootStrap 设计后台管理界面;使用 Shiro 实现用户登录的权限控制;使用redis缓存技术高效获取显示列表数据,以减轻服务器所承载的压力。

我的职责

主要负责后台管理模块:用户管理、商品管理、角色管理、公告管理,根据所需求的业务进行开发,代码编写,实现功能

项目时间:2015-07 - 2016-04

项目名称:够潮网女性购物商城

项目描述:

项目介绍

“够潮网女性购物商城”针对广大女性消费群众,为她们提供便利,从而提高生活水平的一个网上购物商城。该项目主要分为用户管理、公告管理、商品类型管理、商品管理、商品属性管理、评论管理、客户管理、订单管理、物流管理等模块。

我的职责

1.对负责的模块进行分析和设计。主要采用UML的用例图、顺序图和状态图。

2. 模块管理:完成对该系统中各个模块的管理。主要为CRUD操作。

3. 角色管理和用户管理:除基本的CRUD操作外,主要为权限的管理;该系统采用RBAC模式实现权限管理。将权限

授予如普通管理员和超级管理员,再将角色分配给用户的方式,实现对用户的授权;同时系统也可以对用户直接进行

授权。授权的具体实现采用DWR框架。

4. 工作流程:采用JBPM实现工作流程开发。

个人评价

1、为人稳重踏实,具有一定的逻辑思维能力,有较强的解决和分析问题能力;

2、工作能吃苦,做事积极、踏实,能独立完成功能模块的开发。

3、有较强的自学能力,能较快熟悉新技术。

4、待人热诚,能很好的与人沟通,具有较强的团队意识,集体荣誉感及组织协调能力。

5、熟练使用SSM、SSH等主流框架技术,对shiro框架有一定了解。

6、熟悉Bootscrap、EasyUI、jquery前端技术。

7、熟练SQLServer,MySQL数据库,了解Oracle数据库。

8、熟练掌握Tomcat服务器的安装部署。

9、熟练使用MyEclipse、Eclipse等开发工具进行开发。

个人技能

J2EE的主流框架SSH(hibernate,Struts2,Spring)

能运用SVN,Maven的功具

SQL Server,MySQL,oracle

Tomcat,jboss

Eclipse,MyEclipse

HTML,JSP,jQuery,Ajax,div+css,echarts

oop

JUnit代码的单元测试

linux常用的命令

了解io、多线程、集合

织良好的业务数据可以显著改善关键的决策过程。使用MyEclipse Reports?工具来开发各种Web报表。在本教程中,您将学习到:

  • 创建一个报表Web项目和数据源
  • 创建、布局和格式化的报表
  • 创建一个数据集
  • 排序报表数据
  • 部署和测试报表项目

持续时间:30分钟

没有MyEclipse?立即下载

1. 创建一个报表Web项目

这里有两种方法来创建报表Web项目。第一种方法是使用报表向导来创建一个新的项目;第二种方法是添加报表Web Runtime Facet到一个现有的MyEclipse Web项目中。

注意:MyEclipse标准用户不能使用报表功能。

1.1 创建一个新的报表Web项目

(1)选择File>New>Report Web Project。

(2)在项目名称字段中输入reportdemo,然后单击下一步。

注意:本教程使用默认的JavaEE 6版本;然而,在创建新的项目是JavaEE 7也是可行的。

创建一个新的报表Web项目

(3)配置项目文件夹结构,然后单击下一步。

项目文件夹配置

(4)更改或接受默认的Web模块文件夹名称,然后单击下一步。

设置Web模块的文件夹名称

(5)配置部署设置,指定报表引擎的日志记录级别,然后单击完成。

指定报表引擎的日志记录级别

报表项目结构

1.2 添加报表Web Runtime Facet到现有的Web项目中

您可以安装报表Web Runtime facet到任何现有的MyEclipse Web项目中。

(1)右键单击该项目,并选择MyEclipse>Project Facets>Install MyEclipse Report Web Runtime Facet。

添加report web runtime facet

(2)完成向导,然后单击Finish来更新项目。

当向导关闭时,系统会提示您打开MyEclipse Report Design视角,此时选择Yes。否则,您打开视角只能通过选择Window>Open Perspective>Other,然后选择MyEclipse Report Design才能打开。

2. 创建报表

(1)选择reportdemo项目,并选择File>New>Report。(当使用MyEclipse Report Design perspective时会出现报表工具栏选项)

(2)在文件名称字段中输入demo_report.rptdesign。报表的扩展名应该被命名为.rptdesign。

(3)请选中生成报表访问的网页选项,然后单击下一步。

选择项目报表

(4)从模板列表中选择空白报表,然后单击下一步。

选择一个报表模板

下一个页面,您可以创建一个示例JSP网页来演示如何使用新的报表进行工作。示例的样本JSP网页可以适当配置一个链接到您的报表中,或者直接将其嵌入报表中。

注意:如果您不在此时选择生成一个示例报表访问页面,以后可以随时通过右键单击该报表,并选择MyEclipse>Generate Sample Report Access WebPage。

(5)使用默认的文件夹位置,并输入demo_report.jsp作为JSP文件名。

(6)选择嵌入式报表查看器[JSP Tag]选项,然后单击Finish。

报表访问的网页选项

(7)为检索报表数据创建一个JDBC数据源,这个示例使用MyEclipse Derby数据库中的表。

3. 创建一个数据集

数据组是一个从数据源检索数据的集合。此数据将会显示在一个报表中,本示例中使用的是SQL数据源。

(1)在数据资源管理器中,右键单击数据集,并选择New Data Set。

创建一个新的数据集

(2)选择在上一节中创建的数据源。

(3)接受默认的MyEclipse SQL Select Query数据集类型。

(4)在数据集名称字段中输入Customers,然后单击下一步。

选择数据源

(5)输入以下SQL查询,然后单击Finish来执行SQL查询和创建数据集。

select CUSTOMERNAME, CONTACTFIRSTNAME, CONTACTLASTNAME, PHONE

from CLASSICCARS.CUSTOMER

数据集查询编辑器

对该数据集进行SQL查询检索数据。当您输入一个SQL查询时,查询编辑器提供内容辅助的模式和表名。您也可以在树形视图中双击一个表或列,并在编辑最后的地方插入查询该元素的限定名称。

如果创建数据集没有问题,那么打开编辑数据集窗口,让您进一步自定义数据集。选择Preview Results来显示SQL查询的数据结果。

数据集编辑器

4. 制定报表

下一个步骤就是将用户界面元素添加到报表中,用于从Customers数据集中显示数据。您可以通过右键单击报表页面来将报表元素插入到Report Designer中,然后从插入菜单中选择一个项目。或者在Palette视图中使用palette。Report Designer底部的标签允许您切换视图。

Report Designer

首先报表使用palette来添加表格元素。然后,从报表的数据表的列集合元素中绑定列。对于理解表功能是很重要的:

  • 表遍历所有数据行的数据集。
  • 它使您能够在一个行和列的格式中很容易地布局数据。

(1)打开Palette来查看报表元素。

Palette视图

(2)从palette中拖出一个表元素,并将其放在编辑器的报表中。

(3)指定3列、1行,然后单击下一步。

创建新表

(4)从数据集的下拉列表中选择Customers,点击全选,然后单击Finish。表的3列、1行会出现在编辑器中。

绑定数据集

(5)在数据资源管理器中,展开Customers数据集,查看您在查询中指定的列。

(6)从数据资源浏览器中拖动CUSTOMERNAME列,并将其放置在详细行的第一个单元格来绑定表格列的数据集元素。

表格中的详细行定义了数据集的列和它们表格中每一个数据行的显示顺序。在已完成的报表中,详细列的每一行数据都会在数据集中被重复。

拖动一个数据集列并放到表格单元格中

当CUSTOMERNAME列表从数据集被拖放到详细行时,在布局编辑器中加入[CUSTOMERNAME]数据绑定元素。此外标题行在新的[CUSTOMERNAME]数据元素上面,布局编辑器添加列标题标签,例如CUSTOMERNAME。

在表中的数据和标签要素

(7)拖放PHONE列在详细行的第二个单元格中。

(8)拖放CONTACTFIRSTNAME列在详细行的第三个单元格中。

(9)拖放CONTACTLASTNAME列在详细行的第三个单元格中,下面是CONTACTFIRSTNAME。

该报表的布局应该如下所示。

将Customer联系信息添加到表中

(10)为了确认该报表的数据和表格布局是正确的,在Report Designer底部单击预览选项。

预览报表数据

本站文章除注明转载外,均为本站原创或翻译