J2EE,Documentum,GWT,EJB学习路程

为了所爱的,和爱我的人努力

 

2009年11月6日

调整java 虚拟机


尽管 JVM 调整操作随 JVM 提供程序的不同而有所变化,但一般的调整概念适用于所有 JVM。这些一般的概念包括:
编译器调整。在服务器运行时期间,所有 JVM 都使用即时(JIT)编译器来将 Java 字节码编译为本机指令。
Java 内存或堆调整。JVM 内存管理功能(即垃圾回收)为提高 JVM 性能提供了其中一种最大的可能性。
类装入调整。
过程
优化启动性能和运行时性能
在某些环境中,优化 WebSphere Application Server 的启动性能比优化运行时性能更重要。在另一些环境中,优化运行时性能更为重要。缺省情况下,IBM JVM 是针对运行时性能进行优化的,而基于 HotSpot 的 JVM 是针对启动性能进行优化的。

Java JIT 编译器在很大程度上决定了是优化启动性能还是优化运行时性能。编译器使用的初始优化级别影响编译类方法所耗用的时间以及启动服务器所耗用的时间。为了提高 启动速度,可以降低编译器所使用的初始优化级别。这意味着,由于现在使用较低的优化级别来编译类方法,所以应用程序的运行时性能可能会下降。

因为编译器在运行时执行阶段会根据自己的判断来重新编译类方法以提高性能,所以,很难提供一个有关特定的运行时性能影响的说明。最终,应用程序的持续时间 是影响运行时性能下降程度的主要原因。运行时间较短的应用程序的方法被重新编译的可能性较高。运行时间较长的应用程序的方法被重新编译的可能性较低。 IBM JVM 的缺省设置是使用高优化级别来执行初始编译。如果需要更改此行为,可以使用以下 IBM JVM 选项:

-Xquickstart

此设置影响 IBM JVM 使用较低优化级别来编译类方法的方式,这将提高服务器启动速度,但会使运行时性能下降。缺省情况下,如果未指定此参数,IBM JVM 最初将使用较高的初始优化级别来执行编译。此设置能够提高运行时性能,但会减慢服务器启动速度。

缺省值: 高初始编译器优化级别
建议值: 高初始编译器优化级别
用法: -Xquickstart 可以加快服务器启动速度。

基于 Sun 的 Hotspot 技术的 JVM 最初使用低优化级别来编译类方法。使用下列 JVM 选项来更改此行为:

-server

基于 Sun 的 Hotspot 技术的 JVM 最初使用低优化级别来编译类方法。这些 JVM 使用简单编译器和能够进行优化的 JIT 编译器。通常情况下,使用简单 JIT 编译器。然而,可以通过设置此选项来使用能够执行优化的编译器。此更改将显著提高服务器的性能,但使用能够执行优化的编译器时,服务器的预备时间将会较 长。

缺省值: 简单编译器
建议值: 能够执行优化的编译器
用法: -server 启用能够执行优化的编译器。

设置堆大小 下列命令行参数对于设置堆大小来说很有用。
-Xms
此设置控制 Java 堆的初始大小。正确调整此参数有助于降低垃圾回收开销,从而缩短服务器响应时间并提高吞吐量。对于某些应用程序来说,此选项的缺省设置可能会太低,从而导致发生大量小型垃圾回收。

缺省值: 256 MB
建议值: 随工作负载的不同而有所变化,但高于缺省值。
用法: -Xms256m 将初始堆大小设置为 256 兆字节

-Xmx
此设置控制 Java 堆的最大大小。正确调整此参数有助于降低垃圾回收开销,从而缩短服务器响应时间并提高吞吐量。对于某些应用程序来说,此选项的缺省设置可能会太低,从而导致发生大量小型垃圾回收。

缺省值: 512 MB
建议值: 随工作负载的不同而有所变化,但高于缺省值。
用法: -Xmx512m 将最大堆大小设置为 512 兆字节

-Xlp
此设置可以与 IBM JVM 配合使用,以使用大页来分配堆。然而,如果使用此设置,那么必须将操作系统配置为支持大页。使用大页可以降低 CPU 跟踪堆内存时的开销,并且还允许创建较大的堆。

请参阅调整操作系统 以了解有关调整操作系统的更多信息。

应该指定的堆大小取决于不同时段的堆使用情况。在堆大小频繁更改的情况下,对 Xms 和 Xmx 参数指定相同的值可以提高性能。

调整 IBM JVM 的垃圾回收器。
使用 Java -X 选项来查看内存选项列表。

-Xgcpolicy
将 gcpolicy 设置为 optthruput 会禁用并发标记。如果没有暂停时间问题(表现为应用程序响应时间不规律),那么应该使用此选项来实现最大吞吐量。将 gcpolicy 设置为 optavgpause 会使用缺省值来启用并发标记。此设置将减少由正常垃圾回收所引起的应用程序响应时间不规律情况。然而,此选项可能会降低整体吞吐量。

缺省值: optthruput
建议值: optthruput
用法: Xgcpolicy:optthruput

-Xnoclassgc
缺省情况下,当一个类没有任何活动实例时,JVM 就会从内存中卸装该类,但是这样会使性能下降。如果关闭类垃圾回收,就可以消除由于多次装入和卸装同一个类而造成的开销。

如果不再需要某个类,那么该类在堆中所占用的空间通常将用于创建新对象。但是,如果应用程序通过创建类的新实例来处理请求,并且该应用程序的请求是随机出 现的,那么可能会发生以下情况:先前请求者完成后,正常的类垃圾回收将通过释放这个类占用的堆空间来清除这个类,但当下一个请求出现时,又必须将这个类重 新实例化。在这种情况下,您可能想使用此选项来禁用类垃圾回收。

缺省值: 启用类垃圾回收
建议值: 禁用类垃圾回收
用法: Xnoclassgc 禁用类垃圾回收

有关其他信息,请参阅下列 DeveloperWorks 文章:
http://www.ibm.com/developerworks/java/
调整 Sun JVM 的垃圾回收器
在 Solaris 平台上,WebSphere Application Server 在 Sun Hotspot JVM 上运行,而不是在 IBM JVM 上运行。对 Sun JVM 使用正确的调整参数以利用其性能优化功能十分重要。

Sun Hotspot JVM 依靠分代垃圾回收来实现最佳性能。下列命令行参数对于调整垃圾回收来说非常有用。

-XX:SurvivorRatio
将 Java 堆划分为旧对象(长生命周期对象)区域和新对象区域。新对象区域进一步细分为两部分,第一部分用于分配给新对象(初始区域),第二部分存放那些经过其前几 次垃圾回收之后、但在被提升为旧对象之前仍在使用中的新对象(幸存者空间)。幸存者比率是堆的新对象区域中初始区域与幸存者空间的比率。增大此设置将针对 需要创建大量对象但仅保留少量对象的应用程序优化 JVM。与其他应用程序相比,WebSphere Application Server 会生成更多中等生命周期对象和长生命周期对象,因此,应该将此设置设置为小于缺省值。

