TOMCAT不得不说的二三事[1]

[入库:2005年8月18日] [更新:2007年3月25日]

本文简介:选择自 lycoo 的 blog

tomcat不得不说的二三事 [nicktai 发表于 2005-3-16 15:32:09]
转载 http://blog.csdn.net/darkxie/archive/2004/10/25/tomcatapp.aspx
谨以此文送给所有正在使用tomcat或者打算使用的人们,向tomcat的所有开发人员致敬!



一、小猫tomcat其实很可爱

2003年底,我换公司了,同样也换了webapp,tomcat出现在我的面前(以前使用weblogic),我有点茫然,免费的东西真的能用的好么?担心ing……(其实是在火星呆太久)出门一打听,原来此猫出自名门-jakarta项目,2001年度最具创新的java产品(most innovative java product),又有java的老大sun的力捧(官方推荐的servlet和jsp容器),以后就靠它吃饭了。不说二话,搞起来先:

1、 安装

tomcat最新版本是5.0.29(http://jakarta.apache.org/site/binindex.cgi)

如果在windows下它可以自动找到你的jdk或者set java_home=c:/jdk

在linux下需要先解压,然后设置java_home

export java_home=/usr/local/jdk

2、 run

设置完毕后就可以运行tomcat服务器了,进入tomcat的bin目录,windows下用startup启动tomcat,linux下用startup.sh,相应的关闭tomcat的命令为shutdown和shutdown.sh。

启动服务后在浏览器里输入http://localhost:8080来测试一下

3、 目录结构

bin:存放启动和关闭tomcat脚本。

conf:包含不同的配置文件,server.xml(tomcat的主要配置文件)。

work:存放jsp编译后产生的class文件。

webapp:存放应用程序示例,以后你要部署的应用程序也要放到此目录。

logs:存放日志文件

comm./server/shared:这三个文件夹下的lib文件夹放jar文件。

1、 配置server.xml文件

没有什么好说的,看tomcat的文档比较有用,这里提供一些主要的东西吧。

元素名
属性
解释

server
port
指定一个端口,这个端口负责监听关闭tomcat的请求

shutdown
指定向端口发送的命令字符串

service
name
指定service的名字

connector(表示客户端和service之间的连接)
port
指定服务器端要创建的端口号,并在这个断口监听来自客户端的请求

minprocessors
服务器启动时创建的处理请求的线程数

maxprocessors
最大可以创建的处理请求的线程数

enablelookups
如果为true,则可以通过调用request.getremotehost()进行dns查询来得到远程客户端的实际主机名,若为false则不进行dns查询,而是返回其ip地址

redirectport
指定服务器正在处理http请求时收到了一个ssl传输请求后重定向的端口号

acceptcount
指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理

connectiontimeout
指定超时的时间数(以毫秒为单位)

engine(表示指定service中的请求处理机,接收和处理来自connector的请求)
defaulthost
指定缺省的处理请求的主机名,它至少与其中的一个host元素的name属性值是一样的

context(表示一个web应用程序,通常为war文件,关于war的具体信息见servlet规范)
docbase
应用程序的路径或者是war文件存放的路径

path
表示此web应用程序的url的前缀,这样请求的url为http://localhost:8080/path/****

reloadable
这个属性非常重要,如果为true,则tomcat会自动检测应用程序的/web-inf/lib 和/web-inf/classes目录的变化,自动装载新的应用程序,我们可以在不重起tomcat的情况下改变应用程序

host(表示一个虚拟主机)
name
指定主机名

appbase
应用程序基本目录,即存放应用程序的目录

unpackwars
如果为true,则tomcat会自动将war文件解压,否则不解压,直接从war文件中运行应用程序

logger(表示日志,调试和错误信息)
classname
指定logger使用的类名,此类必须实现org.apache.catalina.logger 接口

prefix
指定log文件的前缀

suffix
指定log文件的后缀

timestamp
如果为true,则log文件名中要加入时间,如下例:localhost_log.2001-10-04.txt

realm(表示存放用户名,密码及role的数据库)
classname
指定realm使用的类名,此类必须实现org.apache.catalina.realm接口

valve(功能与logger差不多,其prefix和suffix属性解释和logger 中的一样)
classname
指定valve使用的类名,如用org.apache.catalina.valves.accesslogvalve类可以记录应用程序的访问信息

directory
指定log文件存放的位置

pattern
有两个值,common方式记录远程主机名或ip地址,用户名,日期,第一行请求的字符串,http响应代码,发送的字节数。combined方式比common方式记录的值更多




2、 管理

tomcat管理能力很强大,进入http://localhost:8080/,自己慢慢管吧。实践出真知,我喜欢这样搞:

^_^,一切尽在掌握http://localhost:8080/manager/html 。



一、让数据库连接池转起来

作为一个j2ee程序员大家手上可能会有现成的jdbc 数据库连接池,其实这没有太大的必要,因为象weblogic……企业级webapp都有自己的连接池,大家不要费力直接使用吧,效率也很不错,再也不用羡慕.net的ado了(以前作ms从来不担心数据连接,ado确实用起来很爽),如果想实现一个 jdbc connection pool 的注意事项有:

1. 有一个简单的函数从连接池中得到一个 connection。

2. close 函数必须将 connection 放回 数据库连接池。

3. 当数据库连接池中没有空闲的 connection, 数据库连接池必须能够自动增加 connection 个数。

4. 当数据库连接池中的 connection 个数在某一个特别的时间变得很大,但是以后很长时间只用其中一小部分,应该可以自动将多余的 connection 关闭掉。

5. 如果可能,应该提供debug 信息报告没有关闭的 new connection 。

网上有各种各样的连接池代码,抄过来改改吧,嘿嘿~



这里介绍如何配置tomcat的连接池,以sqlserver为例:

步骤1:安装sqlserver的jdbc驱动

sqlserver的jdbc驱动其实就是三个jar文件,msbase.jar/mssqlserver.jar/msutil.jar,将这三个文件拷贝到你的/tomcat_home/common/lib目录下去就可以了。

步骤2:修改server.xml文件

具体代码如下:

<context path="test" docbase="f:\yourroot" debug="5" reloadable="true" crosscontext="true">

<logger classname="org.apache.catalina.logger.filelogger" prefix="localhost_dbtest_log." suffix=".txt" timestamp="true"/>

<resource name="jdbc/sqlserverdb" auth="container" type="javax.sql.datasource"/>

<resourceparams name="jdbc/sqlserverdb">

<parameter>

<name>factory</name>

<value>org.apache.commons.dbcp.basicdatasourcefactory</value>

</parameter>

<!-- maximum number of db connections in pool. make sure you configure your mysqld max_connections large enough to handle all of your db connections. set to 0 for no limit.-->

<parameter>

<name>maxactive</name>

<value>50</value>

</parameter>

<!-- maximum number of idle db connections to retain in pool. set to 0 for no limit.-->

<parameter>

<name>maxidle</name>

<value>20</value>

</parameter>

<!-- maximum time to wait for a db connection to become available in ms, in this example 0.5 seconds. an exception is thrown if this timeout is exceeded. set to -1 to wait indefinitely. -->

<parameter>

<name>maxwait</name>

<value>500</value>

</parameter>

<!-- mssql db username and password for db connections -->

<parameter>

<name>username</name>

<value>sa</value>

</parameter>



<parameter>

<name>password</name>

<value>sa</value>

</parameter>

<!-- class name for sqlserver2000 jdbc driver -->

<parameter>

<name>driverclassname</name>

<value>com.microsoft.jdbc.sqlserver.sqlserverdriver</value>

</parameter>

<!-- the jdbc connection url for connecting to your ms sql server db.the autoreconnect=true argument to the url makes sure that the mm.sql server jdbc driver will automatically reconnect if mysqld closed the connection. mysqld by default closes idle connections after 8 hours.-->

<parameter>

<name>url</name>

<value>jdbc:microsoft:sqlserver://10.0.254.11:1433;databasename=yourdb</value>

<!--must use & not use & -->

</parameter>

</resourceparams>

</context>

步骤三:程序调用

package dbmanage;



import java.sql.callablestatement;

import java.sql.connection;

import java.sql.date;

import java.sql.preparedstatement;

import java.sql.resultset;

import java.sql.sqlexception;

import java.sql.statement;

import java.util.enumeration;

import java.util.hashtable;

import java.util.vector;

import javax.naming.context;

import javax.naming.initialcontext;

import javax.sql.datasource;



import util.smartdateformat;





public class dbmanager {

/************************************

* @param static private boolean verbose ;

* @param statement thestatement;

* @param preparedstatement thepstmt;

* @param connection theconnection;

************************************/

final static private boolean verbose = true; //打印控制台控制



//static logger logger = logger.getlogger(dbmanager.class.getname());

private context initctx = null;

private context ctx = null;

private datasource ds = null;



private long timeout = 5000;



private statement thestatement = null;

private preparedstatement thepstmt = null;



/************************************

* 初试化initctx

* 取得数据源对象

************************************/

public

dbmanager() {

try {

initctx = new initialcontext();

//init context,read config web.xml

if (initctx == null) {

throw new exception("initial failed!");

}

ctx = (context) initctx.lookup("java:comp/env");

//find "jdbc/sqlserverdb" object this configruation in the server.xml of tomcat

if (ctx != null) {

ds = (datasource) ctx.lookup("jdbc/sqlserverdb");

}

if (ds == null) {

throw new exception("look up datasource failed!");

}

}

catch (exception e) {

log(e, "can't get the context!");

}

}



/************************************

* get connection

* @return connection

***********

本文关键:TOMCAT不得不说的二三事
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top