1.
1.部署三种方式:
(1) 在server.xml的Host标签内新建一个Context标签
<Context path="/learn1" reloadable="true" docBase="E:/work/tech/project/learn1/WebRoot" workDir="E:/work/tech/project/learn1/WebRoot/work" />
* workDir是指Tomcat解析Jsp转换为Java文件,并编译为class存放的文件夹,设置在项目文件夹里面,可以避免移植到其他地方首次读取jsp文件需要重新解析 。一般格式:项目文件夹/work
(2) 放在tomcat的webapps下
(3) 在tomcat的conf/Catalina/localhost下建立一文件 <访问路径>.xml, 内容同(1)
2. <context reloadable=true> tomcat会自动检测/WEB-INF/lib和/class下的更新
http://localhost:8080/manager/reload?path=/<项目名> 可重新装载该项目,避免重启
3.1.性能
(1)使用线程池
Servlet引擎为每一个请求创建一个隔离的线程,分配这个线程给service()方法,在它执行完后移除这个线程。默认情况下,servlet引擎 为每一个请求创建新的线程。因为创建和消除线程是需要系统开销的,可以通过使用线程池来提升性能。依据所期望的并发用户数量,配置线程池的最大、最小、以 及增加数量。在服务启动的时候,servlet引擎使用最小的线程数量创建一个线程池。然后servlet引擎会分配线程给每一个请求,替换原来的创建新 的线程,在处理完成后把线程返回给线程池。使用线程池,性能会有一个显著的提升。如果需要,根据线程的最大和增加数量,更多的线程会被创建,添加到池中以 供更多的请求使用。
(2)禁止servlet和jsp的自动重载
为了节约开发时间,在开发阶段Servlet/JSP容器提供自动重载功能,方便你在修改Servlet/JSP后不用重新启动服务。可是,在J2EE的生产环境下关闭自动载入功能可以得到更好的性能。
(3)控制HttpSession
一个常见的误解是以为session在有客户端访问时就被创建,然而事实是直到某server端程式调用 HttpServletRequest.getSession(true)这样的语句时才被创建,注意如果JSP没有显示的使用 <%@page session="false"%> 关闭session,则JSP文件在编译成Servlet时将会自动加上这样一条语句HttpSession session = HttpServletRequest.getSession(true);这也是JSP中隐含的session对象的来历。由于session会消耗内 存资源,因此,如果不打算使用session,应该在所有的JSP中关闭他。
在默认情况下,不要在jsp页面中创建HttpSessions对象,jsp页面默认会自动创建HttpSessions,如果在你的jsp页面中不需要HttpSessions,为了节省一些性能,使用下面的页面指令避免自动创建HttpSessions对象。
<%@ page session="false"%>
不要存储大型对象到HttpSession:如果你存储大型对象数据到HttpSession中,应用服务器不得不在每一次请求中处理整个的 HttpSession,这将会强迫使用java的串行化操作,占用大量系统资源。应用服务的性能将会因为java的串行化操作而减少。
在结束时候释放HttpSessions对象:在它们不在需要的时候使用HttpSession.invalidate()方法消除sessions。
设置session的超时值:servlet有一个默认的超时值。如果你在这个时间里面,你既没有移除它,也没有使用它(进行任何服务请求),servlet服务将会自动将其销毁。尽可能的保持session 的超时值最小。
session在下列情况下被删除a.程式调用HttpSession.invalidate();或b.距离上一次收到客户端发送的session id时间间隔超过了session的超时设置;或c.服务器进程被停止(非持久session)
4.管理页面:
http://localhost:8080/manager/status 查看tomcat的并发访问量
5. tomcat启动时会装载contextConfigLocation参数指定的文件, 如果不指定contextConfigLocation参数 默认装载/WEB-INF/applicationContext.xml文件
6.性能优化
1) 加大tomcat连接线程数
server.xml的<Connector里:
minProcessors最小空闲连接数。默认10
maxProcessors并发处理的最大请求数,默认为75
acceptCount 允许最大的连接数,应该>=maxProcessor,默认为100
enableLookups 允许反查域名,为了提高处理能力,设为false
connectionTimeout 网络连接超时,单位:毫秒,通常为30000
* 加大并发数应该同时加大maxProcessors和acceptCount,可为1024
*允许的最大连接数还受限于操作系统的内核参数,通常windows是2000个左右,linux是1000个左右
2) . PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,
这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,
它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对
PermGen space进行清理,所以如果你的应用中有很多CLASS的话,就很可能出现PermGen space错误,
这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小
超过了jvm默认的大小(4M)那么就会产生java.lang.OutOfMemoryError: PermGen space 错误信息了。
解决方法: 手动设置MaxPermSize大小
修改TOMCAT_HOME/bin/catalina.sh, 在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行: JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m
建议:将相同的第三方jar文件移置到tomcat/shared/lib目录下,这样可以达到减少jar 文档重复占用内存的目的。
3)Heap size 设置
堆( Heap)是 Java 程序的对象生活的地方,包含活的对象,死的对象以及剩余内存。.JVM在启动的时候会自动设置Heap size的值, 其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。Heap size 的大小是Young Generation 和Tenured Generaion 之和。
提示:在JVM中如果98%的时间是用于GC且可用的Heap size 不足2%的时候将抛出java.lang.OutOfMemoryError: Java heap space 异常信息。
提示:Heap Size 最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。
解决方法:手动设置Heap size
修改TOMCAT_HOME/bin/catalina.sh
在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:
JAVA_OPTS="-server -Xms800m -Xmx800m -XX:MaxNewSize=256m"
4)实例,以下给出1G内存环境下java jvm 的参数设置参考:
JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true "
3. 连接池
(1) 将数据库驱动程序的JAR文件放在Tomcat的 common/lib 中;
(2)方法一:局部连接池(仅供本App使用) 在web.xml中或者tomcat_home/conf/localhost/下建立一个<yourAppName>.xml
<Context>
<Resource
name="jdbc/test"
type="javax.sql.DataSource"
password="bb"
driverClassName="com.mysql.jdbc.Driver"
maxIdle="2"
maxWait="50"
username="root"
url="jdbc:mysql://localhost:3306/test"
maxActive="4"/>
</Context>
方法二:配置全局resource,然后通过resourcelink来映射,
(a) tomcat/conf/server.xml的GlobalNamingResources中增加
<Resource name="jdbc/mydb" type="javax.sql.DataSource" password="mypwd" driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver" maxIdle="30" maxWait="5000" validationQuery="select 1" username="sa" url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb" maxActive="200"/>
* 参数说明:
maxIdle,最大空闲数,数据库连接的最大空闲时间。超过空闲时间,数据库连接将被标记为不可用,然后被释放。设为0表示无限制。
MaxActive,连接池的最大数据库连接数。设为0表示无限制。
maxWait ,最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
(b)、在tomcat/webapps/myapp/META-INF/context.xml的Context中增加:
<ResourceLink global="jdbc/mydb" name="jdbc/mydb" type="javax.sql.DataSource"/>
(4)编码:
private static DataSource pool;
static {
Context env = null;
try {
env = (Context) new InitialContext().lookup("java:comp/env");
pool = (DataSource)env.lookup("jdbc/WSPool");
if(pool==null)
System.err.println("'DBPool' is an unknown DataSource");
} catch(NamingException ne) {
ne.printStackTrace();
}
(5) 用DBPool.getPool().getConnection(),获得一个Connection对象,就可以进行数据库操作,最后别忘了对 Connection对象调用close()方法,注意:这里不会关闭这个Connection,而是将这个Connection放回数据库连接池。
* jdbc通常是用DriverManager获得连接的