缺省值: 32
建议值: 16
用法: -XX:SurvivorRatio=16

-XX:PermSize
为永久生成对象保留的堆区域存储 JVM 的所有反射数据。对于动态地装入和卸装大量类的应用程序来说,应该增大此大小以优化它们的性能。通过将此参数设置为 128MB,可以消除增大此部分堆所需的开销。

建议值: 128 MB
用法: XX:PermSize=128m 将 perm 大小设置为 128 兆字节。

-Xmn
此设置控制允许新生成的对象在堆中耗用的空间量。正确调整此参数有助于降低垃圾回收开销,从而缩短服务器响应时间并提高吞吐量。此参数的缺省设置通常过 低,这将导致执行大量的小型垃圾回收操作。如果将此参数设置得过高,可能会导致 JVM 仅执行大型(全面)垃圾回收。这些垃圾回收操作通常会耗时几秒钟,这将严重影响服务器的整体性能。您必须保持将此参数设置为小于整个堆大小的一半,以避免 这种情况出现。

缺省值: 2228224 字节
建议值: 大约整个堆大小的 1/4
用法: -Xmn256m 将大小设置为 256 兆字节。

-Xnoclassgc
缺省情况下,当一个类没有任何活动实例时,JVM 就会从内存中卸装该类,但是这样会使性能下降。如果关闭类垃圾回收,就可以消除由于多次装入和卸装同一个类而造成的开销。

如果不再需要某个类,那么该类在堆中所占用的空间通常将用于创建新对象。但是,如果应用程序通过创建类的新实例来处理请求,并且该应用程序的请求是随机出 现的,那么可能会发生以下情况:先前请求者完成后,正常的类垃圾回收将通过释放这个类占用的堆空间来清除这个类,但当下一个请求出现时,又必须将这个类重 新实例化。在这种情况下,您可能想使用此选项来禁用类垃圾回收。

缺省值: 启用类垃圾回收
建议值: 禁用类垃圾回收
用法: Xnoclassgc 禁用类垃圾回收

有关调整 Sun JVM 的其他信息,请参阅 Java HotSpot VM 的性能文档。

调整 HP JVM 的垃圾回收器
HP JVM 依靠分代垃圾回收来实现最佳性能。下列命令行参数对于调整垃圾回收来说非常有用。

-Xoptgc
此设置针对包含许多短生命周期对象的应用程序优化 JVM。如果未指定此参数,那么 JVM 通常执行大型(全面)垃圾回收。全面垃圾回收会花费几秒钟时间,这将显著影响服务器性能。

缺省值: off
建议值: on
用法: -Xoptgc 启用优化的垃圾回收。

-XX:SurvivorRatio
将 Java 堆划分为旧对象(长生命周期对象)区域和新对象区域。新对象区域进一步细分为两部分,第一部分用于分配给新对象(初始区域),第二部分存放那些经过其前几 次垃圾回收之后、但在被提升为旧对象之前仍在使用中的新对象(幸存者空间)。幸存者比率是堆的新对象区域中初始区域与幸存者空间的比率。增大此设置将针对 需要创建大量对象但仅保留少量对象的应用程序优化 JVM。与其他应用程序相比,WebSphere Application Server 会生成更多中等生命周期对象和长生命周期对象,因此,应该将此设置设置为小于缺省值。

缺省值: 32
建议值: 16
用法: -XX:SurvivorRatio=16

-XX:PermSize
为永久生成对象保留的堆区域存储 JVM 的所有反射数据。对于动态地装入和卸装大量类的应用程序来说,应该增大此大小以优化它们的性能。通过将此参数指定为 128 兆字节,可以消除增大此部分堆所需的开销。

缺省值: 0
建议值: 128 兆字节
用法: -XX:PermSize=128m 将 PermSize 设置为 128 兆字节

-XX:+ForceMmapReserved
缺省情况下,Java 堆以“惰性交换”方式进行分配。在此方式下,将根据需要来分配内存页,这样可以节省交换空间,但是也将强制使用 4KB 页。在大型堆系统中,这种内存分配方式允许堆包含数以十万计的页。此命令禁用“惰性交换”并允许操作系统使用较大的内存页,从而优化对构成 Java 堆的内存的访问。

缺省值: off
建议值: on
用法: -XX:+ForceMmapReserved 将禁用“惰性交换”。

-Xmn
此设置控制允许新生成的对象在堆中耗用的空间量。正确调整此参数有助于降低垃圾回收开销,从而缩短服务器响应时间并提高吞吐量。此参数的缺省设置通常过低,这将导致执行大量的小型垃圾回收操作。

缺省值: 没有缺省值
建议值: 大约整个堆大小的 3/4
用法: -Xmn768m 将大小设置为 768 兆字节

虚拟页大小
通过将 Java 虚拟机的指令页大小和数据页大小设置为 64MB,可以提高性能。

缺省值: 4MB
建议值: 64MB
用法: 使用以下命令。命令输出提供了进程可执行文件的当前操作系统特征:
chatr +pi64M +pd64M /opt/WebSphere/
AppServer/java/bin/PA_RISC2.0/
native_threads/java


-Xnoclassgc
缺省情况下,当一个类没有任何活动实例时,JVM 就会从内存中卸装该类,但是这样会使性能下降。如果关闭类垃圾回收,就可以消除由于多次装入和卸装同一个类而造成的开销。

如果不再需要某个类,那么该类在堆中所占用的空间通常将用于创建新对象。但是,如果应用程序通过创建类的新实例来处理请求,并且该应用程序的请求是随机出 现的,那么可能会发生以下情况:先前请求者完成后,正常的类垃圾回收将通过释放这个类占用的堆空间来清除这个类,但当下一个请求出现时,又必须将这个类重 新实例化。在这种情况下,您可能想使用此选项来禁用类垃圾回收。

缺省值: 启用类垃圾回收
建议值: 禁用类垃圾回收
用法: Xnoclassgc 禁用类垃圾回收

有关调整 HP 虚拟机的其他信息,请参阅 Java 技术软件 HP-UX 11i。

调整 HP 的 JVM for HP-UX 设置下列选项以提高应用程序性能:
-XX:SchedulerPriorityRange=SCHED_NOAGE
-Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.DevPollSelectorProvider
-XX:-ExtraPollBeforeRead

posted @ 2009-11-06 10:38 田亮 阅读(290) | 评论 (1)编辑 收藏

2009年10月13日

在RED HAT ENTERPRICE LINUX4 上安装ORACLE 10G

在RED HAT ENTERPRICE LINUX4 上安装ORACLE 10G (10.2.0.1.0)


第一步 准备工作

? 检查内存
SZ_TOMCAT:/home/xjy/soft> grep SwapTotal /proc/meminfo
SwapTotal:     2031608 kB

? 检查内核
 Linux reaky.com 2.6.9-5.ELsmp #1 SMP Wed Jan 5 19:30:39 EST 2005 i686 i686 i386 GNU/Linux

? 检查软件包
SZ_TOMCAT:/home/xjy/soft> rpm -q gcc make binutils glibc libaio
gcc-3.4.3-9.EL4
make-3.80-5
binutils-2.15.92.0.2-10.EL4
glibc-2.3.4-2
libaio-0.3.102-1

SZ_TOMCAT:/home/xjy/soft> rpm -q openmotif
openmotif-2.2.3-6.RHEL4.2
setarch-1.6-1


检查内核参数
sysctl –a

然后在/ETC/sysctl.conf中添加
kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000
net.core.rmem_default = 262144
net.core.rmem_max = 1048576
net.core.wmem_default = 262144
net.core.wmem_max = 1048576

执行/sbin/sysctl –p

中文化显示工作

修改/etc/sysconfig/i18n文件,改为
LANG="zh_CN.GB18030"
LANGUAGE="zh_CN.GB18030:zh_CN.GB2312:zh_CN"
SUPPORTED="zh_CN.UTF-8:zh_CN:zh:en_US.UTF-:en_US:en"
SYSFONT="lat0-sun16"修改/etc/sysconfig/i18n文件,改为
LANG="zh_CN.GB18030"
LANGUAGE="zh_CN.GB18030:zh_CN.GB2312:zh_CN"
SUPPORTED="zh_CN.UTF-8:zh_CN:zh:en_US.UTF-:en_US:en"
SYSFONT="lat0-sun16"


第二步:
? 创建用户
su – root
[root@reaky etc]# groupadd dba
[root@reaky etc]# groupadd oinstall
[root@reaky etc]# useradd -c "Oracle software owner" -g oinstall -G dba oracle

? 设置环境
编辑/home/oracle/.bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi
# User specific environment and startup programs
alias ls='ls -CF'
PS1='SZ_TOMCAT:$PWD> '; export PS1
umask 022
set -o vi
stty intr '^c'
stty -istrip
#if [ $USER = "oracle" ]; then
#        if [ $SHELL = "/bin/ksh" ]; then
#              ulimit -p 16384
#              ulimit -n 65536
#        else
#              ulimit -u 16384 -n 65536
#        fi
#fi
EDITOR=vi;   export EDITOR
TEMP=/tmp;   export TEMP
TMPDIR=/tmp; export TMPDIR
### SETUP ORACLE ENVIRONMENT ###
ORACLE_SID=ora10; export ORACLE_SID
ORACLE_BASE=/home/oracle;                    export ORACLE_BASE
ORACLE_HOME=/home/oracle/product/10.2.0;     export ORACLE_HOME
ORACLE_TERM=ansi;                            export ORACLE_TERM
JAVA_FONTS=/usr/share/fonts/zh_CN/TrueType/; export JAVA_FONTS
NLS_LANG=AMERICAN_AMERICA.ZHS16GBK;          export NLS_LANG
LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
export LD_LIBRARY_PATH
CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
CLASSPATH=$CLASSPATH:$ORACLE_HOME/network/jlib
export CLASSPATH
PATH=.:$ORACLE_HOME/bin:$PATH
export PATH
### FOR ORACLE INSTALL ###
export LC_ALL="en_US"
export LC="en_US"


第三步、安装Oracle10g
   
1.开始Oracle普通安装
   以oracle用户登录linux,加载oracle Oracle10g光盘, 在执行runInstaller前,确定Oracle环境变量已经设置,可以执行如下命令检验环境变量的设置:
oracle 用户登陆
$set
在终端命令窗口,执行如下命令,开始oracle10g的安装:
oracle$/mnt/cdrom/runInstaller
2.在欢迎窗口界面: 点击“下一步”按钮
3.指定Inventory 路径和身份证明窗口:
    inventory路径是: /home/oracle/oraInventory
  指定操作系统组名: oinstall
点击“下一步”按钮
4.这时会弹出一个执行orainstRoot.sh 脚本的窗口:
打开另一个终端,以root用户执行如下命令:
su – root
cd  /home/oracle/oraInventory
./orainstRoot.sh
然后,切换到oracle安装窗口,点击“继续”按钮
5.        在指定文件位置窗口弹出后,指定相应的路径:
源:
路径: /mnt/cdrom/stage/products.xml
目的:
名称:  OraDb10g_home1
路径: /home/oracle/product/10.1.0/db_1
然后,点击“下一步”按钮
6.选择安装类型:
选择"企业版"选项,然后点击“下一步”按钮。安装程序验证系统是否符合安装和配置所选产品的所有最低要求
7.        安装程序验证系统是否符合安装和配置所选产品的所有最低要求。当检测完成并成功后,点击“下一步”按钮
8.        选择数据库设置:
选择"通用"选项,然后点击“下一步”按钮
9.指定数据库配置参数:
全局数据库名称: "test".
SID: "test".
选中“创建带样本方案的数据库”复选框,然后,点击“下一步”按钮
10.选择数据库管理设置:
选择"使用 Database Control管理数据库"。
然后,点击“下一步”
11.指定数据库文件存储选项
选择 "文件系统"选项.
指定数据库路径: /home/oracle/oradata/
然后点击“下一步”按钮,
  12.指定备份和恢复选项:
选择"不启用自动备份".
点击 “下一步”按钮
13.指定数据库方案口令:
可以为SYS、SYSTEM、SYSMAN、DBSNMP单独指定口令,或选择"所有用户使用同一口令"选项.为这些用户指定同一个口令。
指定口令不要以数字开始,否则会得到错误信息.然后点击 “下一步”按钮
14.        出现概要窗口后, 点击“安装”按钮
15.        这时你会看到数据库安装过程窗口,然后会出现辅助设置窗口,再出现数据库创建窗口。
16.        数据库创建完毕,弹出数据库创建完成窗口,点击Ok按钮。
当弹出一个执行root.sh脚本的窗口时在另一个终端执行如下命令:
su – root
cd /home/oracle/product/10.1.0/db_1
./root.sh
点击确定”按钮

17.        在概要安装完毕,会报告一个发现$ORACLE_BASE/product/10.1.0/db_1/portlist.ini文件,这时点击OK按钮
18.        安装结束:
点击“退出”按钮,结束安装程序。
六、数据库的启动和停止
要使数据库启动,执行如下命令:
oracle$ sqlplus /nolog
SQL> connect / as sysdba
SQL> startup
要使数据库停止,执行如下命令:
oracle$ sqlplus /nolog
SQL> connect / as sysdba
SQL> shutdown
 


删除oracle10g
      如果oracle10ganzhuang过程中出现错误,需要重新安装,可以执行如下命令删除以前安装的oracle:
su –oracle
rm –rf /home/oracle/*
rm –f  /etc/oraInst.loc /etc/oratab  /etc/oracle
su –root
export ORACLE_HOME=/home/oracle/product/10.1.0/db_1
$ORACLE_HOME/bin/localconfig delete
rm –f /etc/inittab.cssd
rm –f /usr/local/bin/coraenv  /usr/local/bin/dbhome
rm –f /usr/local/bin/oraenv
执行完上述命令后,重新启动系统,可以重新安装oracle10g数据库系统


FAQ (在Linux平台安装Oracle比较常见的问题)
1. 不能启动安装界面
运行runInstaller提示信息类似如下:
xlib:connection to "localhost:0.0" refused by server
xlib:client is not authorized to connect to server
Exception in thread "main" java.lang.InternalError:
can't connect to x11 window server using "localhost:0.0" at .......
解决办法: 设定你的DISPLAY环境参数.
# export DISPLAY= your_IPaddress :0.0
把your_IPaddress换成你的IP.或者用root简单的执行一下# xhost + (要注意这样会有安全上的隐患)
2.安装界面显示很多"口口"样子的乱码
解决办法:查看locale输出
# locale
LANG=en_US.UTF-8
LC_CTYPE=zh_CN.GB18030
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
执行#export LC_CTYPE=en_US.UTF-8 然后重新调用安装程序.
3. 用IE登录Linux服务器上的em出现乱码
在Linux(Unix) 环境下成功安装了Oracle 10g,从windows下用IE浏览器登录 10g 的em, 按钮是"口口"这样的方框.
解决办法: 参考:
http://www.dbanotes.net/Oracle/Oracle-10g-font.properties.htm
4.创建数据库的时候出现ORA-03113的错误
解决办法: 查看核心参数是否调整正确.参考:
http://www.dbanotes.net/Oracle/ORA-03113.htm
5. RedHat 9 / FC1等系统10g不支持如何安装?
解决办法:在10g不支持的Linux发行版上安装10g的解决方法
1). 运行runInstaller -ignoreSysPrereqs,这样会跳过检查.
2). 摘自 www.puschitz.com 修改/etc/redhat-release文件:
#su - root
#cp /etc/redhat-release /etc/redhat-release.backup
#cat > /etc/redhat-release <<   EOF
Red Hat Enterprise Linux AS release 3 (Taroon)
EOF
安装完毕,执行如下操作:
#su - root
#cp /etc/redhat-release.backup /etc/redhat-release
3). http://www.dbanotes.net/Oracle/10G-Beta-Install-Bug.htm
同样的思路,我们可以修改Oracle 的install/oraparam.ini文件达到目的.
6.如何关掉那些 ocssd.bin 进程?
解决办法:编辑/etc/inittab文件(做好备份)
注释掉这一行:
h1:3:respawn:/etc/init.d/init.cssd run >/dev/null 2>................
---------------------------------------------------------------------------------------------------------------------
参考信息
http://blog.csdn.net/itsdn/archive/2007/05/21/1619114.aspx

1、在 Linux x86 上安装Oracle数据库10g
http://www.oracle.com/technology/global/cn/pub/articles/smiley_10gdb_install.html#rhel3
2、Oracle 10gR2 + RedHat Enterprise Linux AS4 安装
http://www.linuxdiyf.com/viewarticle.php?id=11578
3、Oracle 10g For Linux安装手册
http://bbs.database.ccidnet.com/htm_data/27/0607/112610.html
4、Installing Oracle 10g on RHEL AS 3 Step-by-Step
http://www.dbanotes.net/Oracle/Install-Oracle10g-RHEL3.htm

/etc/rc.d/init.d/dbora文件内容
#http://staff.in2.hr/denis/oracle/10g1install_fedora3_en.html#n4_4
# chkconfig: 0356 95 1
# description: init script to start/stop oracle database 10g, TNS listener, EMS
#
#
# match these values to your environment:
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1
export ORACLE_SID=CQRCDATA
export PATH=$PATH:$ORACLE_HOME/bin
export ORACLE_USER=oracle
# see how we are called:
case $1 in
start)
dltelecom  - "$ORACLE_USER" -c "$ORACLE_HOME/bin/dbstart"
dltelecom  - "$ORACLE_USER" -c "$ORACLE_HOME/bin/emctl start dbconsole"
dltelecom  - "$ORACLE_USER" -c "SORACLE_HOME/bin/isqlplusctl start"
;;
stop)
dltelecom - $ORACLE_USER -c "$ORACLE_HOME/bin/lsnrctl stop"
dltelecom - $ORACLE_USER -c "$ORACLE_HOME/bin/dbshut"
dltelecom - $ORACLE_USER -c "$ORACLE_HOME/bin/emctl stop dbconsole"
;;
*)
echo "Usage: $0 {start|stop}"
;;
esac

posted @ 2009-10-13 19:28 田亮 阅读(386) | 评论 (0)编辑 收藏

Linux 下安装JDK

一、安装JDK

首先到sun官网下载安装包:

https://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/ViewFilteredProducts-SingleVariationTypeFilter

分别下载:jdk-6u16-linux-i586-rpm.bin jdk-6u16-linux-i586.bin

然后将这两个安装文件放到:/usr/tmp 目录下,分别修改权限,命令如下:

# chmod u+x ./jdk-6u16-linux-i586.bin

# chmod u+x ./jdk-6u16-linux-i586-rpm.bin

解压文件(这两个文件可以自动解压):

# ./jdk-6u16-linux-i586.bin

创建目录/usr/java:

# mkdir /usr/java

将解压出来的jdk-6u16-linux-i586目录复制到/usr/java目录下:

# cp -fr jdk-6u16-linux-i586 /usr/java

解压文件

# ./jdk-6u16-linux-i586-rpm.bin

安装软件会将JDK自动安装到 /usr/java/jdk-6u16-linux-i586目录下

二、配置环境变量

1.修改用户环境变量

假设使用java的用户为 guest,编辑该用户的.bashrc文件进行环境变量设置。

# vi /home/ guest /.bashrc

.bashrc文件中加入:

export JAVA_HOME=/usr/java/jdk1.6.0_16

export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOMR/bin

2.修改所有用户的环境变量

# vi /etc/profile

在该文件中加入:

export JAVA_HOME=/usr/java/jdk1.6.0_16

export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOMR/bin

注意CLASSPATH路径中加入了$CLASSPATH,这样可以避免将之前配置的路径被覆盖。

profile文件如下:

############profile begin###########

# /etc/profile

# System wide environment and startup programs, for login setup

# Functions and aliases go in /etc/bashrc

pathmunge () {

        if ! echo $PATH | /bin/egrep -q "(^|:)$1($|:)" ; then

           if [ "$2" = "after" ] ; then

              PATH=$PATH:$1

           else

              PATH=$1:$PATH

           fi

        fi

}

# ksh workaround

if [ -z "$EUID" -a -x /usr/bin/id ]; then

        EUID=`id -u`

        UID=`id -ru`

fi

# Path manipulation

if [ "$EUID" = "0" ]; then

        pathmunge /sbin

        pathmunge /usr/sbin

        pathmunge /usr/local/sbin

fi

# No core files by default

ulimit -S -c 0 > /dev/null 2>&1

if [ -x /usr/bin/id ]; then

        USER="`id -un`"

        LOGNAME=$USER

        MAIL="/var/spool/mail/$USER"

fi

HOSTNAME=`/bin/hostname`

HISTSIZE=1000

if [ -z "$INPUTRC" -a ! -f "$HOME/.inputrc" ]; then

    INPUTRC=/etc/inputrc

fi

export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC

#java path

export JAVA_HOME=/usr/java/jdk1.6.0_16

export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOMR/bin

for i in /etc/profile.d/*.sh ; do

    if [ -r "$i" ]; then

        . $i

    fi

done

unset i

unset pathmunge

############profile end###########

三、卸载jkd

1、卸载系统自带的jdk版本:

查看自带的jdk

#rpm -qa | grep gcj

看到如下信息:

libgcj-4.1.2-44.el5

java-1.4.2-gcj-compat-1.4.2.0-40jpp.115

使用rpm -e --nodeps 命令删除上面查找的内容:

#rpm -e –nodeps java-1.4.2-gcj-compat-1.4.2.0-40jpp.115

2、卸载rpm安装的jkd版本

查看安装的jdk

#rpm -qa|grep jdk

看到如下信息:

java-1.6.0-openjdk-1.6.0.0-0.25.b09.el5

jdk-1.6.0_16-fcs

卸载:

#rpm -e --nodeps jdk-1.6.0_16-fcs

posted @ 2009-10-13 01:58 田亮 阅读(602) | 评论 (0)编辑 收藏

2009年3月11日

twiki 安装

twiki4.1.2的安装及配置收藏

        twiki 遵循 GPL 协议,软件定位为“灵活、强大、易于使用的企业协作平台”,运行于 Perl 环境,是很多大型商业公司首选的 wiki 平台。

安装过程及配置:

#建立 twiki 目录
mkdir /home/centeur/public_html/twiki
cd /home/centeur/public_html/twiki
#下载并解压
wget http://twiki.org/p/pub/Codev/Release/TWiki-4.1.2.tgz
tar -zxvf TWiki-4.1.2.tgz
#权限限制
cp root-htaccess.txt .htaccess
cp pub-htaccess.txt pub/.htaccess
cp subdir-htaccess.txt lib/.htaccess
cp subdir-htaccess.txt data/.htaccess
cp subdir-htaccess.txt locale/.htaccess
cp subdir-htaccess.txt templates/.htaccess
cp bin/.htaccess.txt bin/.htaccess

 

cp bin/LocalLib.cfg.txt bin/LocalLib.cfg
#修改 bin/LocalLib.cfg,将 $twikiLibPath 改为合适的路径
$twikiLibPath = "/home/centeur/public_html/twiki/lib";
#修改 bin/.htaccess,将 {DataDir}和{Administrators} 修改为合适的内容
AuthUserFile /home/centeur/public_html/twiki/data/.htpasswd
AuthName 'Enter your WikiName: (First name and last name, no space, no dots, capitalized, e.g. JohnSmith). Cancel to register if you do not have one.'
AuthType Basic
<FilesMatch "configure.*">
SetHandler cgi-script
Order Deny,Allow
Deny from all
Allow from 127.0.0.1, 192.168.1.10
Require user centeur
Satisfy Any
</FilesMatch>
#建立系统管理员帐户
htpasswd -c data/.htpasswd centeur

#现在就可以在浏览器中键入 http://example.com/twiki/bin/configure 进行设置了,设置保存在 lib/LocalSite.cfg 中
#提示缺少 CGI::Session 模块,进行安装
mkdir /home/centeur/CPAN
cd /home/centeur/CPAN
wget http://search.cpan.org/CPAN/authors/id/S/SH/SHERZODR/CGI-Session-4.10.tar.gz
tar -zxvf CGI-Session-4.10.tar.gz
cd CGI-Session-4.10
perl Makefile.PL PREFIX=/home/centeur/CPAN
make
make install
#拷贝模块到 twiki 的 lib 下
cd /home/centeur/public_html/twiki
cp -R /home/centeur/CPAN/lib/perl5/site_perl/5.8.8/CGI lib/CPAN/lib/CGI

#LocalSite.cfg 的部分设置内容
$TWiki::cfg{DefaultUrlHost} = 'http://example.com';
$TWiki::cfg{ScriptUrlPath} = '/twiki/bin';
$TWiki::cfg{PubUrlPath} = '/twiki/pub';
$TWiki::cfg{PubDir} = '/home/centeur/public_html/twiki/pub';
$TWiki::cfg{TemplateDir} = '/home/centeur/public_html/twiki/templates';
$TWiki::cfg{DataDir} = '/home/centeur/public_html/twiki/data';
$TWiki::cfg{LocalesDir} = '/home/centeur/public_html/twiki/locale';
$TWiki::cfg{TempfileDir} = '/home/centeur/tmp';
$TWiki::cfg{UseClientSessions} = 1;
$TWiki::cfg{LoginManager} = 'TWiki::Client::TemplateLogin';
$TWiki::cfg{MinPasswordLength} = 6;
$TWiki::cfg{Htpasswd}{FileName} = '/home/centeur/public_html/twiki/data/.htpasswd';
$TWiki::cfg{Languages}{ru}{Enabled} = 0;
$TWiki::cfg{Languages}{sv}{Enabled} = 0;
$TWiki::cfg{Languages}{'zh-tw'}{Enabled} = 1;
$TWiki::cfg{Languages}{cs}{Enabled} = 0;
$TWiki::cfg{Languages}{'zh-cn'}{Enabled} = 1;
$TWiki::cfg{Languages}{es}{Enabled} = 0;
$TWiki::cfg{Languages}{nl}{Enabled} = 0;
$TWiki::cfg{Languages}{pl}{Enabled} = 0;
$TWiki::cfg{Languages}{fr}{Enabled} = 0;
$TWiki::cfg{Languages}{da}{Enabled} = 0;
$TWiki::cfg{Languages}{de}{Enabled} = 0;
$TWiki::cfg{Languages}{pt}{Enabled} = 0;
$TWiki::cfg{Languages}{it}{Enabled} = 0;
$TWiki::cfg{DisplayTimeValues} = 'servertime';
$TWiki::cfg{Site}{Locale} = 'zh_CN.UTF-8';
$TWiki::cfg{Site}{LocaleRegexes} = 1;
$TWiki::cfg{StoreImpl} = 'RcsLite';
$TWiki::cfg{WebMasterEmail} = 'lypdarling@gmail.com';
$TWiki::cfg{UserInterfaceInternationalisation} = 1;
$TWiki::cfg{UseLocale} = 1;
$TWiki::cfg{Site}{CharSet} = 'UTF-8';
$TWiki::cfg{Site}{Lang} = 'zh';
$TWiki::cfg{Site}{FullLang} = 'zh-cn';

#现在可以在浏览器中键入 http://example.com/twiki/bin/view 进入 twiki 页面了
#编辑 TWIki > Main 目录 > TWikiAdminGroup 页面,将 centeur 加入 GROUP
* Member list:
  * Set GROUP = centeur
* Persons/group who can change the list:
  * Set ALLOWTOPICCHANGE = TWikiAdminGroup
#修改 .htaccess,进行重定向设置
Redirect /twiki/index.html http://example.com/twiki/bin/view

posted @ 2009-03-11 17:22 田亮 阅读(470) | 评论 (0)编辑 收藏

2008年12月17日

javascript call gwt method

这个有些变态的东西折磨了整两天(最头疼这种东西了),我遇到的是用gwt的frame的回来一个IOStream(html string),我要高亮html里的关键标记,并让他们有事件,所以,我在返回IOStream之前进行拦截,并repleace关键标记,加上了高亮的属性"background-color='yellow'", 加上了事件处理"onclick=\"javascript:window.top.clickFireEvent('Todd')" (就是这一块,最让我头疼了,因为是个frame所以他们不在同一个窗口下);
在gwt中:

//gwt EntryPoint method
public void onModuleLoad() {
    clickEventFire();
  }

//This is jsni method

  private static native void clickEventFire()/*-{
   $wnd.clickEventFire = function(id){
   @com.todd.Main::fireScriptEvent(Ljava/lang/String;)(name);
   }
   }-*/;

//This is a method for javascript call.
public static void fireScriptEvent(String name) {
    System.out.println("My name is " + name);
}

别看短短几句,真的是很头疼的东西:)

posted @ 2008-12-17 00:45 田亮 阅读(1522) | 评论 (3)编辑 收藏

2008年6月18日

Java Debug

在编程的生涯中,最重要就是能Debug,我最近在玩documentum6.0的内置中间件weblogic,所以Remote Debug是少不了的。
先说几个概念(这是我在网上查的):
    1.什么是JPDA:
        Java Platform Debugger Architecture(JPDA:Java平台调试架构) 由Java虚拟机后端和调试平台前端组成 :
            a.Java虚拟机提供了Java调试的功能
            b.调试平台通过调试交互协议向Java虚拟机请求服务以对在虚拟机中运行的程序进行调试
       JPDA架构:
          JPDA通过两个接口和协议来完成如上的说明,分别是JVMTI(Java虚拟机工具接口)、JDWP(Java调试连线协议)和JDI(Java调试接口)。
            a.JVMTI定义了虚拟机应该提供的调试服务,包括调试信息(Information譬如栈信息)、调试行为(Action譬如客户端设置一个断点)和通知                      (Notification譬如到达某个断点时通知客户端),该接口由虚拟机实现者提供实现,并结合在虚拟机中
            b.JDWP定义调试服务和调试器之间的通信,包括定义调试信息格式和调试请求机制
            c.JDI在语言的高层次上定义了调试者可以使用的调试接口以能方便地与远程的调试服务进行交互,Java语言实现,调试器实现者可直接使用该接口访问虚                拟机调试服务。
       运行方式:
          当虚拟机的调试服务运行时,虚拟机作为调试的服务提供端,监听一个连接,而调试器通过该连接与虚拟机进行交互。目前,Windows平台的JVM提供了两 种          方式的连接:共享内存和 Socket连接,共享内存的服务提供端和调试端只能位于同一台机,而Socket连接则支持不同异机调试,即远程调试。
       虚拟参数配置:
          a.启用调试服务
        -Xdebug 启用调试
        -Xrunjdwp:<sub-options> 加载JVM的JPDA参考实现库
          b. Xrunjdwp子参数(sub-options)配置
             Xrunjdwp子参数的配置格式如下
             -Xrunjdwp:<name1>[=<value1>],<name2>[=<value2>]...
          c.例子
             -Xrunjdwp:transport=dt_socket,server=y,address=8000
         在8000端口监听Socket连接,挂起VM并且不加载运行主函数直到调试请求到达

        -Xrunjdwp:transport=dt_shmem,server=y,suspend=n
        选择一个可用的共享内存(因为没有指address)并监听该内存连接,同时加载运行主函数

        -Xrunjdwp:transport=dt_socket,address=myhost:8000
        连接到myhost:8000提供的调试服务(server=n,以调试客户端存在),挂起VM并且不加载运行主函数
 
        -Xrunjdwp:transport=dt_shmem,address=mysharedmemory
        通过共享内存的方式连接到调试服务,挂起VM并且不加载运行主函数

        -Xrunjdwp:transport=dt_socket,server=y,address=8000,onthrow=java.io.IOException,launch=/usr/local/bin/debugstub
        等待java.io.IOException被抛出,然后挂起VM并监听8000端口连接,在接到调试请求后以命令/usr/local/bin/debugstub dt_socket myhost:8000执行
 
        -Xrunjdwp:transport=dt_shmem,server=y,onuncaught=y,launch=d:\bin\debugstub.exe
        等待一个RuntimeException被抛出,然后挂起VM并监听一个可用的共享内存,在接到调试请求后以命令d:\bin\debugstub.exe dt_shmem <address>                执行, <address>是可用的共享内存
    2.基本原理
      
服务器端在启动的服务器的同时,也把JPDA明确的启动起来,分配一个端口号,那么你在客户端只要连接上JPDA服务(sun称为工具平台)便能测试了。
    3.Tomcat 实例
      
打开tomcat的bin目录,找到catalina.bat, 用记事本打开它。
        找到set JPDA_OPTS=-Xdebug -Xrunjdwp:transport=%JPDA_TRANSPORT%,address=%JPDA_ADDRESS%,server=y,suspend=%JPDA_SUSPEND%,
        改为set JPDA_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,address=5500,server=y,suspend=n
        这样就打开了5500端口,然后你到bin目录下运行jpda start,你再去监听5500端口,就可以实现remote debug了。
      

posted @ 2008-06-18 19:11 田亮 阅读(824) | 评论 (0)编辑 收藏

2007年12月17日

节省使用httpsession(此文引用于Effective Enterprise java:39)

    基于html/http的应用中,为了维护代表客户端的瞬时状态,servlet容器提供了一种称为会话空间的设施,被表示为HttpSession接口。这个思想本身是简单而直接的,servlet程序员可以将任意的可序列化对象置于会话空间,而下一次,同一个用户对同一个Web应用的任何部分发出请求时,servlet容器将确保同样的对象会处在HttpSession对象中。这使得servlet开发者可以为在服务器上的Web应用在多个HTTP请求之间维护每个客户端的状态信息;

    遗憾的是,这种机制并非完全免费的。首先,在服务器端为每个客户端存储数据将会减少该服务器上的可用资源,这意味着服务器的最大负载能力会成比例下降。这个算式很简单:在会话空间中保存越多的数据,机器能够处理的会话就越少。由此推导出,为了令给定的机器能够支持尽可能多的客户端,必须将会话的存储量保持在最小。实际上,对于真正具备可扩展性的系统而言,无论何时都应该避免使用会话。如果在服务器端可以不产生任何为每个客户端进行处理的开销,那么机器的负载能力(在理论上)可以到达无限,能够支持任意多连接到它的客户端。

posted @ 2007-12-17 10:04 田亮 阅读(1255) | 评论 (4)编辑 收藏

2007年11月29日

eclipse plugin

Jodeclipse 是Jode的Eclipse插件,JadClipse是Jad的Eclipse插件,它们都是非常好的反编译插件。

Jode Eclipse Plugin 1.0.5 for Eclipse version 3.1 / 3.2

安装方法

(1)从如下地址下载:

http://sourceforge.net/projects/jodeeclipse

把下载下来的文件jodeplugin_1.0.5.zip直接解压到eclipse的plugins目录下。

(2)启动eclipse,help -> Software Updates-> Find and Install... -> Search for new features to install,单击"New Remote Site..." 在URL栏输入 http://www.technoetic.com/eclipse/update然后下一步,就可以看到“jode decompiler plugin *.*”,选上安装就可以了。安装好后可以看到Window -> Preferences...-> Java -> Jode Decompiler选项卡,okay,安装成功了。


配置:Window-> Preferences... -> General -> Editors -> File Associations找到"*.class"在"Associated editors"里面可以看到"Jode class file viewer"选中它再单击Default按钮.


JadClipse Eclipse Plugin for Eclipse version 3.1 / 3.2/3.3

一、下载:
下载插件:
下载jadclipse_3.1.0.jar版本,该版本支持eclipse3.1M6~3.2M2
下载jadclipse_3.2.0.jar版本,该版本支持eclipse3.2M3和eclipse3.2M4.
下载jadclipse_3.2.4.jar版本,该版本支持eclipse3.2M5~3.3M5

下载jadclipse_3.3.0.jar版本,该版本支持eclipse3.3M6以上版本

下载Jad反编译工具:
http://www.kpdus.com/jad.html#download,在该页中找到适合自己操作系统平台的jad下载。下载后解压,然后将解压后的jad.exe文件复制到%JAVA_HOME%\bin目录下面(可以将jad.exe放到任意位置,只要记住其存放路径就好,下面要用到)。

二、安装:

Eclipse中的插件安装可以参考:Eclipse使用技巧(三)Eclipse中插件的安装
     方法1、直接将jadclipse_x.x.x.jar(x.x.x.代表版本号)复制到%ECLIPSE_HOME%\plugins目录下。

方法2、使用link方式安装,建立D:\Myplugins\jadclipse3.2.4\eclipse\plugins的目录结构,将jadclipse_3.2.4.jar放到plugins目录下面(注:其中D:\Myplugins为你自己定义的一个专门放置插件的目录)。再在%ECLIPSE_HOME%\links目录下面建立一个jadclipse3.2.4.link文件(该文件名随便取)。文件里面内容为:path=D:/Myplugins/jadclipse3.2.4.

常见问题及解决:

(一)启动eclipse,打开Window->Preferences->Java->JadClipse,如果没有找到JadClipse,即JadClipse插件没有激活。

(1)检查插件安装的版本是否与你安装的eclipse版本对应

(2)使用 –clean参数来启动eclipse

   (二)在使用JadClipse插件反编译class文件时出现如下类似错误:

/*jadclipse*/



/*

                DECOMPILATION REPORT



                Decompiled from: D:\Program Files\Java\jdk1.5.0_06\jre\lib\rt.jar

                Total time: 16 ms

                Jad reported messages/errors:

                Exit status: 0

                Caught exceptions:

java.io.IOException: CreateProcess: (...)



请确保你的Jad路径在eclipse中正确制定。
     启动eclipse,打开:Window->Preferences->Java->JadClipse.
1、Path to decompiler,这里设置反编译工具jad的全路径名,比如:%JAVA_HOME%\bin\jad.exe.
2、Directory for temporary files,这里设置临时文件路径。

至于Window->Preferences->Java->JadClipse目录下的Debug,Directives,Formatting,Misc目录中的参数设置,就不再罗嗦了。

(三)安装完成后,eclipse没有自动将JadClipse Class File Viewer设置成class文件的缺省打开方式。

如果没有默认,可以在Eclipse的Windows—> Perference—>General->Editors->File Associations中修改“*.class”默认关联的编辑器为“JadClipse Class File Viewer”。设置完成后,双击*.class文件,eclipse将自动反编译。

posted @ 2007-11-29 14:12 田亮 阅读(890) | 评论 (0)编辑 收藏

2007年4月9日

J2EE总结---JNDI技术 我的所有随笔属于个人总结,有不足之处请回复指出

 

1.       什么是JNDIJava Naming and Directory Interface

JNDI是用于访问不同命名和目录服务的统一API接口;

2.       JNDI的架构和原理

      1.       架构:

         第一层:java代码,是访问JNDI的代码;

         第二层:JNDI API:统一的命名和目录服务接口

         第三层:JNDI Naming ManagerJNDI管理器

         第四层:JNDI SPI:用于构建JNDI实现的框架,能够动态的插入命名和目录服务提供商的产品;

         第五层:命名和目录服务提供商的产品;

         命名和目录服务提供商的产品,例如:DNS,LDAP,NIS,NDS……..;因为这些产品都是不同的提供商提供的产品,所以他们的命名和目录服务的标准不一致,各个目录服务采用的访问协议也是不一样的,所以,要是直接访问他们的话,就要编写不同的java代码来访问他们;因此,JNDI SPI就解决了这个问题,它能动态的插入这些命名和目录服务,能够将其协议专属的目录产品集成到系统中,使得我们能只需要调用一个统一的javaAPI就能够访问插入的产品了;

         2.原理:

               JNDI其实很好理解,他就是一个树状的结构,它的最顶是一个initialContext节点,然后它的下面就是绑定的一些对象或是一些subContext,用JNDI树就能够查找到树中每一个绑定上的节点上的对象的引用;

3.怎样连接到JNDI上?

                  Environment environment = new Environment() ;//创建一个环境对象

                   environment.setProviderurl(“t3://www.blogjava.net”) ;

                   environment.setSecurityPrincipal(“todd”) ;//认证的用户名

                   environment.setSecurityCredentials(“841026”) ;//密码

                   Context context = environment.getInitialContext() ;

         //创建一个subContext并绑定一个对象:

                   Context subContext = context.createSubcontext(“subContext”) ;

                   subContext.rebind(“newObject”,object) ;//绑定的对象必须是可序列化的

                   subContext.close() ;

                   context.close() ;

4.如何通过JNDI查找bind的对象?

         Object object = context.lookup(“User”) ;

         //user窄化到原型

         User user = (User)javax.rmi.PortableRemoteObject.narrow(object, User.class) ;

         context.close() ;

posted @ 2007-04-09 08:16 田亮 阅读(3069) | 评论 (4)编辑 收藏

2007年4月8日

J2EE总结--Servlet技术 我的所有随笔属于个人总结,有不足之处请回复指出

 

Servlet技术:

1.       什么是servlet

Servlet是一个java类,是一个提供基于协议请求和响应的java类;

2.       它的生命周期

      1.       启动服务器时就会实例化并加载servlet实例;

      2.       进行初始化:自动调用initServletConfig servletConfig)方法;

      3.       Servlet就绪:调用serviceHttpServletRequest requestHttpServletResponse response)方法(其   中     service   就是dopost()或doget()方法),这是客户提交时,自动调用的;

      4.       Servlet销毁:自动调用调用distory()

   注意:在实例化并加载servlet后,步骤二和四只调用一次,而步骤三,是在每次客户端发出请求时都调用;

3.       怎样部署一个servlet

Servlet类是必须在web.xml中注册才能使用的,例如,我有一个MyServlet类:

必须在web.xml中注册:

<web-app>

//-----------------------Servlet声明----------------------

           <servlet>

                 <servlet-name>myServlet</servlet-name>

                 <servlet-class>servletPakage.MyServlet</servlet-class>

      </servlet>

//------------------------Servlet注册(镜像)---------------

           <servlet-mapping>

                 <servlet-name>myServlet</servlet-name>

                 <url-pattern>myServletURL</ url-pattern >

      </servlet-mapping>

</web-app>

这样你在提交时的Url地址就是/myServletURL了;

4.       什么是serviceHttpServletRequest requestHttpServletResponse response)方法?

其中serviceHttpServletRequest requestHttpServletResponse response)方法包括两种:

      1.       dogetHttpServletRequest requestHttpServletResponse response)方法:

      这种方法被称为显式提交方法,主要原因是它的得到的参数放在url中,可以被看到,所以称为显示提      交;

      例如:有个表单:

      <form action=”/myServletURL?name=todd” method=”get”>

      </form>

      这种方法其request获得的参数就是你看到的name=todd

      例如:String s=request.getParameter(“name”);

            其结果s=”todd”;

      2.       dopostHttpServletRequest requestHttpServletResponse response)方法:

         这种方法被称为隐式提交方法,它的参数不会在url里得到,而是在请求数据体得到参数;

         例如:有个表单:

            <form action=”/myServletURL” method=”post”>

                     <input type=”text” name=”name” value=”todd”>

         </form>

      这种方法其request获得的参数就是表单体的name=todd

            例如:String s=request.getParameter(“name”);

            其结果s=”todd”;

5.       什么是ServletContext?

         ServletContext是一个接口,是WebApplication的视图,它的作用域时Application,它能访问Application中的初始化参数和属性,它不局限域一个Servlet,它属于整个Application

ServletContext的初始化参数:

web.xml中:

<web-app>

    <context-param>

<param-name>myBlog</param-name>

<param-value>www.blogjava.net/todd841026</param-value>

</context-param>

</web-app>

 这样在application中任意一个Servlet中可以得到这个参数,

例如:ServletContext sc = getServletContext ();

          String s = sc.getInitParameter(“myBlog”);

那么结果s就是”www.blogjava.net/todd841026”

6.       什么是ServletConfig

是单独的Servlet初始化配置;

例如:在web.xml

<web-app>

            <servlet>

                 <servlet-name>myServlet</servlet-name>

                 <servlet-class>servletPakage.MyServlet</servlet-class>

      </servlet>

      <init-param>

            <param-name>cache</param-name>

            <param-value>off</param-value>

</init-param>

</web-app>

在这个Servlet中:ServletConfig sc = getServletConfig();

                            String s = sc.getInitParameter(“cache”);

那么结果s就是off”;

7.       Servlet怎样处理多线程

在默认的情况下,单个Servlet实例是可以处理多个并发请求的,所以要考虑到多线程的共享同一对象的问题,例如:

//做个Servlet中产生了多少个object对象一个变量的例子

Private int count = 0 ;

Public void dopost(HttpServletRequest request,HttpServletResponse response){

           Object object = new Object() ;

           count++ ;

           System.out.println(“count = ” + count) ;

}

当有5个用户提交数据时,因为Servlet是处理多线程的,所以可能出现,第四个用户的程序已经执行了count++,而第五个用户刚执行完Object object = new Object() ,就会出现数据不一致性,因为当前有5object对象,但是count却是4

解决方案一:

Private boolean flag = false

Private int count = 0 ;

Public void dopost(HttpServletRequest request,HttpServletResponse response){

           synchronized(flag){

                    Object object = new Object() ;

                    count++ ;

}                

           System.out.println(“count = ” + count) ;

}

用同步程序块解决多线程的问题,这样在同一时刻就只能有一个访问该程序块了;

解决方案二:

Private int count = 0 ;

Public void dopost(HttpServletRequest request,HttpServletResponse response)

Implements SingleThreadModel{

           Object object = new Object() ;

           count++ ;

           System.out.println(“count = ” + count) ;

}

实现SingleThreadModel接口,可以解决多线程问题;

8.       什么是servlet过滤器?

也是一个java类,只是它实现了Filter这个接口;

9.       servlet过滤器的生命周期;

初始化:自动调用init(FilterConfig config)方法

执行:自动调用doFilter()方法;

销毁:自动调用destory()方法;

10.   servlet过滤器有什么用途?

      个人认为目前自己用到的Servlet过滤器的主要用途:是安全性检查

         当然过滤器在Servlet之前也可以修改请求,要是在Servlet之后,也可以修改响应; 

11.   servlet过滤器怎样部署?

web.xml中:

<web-app>

    <filter>

      <filter-name>myFilter</filter-name>

      <filter-class>filterPage.MyFilter</filter-class>

</filter>

<filter-mapping>

      <filter-name>myFilter</filter-name>

      <url-pattern>/Todd/*</url-pattern>

</filter-mapping>

</web-app>

这样就是说要访问WEB-INF下的Todd包下的jspServlet的话,就必须要先通过myFilter这个类;

posted @ 2007-04-08 13:31 田亮 阅读(4214) | 评论 (6)编辑 收藏

仅列出标题  下一页

导航

统计

常用链接

留言簿(4)

随笔分类

随笔档案

文章分类

文章档案

相册

MyHome

搜索

最新评论

阅读排行榜

评论排行榜