posts - 38, comments - 2, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

2009年7月1日

转载 https://www.jb51.net/article/157820.htm

posted @ 2021-12-15 09:09 AntiquMan 阅读(73) | 评论 (0)编辑 收藏

转载 http://blog.itpub.net/31136666/viewspace-2121955/

posted @ 2021-12-15 09:08 AntiquMan 阅读(46) | 评论 (0)编辑 收藏

转载 https://zhuanlan.zhihu.com/p/50099084

posted @ 2021-12-15 09:07 AntiquMan 阅读(130) | 评论 (0)编辑 收藏

转载 https://www.cnblogs.com/lcword/p/8243685.html

posted @ 2021-12-15 09:07 AntiquMan 阅读(68) | 评论 (0)编辑 收藏

转载https://blog.csdn.net/huanhuan03/article/details/106398697/

posted @ 2021-12-15 09:06 AntiquMan 阅读(108) | 评论 (0)编辑 收藏

卸载默认的:
用root用户登陆到系统,打开一个终端输入
# rpm -qa|grep gcj
显示内容其中包含下面两行信息
# java-1.4.2-gcj-compat-1.4.2.0-27jpp
# java-1.4.2-gcj-compat-devel-l.4.2.0-27jpp
卸载
# rpm -e java-1.4.2-gcj-compat-devel-l.4.2.0-27jpp
# rpm -e java-1.4.2-gcj-compat-l.4.2.0-27jpp

卸载其他自己安装的JDK就直接用rpm -e <javaXXXXX>
   卸载rpm版的jdk:

   #rpm -qa|grep jdk

   显示:jdk-1.6.0_10-fcs
   卸载:#rpm -e  --nodeps  jdk-1.6.0_10-fcs

posted @ 2015-09-29 22:26 AntiquMan 阅读(153) | 评论 (0)编辑 收藏

1. 安装前,最好先删除Linux自带的OpenJDK:

(1)运行java-version,会发现Linux自带的OpenJDK,运行rpm -qa | grep OpenJDK,找出自带的OpenJDK名称;

(2)运行rpm - nodeps -e OpenJDK名称,删除OpenJDK;

2. 下载jdk-8u20-linux-x64.rpm,运行rpm -ivh jdk-8u20-linux-x64.rpm安装;

3. 运行vim /etc/profile,在文件末尾输入以下几行:

export JAVA_HOME=/usr/java/jdk1.8.0_20
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin

保存,退出;

4. 运行source /etc/profile,使/etc/profile文件生效,或者重启;

5. 运行java -version,返回结果如下:

java version "1.8.0_20"
Java(TM) SE Runtime Environment (build 1.8.0_20-b26)
Java HotSpot(TM) 64-Bit Server VM (build 25.20-b23, mixed mode)

说明JDK1.8已经安装成功!

---------------------Jrockit JDK 16

JAVA_HOME="/root/jrockit-jdk1.6.0_45-R28.2.7-4.1.0"
CLASSPATH=".:$JAVA_HOME/lib:$CLASSPATH"
PATH=".:$JAVA_HOME/bin:$PATH"
export JAVA_HOME CLASSPATH PATH



posted @ 2015-09-29 21:25 AntiquMan 阅读(575) | 评论 (0)编辑 收藏

 前段时间ORACLE把10G的下载从官网拿掉了 ,许多童鞋不知道ORACLE 10g 的下载地址,这里我附上oracle 10g 下载的链接,方便大家下载。

          点击链接使用迅雷即可下载。

          4种包的介绍:

                    ***_database_*.zip                 是oracle数据库 服务端 软件的安装包,如果你要创建一个数据库,请下载这个版本

                    ***_client_*.zip                       是oracle数据库 客户端 软件的安装包,如果你不需要创建数据库,只是用来操作远程电脑上的数据库时,请下载这个版本

                    ***_gateways_*.zip                oracle透明网关,如果你要链接其他数据库,请下载这个软件包

                    ***_clusterware_*.zip             oracle集群软件,如果你要做RAC,请下载这个软件包

          

 

 

Oracle Database 10g Release 2 (10.2.0.1.0) Enterprise/Standard Edition for Linux x86

http://download.oracle.com/otn/linux/oracle10g/10201/10201_database_linux32.zip
http://download.oracle.com/otn/linux/oracle10g/10201/10201_client_linux32.zip

http://download.oracle.com/otn/linux/oracle10g/10201/10201_clusterware_linux32.zip
http://download.oracle.com/otn/linux/oracle10g/10201/10201_gateways_linux32.zip

 

Oracle Database 10g Release 2 (10.2.0.1.0) Enterprise/Standard Edition for Linux x86-64

http://download.oracle.com/otn/linux/oracle10g/10201/10201_database_linux_x86_64.cpio.gz
http://download.oracle.com/otn/linux/oracle10g/10201/10201_client_linux_x86_64.cpio.gz
http://download.oracle.com/otn/linux/oracle10g/10201/10201_clusterware_linux_x86_64.cpio.gz
http://download.oracle.com/otn/linux/oracle10g/10201/10201_gateways_linux_x86_64.cpio.gz

 

Oracle Database 10g Release 2 (10.2.0.1.0) Enterprise/Standard Edition for Microsoft Windows (32-bit)

            http://download.oracle.com/otn/nt/oracle10g/10201/10201_database_win32.zip
            http://download.oracle.com/otn/nt/oracle10g/10201/10201_client_win32.zip
            http://download.oracle.com/otn/nt/oracle10g/10201/10201_clusterware_win32.zip
            http://download.oracle.com/otn/nt/oracle10g/10201/10201_gateways_win32.zip

 

Oracle Database 10g Release 2 (10.2.0.1.0) Enterprise/Standard Edition for Microsoft Windows (x64)

            http://download.oracle.com/otn/nt/oracle10g/10201/102010_win64_x64_database.zip
            http://download.oracle.com/otn/nt/oracle10g/10201/102010_win64_x64_client.zip
            http://download.oracle.com/otn/nt/oracle10g/10201/102010_win64_x64_clusterware.zip

       

          如果是win7 64位,可能下载上面的版本还是无法安装,需要下载下面的这个版本:

          http://download.oracle.com/otn/nt/oracle10g/10204/10204_vista_w2k8_x64_production_db.zip

 

 

Oracle Database 10g Release 2 (10.2.0.1.0) Enterprise/Standard Edition for AIX5L

http://download.oracle.com/otn/aix/oracle10g/10201/10gr2_aix5l64_database.cpio.gz
http://download.oracle.com/otn/aix/oracle10g/10201/10gr2_aix5l64_client.cpio.gz
http://download.oracle.com/otn/aix/oracle10g/10201/10gr2_aix5l64_cluster.cpio.gz
http://download.oracle.com/otn/aix/oracle10g/10201/10gr2_aix5l64_gateways.cpio.gz

Oracle Database 10g Release 2 (10.2.0.2) Enterprise/Standard Edition for Solaris Operating System (x86)

http://download.oracle.com/otn/solaris/oracle10g/10202/10202_database_solx86.zip
http://download.oracle.com/otn/solaris/oracle10g/10202/10202_client_solx86.zip
http://download.oracle.com/otn/solaris/oracle10g/10202/10202_clusterware_solx86.zip

 

Oracle Database 10g Release 2 (10.2.0.1.0) Enterprise/Standard Edition for Solaris Operating System (x86-64)

http://download.oracle.com/otn/solaris/oracle10g/10201/x8664/10201_database_solx86_64.zip
http://download.oracle.com/otn/solaris/oracle10g/10201/x8664/10201_client_solx86_64.zip
http://download.oracle.com/otn/solaris/oracle10g/10201/x8664/10201_clusterware_solx86_64.zip

posted @ 2015-08-20 19:27 AntiquMan 阅读(155) | 评论 (0)编辑 收藏

SHUTDOWN_MSG: Shutting down NameNode at java.net.UnknownHostException: datanode: datanode: unknown error

如果忽略该错误启动DFS,会发现datanode无法正常启动。

原因:
    hadoop在格局化HDFS的时辰,经由过程hostname号令获取到的主机名在/etc/hosts文件中进行映射的时辰,没有找到,也就是名字不一样。

即:
    配置文件slaves 填写的 主机名  要与 节点的主机名一致(节点机上hostname查看)

查看本身用户的主机名:hostname

查看/etc/hosts内容:cat /etc/hosts

hosts文件 里面我们自己随意起的主机名字是不可以的,必须与 节点主机hostname一致。

结论:
节点主机: hostname  、    个主机中的/etc/hosts 下的hostname   、  配置文件slaves 中的hostname  必须完全一致。

解决方法


修改/etc/sysconfig/network中HOSTNAME的值为localhost,或者自己指定的主机名,保证localhost在/etc/hosts文件中映射为正确的IP地址,然后重新启动网络服务.

/etc/rc.d/init.d/network restart 

posted @ 2015-08-19 14:24 AntiquMan 阅读(788) | 评论 (0)编辑 收藏

什么是域名解析:域名解析就是域名到IP地址的转换过程。IP地址是网路上标识您站点的数字地址,为了简单好记,采用域名来代替IP地址标识站点地址。域名的解析工作由DNS服务器完成。

什么是A记录(IP指向): 用来指定域名对应的IP地址记录。用户可以将该域名解析到自己的web server上。同时也可以设置您域名的二级域名。

什么是cname记录(别名指向):相当于用子域名来代替ip地址,优点是如果ip地址变化,只需要改动子域名的解析,而不需要逐一改变ip地址解析。

什么是URL(转发):访问您的域名时,将会自动跳转到您所指定的另一个网络地址(URL),此时在浏览器地址栏显示的是你跳转的地址。

什么是frame(隐藏转发):访问您的域名时,将会自动跳转到您所指定的另一个网络地址(URL),此时在浏览器地址栏显示的是你原域名地址。

什么是mail记录:它指向一个邮件服务器,用于电子邮件系统发邮件时根据 收信人的地址后缀来定位邮件服务器。

什么是MX记录:它指向一个邮件服务器,用于电子邮件系统发邮件时根据 收信人的地址后缀来定位邮件服务器。

posted @ 2015-08-10 14:37 AntiquMan 阅读(287) | 评论 (0)编辑 收藏

第一步:加入log4j-1.2.8.jar到lib下。

第二步:在CLASSPATH下建立log4j.properties。内容如下:

1 log4j.rootCategory=INFO, stdout , R

2

3 log4j.appender.stdout=org.apache.log4j.ConsoleAppender

4 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

5 log4j.appender.stdout.layout.ConversionPattern=[QC] %p [%t] %C.%M(%L) | %m%n

6

7 log4j.appender.R=org.apache.log4j.DailyRollingFileAppender

8 log4j.appender.R.File=D:\Tomcat 5.5\logs\qc.log

9 log4j.appender.R.layout=org.apache.log4j.PatternLayout

10 log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n

11

12 log4j.logger.com.neusoft=DEBUG

13 log4j.logger.com.opensymphony.oscache=ERROR

14 log4j.logger.net.sf.navigator=ERROR

15 log4j.logger.org.apache.commons=ERROR

16 log4j.logger.org.apache.struts=WARN

17 log4j.logger.org.displaytag=ERROR

18 log4j.logger.org.springframework=DEBUG

19 log4j.logger.com.ibatis.db=WARN

20 log4j.logger.org.apache.velocity=FATAL

21

22 log4j.logger.com.canoo.webtest=WARN

23

24 log4j.logger.org.hibernate.ps.PreparedStatementCache=WARN

25 log4j.logger.org.hibernate=DEBUG

26 log4j.logger.org.logicalcobwebs=WARN

第三步:相应的修改其中属性,修改之前就必须知道这些都是干什么的,在第二部分讲解。

第四步:在要输出日志的类中加入相关语句:

定义属性:protected final Log log = LogFactory.getLog(getClass());

在相应的方法中:

if (log.isDebugEnabled())

{

log.debug(“System …..”);

}

二、Log4j说明

1 log4j.rootCategory=INFO, stdout , R

此句为将等级为INFO的日志信息输出到stdout和R这两个目的地,stdout和R的定义在下面的代码,可以任意起名。等级可分为OFF、 FATAL、ERROR、WARN、INFO、DEBUG、ALL,如果配置OFF则不打出任何信息,如果配置为INFO这样只显示INFO, WARN, ERROR的log信息,而DEBUG信息不会被显示,具体讲解可参照第三部分定义配置文件中的logger。

3 log4j.appender.stdout=org.apache.log4j.ConsoleAppender

此句为定义名为stdout的输出端是哪种类型,可以是

org.apache.log4j.ConsoleAppender(控制台),

org.apache.log4j.FileAppender(文件),

org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),

org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)

org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

具体讲解可参照第三部分定义配置文件中的Appender。

4 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

此句为定义名为stdout的输出端的layout是哪种类型,可以是

org.apache.log4j.HTMLLayout(以HTML表格形式布局),

org.apache.log4j.PatternLayout(可以灵活地指定布局模式),

org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),

org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

具体讲解可参照第三部分定义配置文件中的Layout。

5 log4j.appender.stdout.layout.ConversionPattern= [QC] %p [%t] %C.%M(%L) | %m%n

如果使用pattern布局就要指定的打印信息的具体格式ConversionPattern,打印参数如下:

%m 输出代码中指定的消息

%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL

%r 输出自应用启动到输出该log信息耗费的毫秒数

%c 输出所属的类目,通常就是所在类的全名

%t 输出产生该日志事件的线程名

%n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”

%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921

%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。

[QC]是log信息的开头,可以为任意字符,一般为项目简称。

输出的信息

[TS] DEBUG [main] AbstractBeanFactory.getBean(189) | Returning cached instance of singleton bean 'MyAutoProxy'

具体讲解可参照第三部分定义配置文件中的格式化日志信息。

7 log4j.appender.R=org.apache.log4j.DailyRollingFileAppender

此句与第3行一样。定义名为R的输出端的类型为每天产生一个日志文件。

8 log4j.appender.R.File=D:\Tomcat 5.5\logs\qc.log

此句为定义名为R的输出端的文件名为D:\Tomcat 5.5\logs\qc.log

可以自行修改。

9 log4j.appender.R.layout=org.apache.log4j.PatternLayout

与第4行相同。

10 log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n

与第5行相同。

12 log4j.logger.com. neusoft =DEBUG

指定com.neusoft包下的所有类的等级为DEBUG。

可以把com.neusoft改为自己项目所用的包名。

13 log4j.logger.com.opensymphony.oscache=ERROR

14 log4j.logger.net.sf.navigator=ERROR

这两句是把这两个包下出现的错误的等级设为ERROR,如果项目中没有配置EHCache,则不需要这两句。

15 log4j.logger.org.apache.commons=ERROR

16 log4j.logger.org.apache.struts=WARN

这两句是struts的包。

17 log4j.logger.org.displaytag=ERROR

这句是displaytag的包。(QC问题列表页面所用)

18 log4j.logger.org.springframework=DEBUG

此句为Spring的包。

24 log4j.logger.org.hibernate.ps.PreparedStatementCache=WARN

25 log4j.logger.org.hibernate=DEBUG

此两句是hibernate的包。

以上这些包的设置可根据项目的实际情况而自行定制。

三、log4j详解

1、定义配置文件

Log4j支持两种配置文件格式,一种是XML格式的文件,一种是Java特性文件log4j.properties(键=值)。下面将介绍使用log4j.properties文件作为配置文件的方法:

、配置根Logger

Logger 负责处理日志记录的大部分操作。

其语法为:

log4j.rootLogger = [ level ] , appenderName, appenderName, …

其中,level 是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定义的级别。Log4j建议只使用四个级别,优 先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定 义了INFO级别,只有等于及高于这个级别的才进行处理,则应用程序中所有DEBUG级别的日志信息将不被打印出来。ALL:打印所有的日志,OFF:关 闭所有的日志输出。 appenderName就是指定日志信息输出到哪个地方。可同时指定多个输出目的地。

、配置日志信息输出目的地 Appender

Appender 负责控制日志记录操作的输出。

其语法为:

log4j.appender.appenderName = fully.qualified.name.of.appender.class

log4j.appender.appenderName.option1 = value1



log4j.appender.appenderName.optionN = valueN

这里的appenderName为在①里定义的,可任意起名。

其中,Log4j提供的appender有以下几种:

org.apache.log4j.ConsoleAppender(控制台),

org.apache.log4j.FileAppender(文件),

org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),

org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),可通过 log4j.appender.R.MaxFileSize=100KB设置文件大小,还可通过 log4j.appender.R.MaxBackupIndex=1设置为保存一个备份文件。

org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

例如:log4j.appender.stdout=org.apache.log4j.ConsoleAppender

定义一个名为stdout的输出目的地,ConsoleAppender为控制台。

、配置日志信息的格式(布局)Layout

Layout 负责格式化Appender的输出。

其语法为:

log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class

log4j.appender.appenderName.layout.option1 = value1



log4j.appender.appenderName.layout.optionN = valueN

其中,Log4j提供的layout有以下几种:

org.apache.log4j.HTMLLayout(以HTML表格形式布局),

org.apache.log4j.PatternLayout(可以灵活地指定布局模式),

org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),

org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

2、格式化日志信息

Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下:

%m 输出代码中指定的消息

%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL

%r 输出自应用启动到输出该log信息耗费的毫秒数

%c 输出所属的类目,通常就是所在类的全名

%t 输出产生该日志事件的线程名

%n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”

%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921

%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。

3、在代码中使用Log4j

我们在需要输出日志信息的类中做如下的三个工作:

1、导入所有需的commongs-logging类:

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

2、在自己的类中定义一个org.apache.commons.logging.Log类的私有静态类成员:

private final Log log = LogFactory.getLog(getClass());

LogFactory.getLog()方法的参数使用的是当前类的class。

3、使用org.apache.commons.logging.Log类的成员方法输出日志信息:

if (log.isDebugEnabled())
{
log.debug("111");
}
if (log.isInfoEnabled())
{
log.info("222");
}
if (log.isWarnEnabled())
{
log.warn("333");
}
if (log.isErrorEnabled())
{
log.error("444");
}
if (log.isFatalEnabled())
{
log.fatal("555")
}


转载:http://www.blogjava.net/kit-soft/archive/2009/08/28/292977.html

posted @ 2013-08-26 11:27 AntiquMan 阅读(222) | 评论 (0)编辑 收藏

JOB任务,在此写个总结,以备日后之需。 

用一个存储过程创建并执行JOB,代码如下: 
Sql代码  
  1. CREATE OR REPLACE PROCEDURE P_TEST_JOB  
  2. IS  
  3. --判断任务是否已被创建,若任务被创建过,则 isExist > 0  
  4. isExist NUMBER := 0;  
  5. --归档任务标识  
  6. jobId NUMBER;  
  7. BEGIN  
  8.     SELECT COUNT(*) INTO isExist FROM ALL_JOBS J WHERE J.WHAT = '过程名;';  
  9.     --检查任务是否已被创建,如果已被创建,则不做操作  
  10.     IF isExist = 0 THEN  
  11.         --创建任务  
  12.         DBMS_JOB.submit(jobId,                --任务标识  
  13.                         '过程名;',             --任务要执行的存储过程,后边的分号不可略  
  14.                         SYSDATE,              --任务开始时间  
  15.                         'SYSDATE + 10/1440'); --任务执行周期,此处指每10分钟执行一次  
  16.         COMMIT;  
  17.         --运行任务  
  18.         DBMS_JOB.run(jobId);  
  19.         COMMIT;  
  20.     END IF;  
  21. END;  

执行此存储过程,在ORACLE运行的JOB列表里会出现新增的JOB,可以用 
Sql代码  
  1. SELECT * FROM ALL_JOBS J WHERE J.WHAT = '过程名;'  

posted @ 2011-09-12 15:04 AntiquMan 阅读(284) | 评论 (0)编辑 收藏

Windows 7硬盘安装方法大全:包括Windows 7下安装高版本的Windows 7,Vista下硬盘安装Windows 7,xp下硬盘安装Windows7等方法!

Windows 7 RTM 7600 16385 简体中文旗舰版32位下载地址,请将下面的链接复制下来,然后在迅雷里面“新建”下载任务,把地址粘贴进去,速度在1M左右。

ftp://124.115.177.55/共享文件夹/装机工具/7600.16385.090713-1255_x86fre_client_zh-cn_Retail_Ultimate-GRMCULFRER_CN_DVD.iso

 

首先,向您推荐一种最方便的安装方法(我就是用这种方法安装自己的Win7)。使用nt6 hdd installer这个小工具。下载地址:http://www.xdowns.com/soft/6/boot/2009/Soft_57197.html

原系统(2000/XP/2003/VISTA/2008/WIN7/PE)和要新装的WIN7系统都没有32位/64位限制;装成单系统还是多系统也没有限制;安装过程免命令提示符操作

一、虚拟光驱加载后复制或UltraISO/WINRAR解压ISO文件至硬盘一非系统分区的根目录
(也可以依照附件中的图示操作)
注意:是复制或解压至根目录,而不是某文件夹,这一点和传统硬盘安装方法不同

二、下载并安装 nt6 hdd Installer
下载地址:http://www.xdowns.com/soft/6/boot/2009/Soft_57197.html
三、重启选择nt6 hdd installer后自动进入安装界面,安装操作和光盘一样,装在其它分区上成双系统、格式化C盘结果为单系统就随你所需了。

点击下面的图片可以在新窗口中查看大图。

无光驱,硬盘安装Windows <wbr>7 <wbr>方法大全


 

一、windows 7系统下全新安装高版Windows7 (注意:Home Basic等几个低版本的Win7或Vista开机按F8会没有“修复系统”这一个菜单选项,那么这种方法就不适用了):
1、下载windows7 7600 ISO镜像(RTM),用虚拟光驱拷贝至非C盘(如D:\7600)
2、开机按F8——修复系统——选择最后一项命令修复——在命令框输入"D:\7600\sources\setup.exe"(不带引号)
3、进入安装界面、选择custom (自定义)安装
4、选择安装语言、格式化C盘
5、OK了,装好后是一个纯系统(非双系统)。

二、如果有vista安装盘的话,方法也很简单:
1、下载windows7 7600 RTM ISO镜像,用虚拟光驱拷贝至非C盘(如D:\7600)
2、BIOS中选择光驱启动,进入vista安装界面
3、选择左下角修复计算机(自动搜索系统,提示加载驱动或关闭,选择关闭进入修复选项)
4、选择最后一项命令修复,在命令框输入"D:\7600\sources\setup.exe"(不带引号),开始安装
5、选择安装语言、格式化C盘 (即使C盘原本没有系统此法也可行)

三、XP系统下全新安装windows 7:
1、下载windows 7 7600 ISO镜像(RTM),用虚拟光驱拷贝至非C盘(如D:\7600)
2、把D:\7600目录下的bootmgr和boot目录(其实只要里面的boot.sdi和bcd文件)拷贝到c盘根目录下,并在C盘根目录下建个sources文件夹。(XP下不需要取得管理员权限)
3、把D:\7600\sources下的boot.win复制到C盘刚建的sources文件夹
4、用管理员身份运行cmd,然后输入c:\boot\bootsect.exe /nt60 c: 提示successful(即成功了!)
5、关闭cmd窗口重启计算机,自动进入安装界面,选择安装语言,同时选择适合自己的时间和货币显示种类及键盘和输入方式
6、出现"开始安装界面",(要注意了,不点击"现在安装")点左下角"修复计算机"(repair mycomputer),进入"系统恢复选择",选择最后一项"命令提示符"(commandprompt),进入DOS窗口
7、输入"D:\7600\sources\setup.exe"(不带引号),开始安装
8、选择安装语言、格式化C盘,就OK了

四、vista系统下全新安装windows7:
1、下载windows 7 7600ISO镜像(RTM),用虚拟光驱拷贝至非C盘(如D:\7600)
2、复制D:\7600文件夹中的Boot、EFI、sources文件夹和bootmgr至C盘根目录下
3、复制D:\7600\boot下Bootsect.exe至C盘根目录下
第2部需取得管理员权限
4、管理员身份运行cmd,输入c:\bootsect.exe/nt60 c:并回车(最好复制,中间有空格)
5、重启系统自动进入安装界面,点左下角的修复计算机repair my computer)
6、选择最后一项命令提示符,进入DOS窗口,输入D:\7600\sources\setup.exe进入安装界面
7、选择安装语言、格式化C盘,就OK了

posted @ 2011-07-29 16:20 AntiquMan 阅读(374) | 评论 (0)编辑 收藏

刚装WINDOWS 7 启动tomcat 时 报Unrecognized Windows Sockets error: 0: JVM_Bind
     当时,我就觉的怪了,我以前系统重装后,根本就没有出现这样的事情啊,最我想一下,一定是tomcat的
   配置文件端口有问题.最后我终于发现在了 在tomcat 下的conf文件下的server.xml 把
<Server port="8009" shutdown="SHUTDOWN">
<Connector port="8090" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

    <Connector port="8099" protocol="AJP/1.3" redirectPort="8443" />
这三个端口改掉就OK了

posted @ 2010-12-04 11:56 AntiquMan 阅读(1018) | 评论 (0)编辑 收藏

用上了Windows 7之后,感觉速度快了很多。可有点不爽的是:不少软件特别是绿色软件在运行时,总会弹出“用户账户控制”(UAC)提示,单击“是”才能正常运行。虽然关闭UAC可以实现不弹出对话框,但是会让系统不安全,如果能在保持开启UAC的同时让信任的软件启动时不再弹出UAC选择就好了,现在使用一款微软推出的软件即可解决问题。(下载地址:http://www.cbifamily.com/download/200941.html)

第1分钟:安装软件

下载安装Microsoft Application Compatibility Toolkit 5.5之后,右击“Microsoft Application Compatibility Toolkit 5.5”程序组中的“Compatibility Administrator”,选择“以管理员身份运行”,单击“是”打开该工具。


●以管理员身份运行

第2分钟:创建新的数据库

单击工具栏上的“New”按钮,然后右击“Custom Databases”下的“New Database(1)”出现菜单,选择“Create New”下的“Application Fix…”出现对话框。


●建立新的数据库

第3分钟:设置信任的软件进程

在“Name of the programto be fixed”和“Name of the vendor for this program”中输入要加入白名单的软件名称,可任意输入;单击“Browse…”按钮选择程序的执行文件,一般是exe文件。右击程序的执行文件选择“属性”,在“目标”中可以找到程序执行文件的路径。

第4分钟:设置软件权限

单击“下一步”切换窗口,选择“Operating system modes”下的“None”,选择“Select additional compatibility modes”下的“RunAsAdmin”和“RunAslnvoker”两个选项,连续单击两次“下一步”,最后单击“完成”按钮返回主界面。


●设置软件运行的权限

第5分钟:设置完成

单击工具栏上的“Save”按钮,在“Datebase Name”中任意输入一个文件名,单击OK后再次输入任何文件名保存创建的白名单,最后选择菜单“File”下的“Install”将白名单添加到Windows 7的UAC中,此时会出现对话框提示安装成功,再点击一下run选项运行一下设置的软件,然后关闭这个软件,就会实现自己信任的软件打开不弹出UAC对话框的效果了。


●设置完成之后别忘点击RUN先测试一下

posted @ 2010-11-30 09:21 AntiquMan 阅读(1745) | 评论 (0)编辑 收藏

大型项目开发中,常用的数据库,当属Oracle。但Oracle 客户端安装就要一张光盘,体积很大。而且安装后,基本上就用2个功能:TNS配置服务名,SqlPlus。在开发过程中,大量使用Toad和PL/SQL Developer。因此,Oracle客户端安装盘,仅仅是被作为一个驱动而需要,根本没必要装那么大的空间。因此,本文给出了如何使用精简的Oracle客户端。
我使用两种精简的Oracle客户端,大家可以任选其一:
一、Oracle 9i (版本: 9.0.1.0.1)精简客户端 绿色版
          占用35M空间, 带SqlPlus工具。绿色版,超级推荐!!!
使用方法:
1. 确定OracleHome目录:比如我准备把Oracle 客户端放在  d:\program files\Oracle 下
2. 把ora90目录复制到d:\program files\Oracle 目录下
3. 如果你的OracleHome目录与我的不同,请用计事本打开install_oracle9i.reg 文件,替换d:\\progra~1\\Oracle,保存。
4. 双击install_oracle9i.reg, 导入注册表。
5. 用计事本打开D:\Program Files\Oracle\ora90\network\ADMIN\tnsnames.ora 文件,增加一个自己的数据库别名配置,保存。 可以复制其中的一个,然后进行修改,主要改=前面的别名,Host为IP地址, SERVICE_NAME为数据库服务器的实例名。
6. 然后运行D:\Program Files\Oracle\ora90\BIN\sqlplusw.exe,输入用户名/密码@别名,即可。
卸载方法:
1. 双击uninstall_oracle9i.reg, 导入注册表。
2. 删除d:\program files\Oracle 目录。
 
下载地址:
 
 
二、Oracle 10g Instant Client
Oracle Instant Client 是Oracle 公司推出的精简版客户端,不需要安装,但需要简单配置一下。
下载地址:    [url]http://www.oracle.com/technology/software/tech/oci/instantclient/index.html[/url]
我下载的是Win32平台下的10.2.0.3 Basic版本。Instant client 有2个版本:Basic和Basic Lite。
Basic版本包括了所有的支持运行OCI、OCCI、JDBC、JDBC-OCI的文件,支持多种语言。
Basic Lite是Basic版本的精简版,只包括了英文的错误描述,也只支持Unicode、ASCII和欧洲字符集。
因此,如果数据库服务器是中文字符集(如 SIMPLIFIED CHINESE_CHINA.ZHS16GBK),则必须下载Basic版本。
Basic Lite 占用25M空间,Basic 占用93M空间。要支持中文,就一下子多了70M,汗!
另外,可以下载sqlplus,不过是命令行的版本,不是图形界面的。
1. 把下载的Basic版压缩包解压,放到 D:\Program Files\instantclient_10_2 目录下,总共8个文件。
2. 桌面上,右键点“我的电脑”,选择“属性”,选择“高级”页中的“环境变量”,在系统变量中,增加:
   1) 变量名:ORACLE_HOME
      变量值:D:\Program Files\instantclient_10_2
   2) 变量名:TNS_ADMIN
      变量值:D:\Program Files\instantclient_10_2
   3) 变量名:NLS_LANG
      变量值:SIMPLIFIED CHINESE_CHINA.ZHS16GBK
   4) 修改Path变量,在后面添加 D:\Program Files\instantclient_10_2
   
   如果不愿意手工增加,可以下载 SetOraEnv.rar 附件, 解压后执行其中的 setOraEnv.bat.
3. 在D:\Progra~1\instantclient_10_2 新建一个文本文件,文件名为tnsnames.ora,文件中增加自己的数据库别名配置,
示例如下:
   MyDB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.1.16)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = ora10g)
    )
  )
主要改=前面的别名,Host为IP地址, SERVICE_NAME为数据库服务器的实例名。
4. 把sqlplus的压缩包中的文件,解压到 D:\Program Files\instantclient_10_2 目录下,共3个文件。
   在Dos命令行,在D:\Program Files\instantclient_10_2 目录下,运行 sqlplususername/password@dbname,即可连到数据库上。
  
卸载方法:
1.  桌面上,右键点“我的电脑”,选择“属性”,选择“高级”页中的“环境变量”,在系统变量中,
    删除 ORACLE_HOME, TNS_ADMIN, NLS_LANG 三个变量,修改path变量,去掉D:\Program Files\instantclient_10_2目录。
2. 删除D:\Progra~1\instantclient_10_2 目录.

三、第三方工具使用:
上面的任何一种客户端配置好后,都可以安装Toad 或者PL/SQL Developer 工具,不需要再额外进行任何设置,即可使用。
    
    

本文出自 “expert” 博客,请务必保留此出处http://expert.blog.51cto.com/339473/70969

posted @ 2010-11-29 20:07 AntiquMan 阅读(1298) | 评论 (0)编辑 收藏

由于各款手机性能不同,在中文显示上可能会出现问题,简单方法用<?xml version=”1.0″ encoding=”GB2312″?>这一句就可以了,我用手机试过,没有问题,但如果是提交可能会有一点问题,经过试验,发现显示中文的最佳解决方法还是利用UNICODE代码,解决方法是用encoding=”utf-8″,必须用程序将转换成unicode,目前未知ASP是否可以转换,但用JAVA或JSP可以有效的解决这个问题,源代码如下:

static public String getJsp(String name) throws Exception
{
String var = “”;
if (name == null)
return var;
else return new String(name.trim().getBytes(“ISO-8859-1″),”GBK”);

posted @ 2010-02-26 15:39 AntiquMan 阅读(155) | 评论 (0)编辑 收藏

kevin1543 xLR8ZC-855575-6754735755635682

posted @ 2009-10-13 09:21 AntiquMan 阅读(177) | 评论 (0)编辑 收藏

登录网站用.xml文件做的时,提示下载,根本打不开.

 

我试图在文件夹选项可注册表中重新设置打开方式,结果还是不行。。

 

到网上搜索一下相关的方法呢。

果然搜索到了,使用以下命令就可以恢复XML文件的默认关联:

REGSVR32 MSXML3.DLL

 

运行之后,XML的打开方式就恢复默认了。

posted @ 2009-09-08 23:48 AntiquMan 阅读(846) | 评论 (0)编辑 收藏

本部分介绍的所有的WSDD元素的名称空间都是"http://xml.apache.org/axis/wsdd/"。

<deployment>

告诉Axis Engine这是一个部署描述文件。一个部署描述文件可以表示一个完整的engine配置或者将要部署到一个活动active的一部分组件。

<GlobalConfiguration>

用于控制engine范围的配置。可以包含以下子元素:

·   <parameter> : 用来设置Axis的各种属性,参考Global Axis Configuration,可以配置任意数量的参数元素.

·   <role> : 设置一个SOAP actor/role URI,engine可以对它进行识别。这允许指向这个role的SOAP headers成功的被engine处理。任意数量.

·   <requestFlow> : 全局的请求Handlers。在调用实际的服务之前调用.

·   <responseFlow> : 全局响应Handlers,在调用完实际的服务后,还没有返回到客户端之前调用.

<requestFlow [name="name"] [type="type"] >

可以放置任意多个<handler> or <chain>在<requestFlow>中,但是可能只有一个<requestFlow>.

<responseFlow [name="name"] [type="type"] >

This is used to configure handlers in response flow. You may put any number of <handler> or <chain> elements (see below) inside the <responseFlow>, but there may only be one <responseFlow>.

<undeployment>

部署文档的根元素,用于指示Axis这是个卸载描述文件.

<handler [name="name"] type="type">

位于顶层元素<deployment> or <undeployment>, or inside a <chain>, <requestFlow>, or <responseFlow>. 用于定义Handler,并定义handler的类型。"Type" 可以是已经定义的Handler或者是"java:class.name"形式的QName。可选的"name"属性允许将这个Handler的定义在其他部署描述部分中引用。可以包含任意数量的<parameter name="name" value="value">元素.

<service name="name" provider="provider" >

部署/卸载一个Axis服务。这是最复杂的一个WSDD标签。

Options可能通过以下元素来指定: <parameter name="name" value="value"/>, 一些常用的包括:

·   className : 后台实现的类

·   allowedMethods : 每个provider可以决定那些方法允许web services访问

Axis支持的providers有如下几种:

Java RPC Provider (provider="java:RPC") 默认情况下所有的public方法都可以web service方式提供

Java MsgProvder (provider="java:MSG") 

为了更进一步的限制上面的方法,allowedMethods选项用于指定一个以空格分隔的方法名,只有这些方法可以通过web service访问。也可以将这个值指定为”*”表示所有的方法都可以访问。同时operation元素用来更进一步的定义被提供的方法,但是它不能决定方法的可见性. 

注意,发布任何web service都有安全含义.

·   allowedRoles : 都好分离的允许访问服务的角色列表。注意,这些是安全角色,和SOAP角色相反。安全角色控制访问,SOAP角色控制哪些SOAPheaders会被处理。

·   extraClasses : 指定一个空格或者都好分离的类名称列表,这些类的名字应该被包含在WSDL文档的类型定义部分。当服务接口引用一个基类的时候,或者希望WSDL文件包含其他类的XML Schema类型定义的时候,这个参数很有用。

如果希望为服务定义handler,可以在<service>元素中添加<requestFlow>和<responseFlow>子元素。他们的语义和<chain>元素中的定义时一样的。也就是说,它们可以包含<handler> and <chain> 元素,根据指定的顺序被调用.

通过服务的Handlers来控制角色,可以在服务声明中指定任意数量的<role>元素。

例如:

<service name="test">

 <parameter name="className" value="test.Implementation"/>

 <parameter name="allowedMethods" value="*"/>

 <namespace>http://testservice/</namespace>

 <role>http://testservice/MyRole</role>

 <requestFlow> <!-- Run these before processing the request -->

    <handler type="java:MyHandlerClass"/>\

    <handler type="somethingIDefinedPreviously"/>

 </requestFlow>

</service>

可以通过使用<operation>标签指定关于服务的特殊操作的元数据。这可以将方法的java参数名和特定的XML名进行映射,为参数指定特定的模式,并将特定的XML名字映射到特定的操作。例如

<operation name="method">

</operation> 

<chain name="name">
<subelement/>...
</chain> 

定义一个链。当chain被调用的时候,按顺序调用其中的handler。这样就可以构建一个常用功能的模块,chain元素的子元素可以是handler或者chain。handler的定义形式可以是如下两种方式:

<chain name="myChain">
 <handler type="java:org.apache.axis.handlers.LogHandler"/></chain>

或者

<handler name="logger" type="java:org.apache.axis.handlers.LogHandler"/>
<chain name="myChain"/>
   <handler type="logger"/></chain>

<transport name="name">

定义了一个服务器端的传输。当一个输入请求到达的时候,服务器传输被调用。服务器传输可能定义<requestFlow> and/or <responseFlow> 元素来指定handlers/chains,在请求和响应被处理的时候被调用,这个功能和service元素中的功能一样。典型的传输请求响应handler实现了关于传输的功能。例如转换协议headers等等.

对于任何种类的传输,经常是指HTTP传输,当特定的查询字符串传递到servlet的时候用户可能允许Axis servlets执行任意的动作,以plug-in的方式。 (参考Axis Servlet Query String Plug-ins).当查询字符串handler的类名被指导后,用户可以通过在<transport>中添加合适的<parameter>来启用它(插件)。

<transport name="http">
  <parameter name="useDefaultQueryStrings" value="false" />
  <parameter name="qs.name" value="class.name" /></transport>
在上面的例子中,AxisServlet会处理的查询字符串是?name,它调用的类是class.name。<parameter>元素的name属性必须加上前缀qs来表示这个元素定义了一个查询字符串handler。value属性值相实现了org.apache.axis.transport.http.QSHandler 接口的类。默认情况下,Axis提供了三个Axis servlet查询字符串handlers (?list, ?method, and ?wsdl). 查看Axis服务器配置文件来了解它们的定义。如果不希望使用默认的handlers,就设置"useDefaultQueryStrings" 为false。默认会被设置成true. 

<transport name="name" pivot="handler type" >

定义了一个客户端的传输,当发送SOAP消息的时候来调用。"pivot"属性指定一个Handler来作为实际的传输sender,例如HTTPSender。请求和响应流和服务器端的设置相同.

<typeMapping qname="ns:localName" classname="classname" serializer="classname" deserializer="classname"/>

每个typeMapping将一个XML qualified名字和一个Java类进行映射,使用一个序列器和反序列器。

<beanMapping qname="ns:localName" classname="classname">

讲话的类型映射,使用一个预定义的序列器/反序列器来编码/解码JavaBeans。

<documentation>

在<service>, <operation> 或者操作的<parameter>中使用。.是文档说明,生成wsdl的<wsdl:document>元素.

Example:
<operation name="echoString" >
  <documentation>This operation echoes a string</documentation>  <parameter name="param">
     <documentation>a string</documentation>
  </parameter>
</operation> 

全局的Axis配置参数

服务默认的是通过server-config.wsdd文件中的值来进行配置的。但是熟练的Axis用户可以写自己的配置handler,这样就可以将配置数据保存在LDAP服务器,数据库或者远程的web service等等。查看源代码来了解如何实现。也可以在web.xml文件中使自动的获取配置信息。但是Axis不推荐这样使用,因为最好将配置信息放在一个位置。

在server-config文件中,有一个全局配置部分,支持以名/值对的形式作为嵌套元素使用。

<globalConfiguration>

    <parameter name="adminPassword" value="admin"/>

    <parameter name="axis.servicesPath" value="/services/"/>

    <parameter name="attachments.Directory" value="c:\temp\attachments"/>

    <parameter name="sendMultiRefs" value="true"/>

    <parameter name="sendXsiTypes" value="true"/>

    <parameter name="attachments.implementation" value="org.apache.axis.attachments.AttachmentsImpl"/> 

    <parameter name="sendXMLDeclaration" value="true"/>

    <parameter name="enable2DArrayEncoding" value="true"/>

    <parameter name="dotNetSoapEncFix" value="false"/>

</globalConfiguration>



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/oolala/archive/2009/03/08/3967677.aspx

posted @ 2009-09-08 11:31 AntiquMan 阅读(2014) | 评论 (0)编辑 收藏

你觉得自己是一个Java专家吗?是否肯定自己已经全面掌握了Java的异常处理机制?在下面这段代码中,你能够迅速找出异常处理的六个问题吗? 

1 OutputStreamWriter out = ... 
2 java.sql.Connection conn = ... 
3 try { // ⑸ 
4  Statement stat = conn.createStatement(); 
5  ResultSet rs = stat.executeQuery( 
6   "select uid, name from user"); 
7  while (rs.next()) 
8  { 
9   out.println("ID:" + rs.getString("uid") // ⑹ 
10    ",姓名:" + rs.getString("name")); 
11  } 
12  conn.close(); // ⑶ 
13  out.close(); 
14 } 
15 catch(Exception ex) // ⑵ 
16 { 
17  ex.printStackTrace(); //⑴,⑷ 
18 }


  作为一个Java程序员,你至少应该能够找出两个问题。但是,如果你不能找出全部六个问题,请继续阅读本文。 

本文讨论的不是Java异常处理的一般性原则,因为这些原则已经被大多数人熟知。我们要做的是分析各种可称为“反例”(anti-pattern)的违背优秀编码规范的常见坏习惯,帮助读者熟悉这些典型的反面例子,从而能够在实际工作中敏锐地察觉和避免这些问题。 

反例之一:丢弃异常 

代码:15行-18行。 

这段代码捕获了异常却不作任何处理,可以算得上Java编程中的杀手。从问题出现的频繁程度和祸害程度来看,它也许可以和C/C++程序的一个恶名远播的问题相提并论??不检查缓冲区是否已满。如果你看到了这种丢弃(而不是抛出)异常的情况,可以百分之九十九地肯定代码存在问题(在极少数情况下,这段代码有存在的理由,但最好加上完整的注释,以免引起别人误解)。 

这段代码的错误在于,异常(几乎)总是意味着某些事情不对劲了,或者说至少发生了某些不寻常的事情,我们不应该对程序发出的求救信号保持沉默和无动于衷。调用一下printStackTrace算不上“处理异常”。不错,调用printStackTrace对调试程序有帮助,但程序调试阶段结束之后,printStackTrace就不应再在异常处理模块中担负主要责任了。 

丢弃异常的情形非常普遍。打开JDK的ThreadDeath类的文档,可以看到下面这段说明:“特别地,虽然出现ThreadDeath是一种‘正常的情形’,但ThreadDeath类是Error而不是Exception的子类,因为许多应用会捕获所有的Exception然后丢弃它不再理睬。”这段话的意思是,虽然ThreadDeath代表的是一种普通的问题,但鉴于许多应用会试图捕获所有异常然后不予以适当的处理,所以JDK把ThreadDeath定义成了Error的子类,因为Error类代表的是一般的应用不应该去捕获的严重问题。可见,丢弃异常这一坏习惯是如此常见,它甚至已经影响到了Java本身的设计。 

那么,应该怎样改正呢?主要有四个选择: 

1、处理异常。针对该异常采取一些行动,例如修正问题、提醒某个人或进行其他一些处理,要根据具体的情形确定应该采取的动作。再次说明,调用printStackTrace算不上已经“处理好了异常”。 

2、重新抛出异常。处理异常的代码在分析异常之后,认为自己不能处理它,重新抛出异常也不失为一种选择。 

3、把该异常转换成另一种异常。大多数情况下,这是指把一个低级的异常转换成应用级的异常(其含义更容易被用户了解的异常)。 

4、不要捕获异常。 

结论一:既然捕获了异常,就要对它进行适当的处理。不要捕获异常之后又把它丢弃,不予理睬。 

反例之二:不指定具体的异常 

代码:15行。 

许多时候人们会被这样一种“美妙的”想法吸引:用一个catch语句捕获所有的异常。最常见的情形就是使用catch(Exception ex)语句。但实际上,在绝大多数情况下,这种做法不值得提倡。为什么呢? 

要理解其原因,我们必须回顾一下catch语句的用途。catch语句表示我们预期会出现某种异常,而且希望能够处理该异常。异常类的作用就是告诉Java编译器我们想要处理的是哪一种异常。由于绝大多数异常都直接或间接从java.lang.Exception派生,catch(Exception ex)就相当于说我们想要处理几乎所有的异常。 

再来看看前面的代码例子。我们真正想要捕获的异常是什么呢?最明显的一个是SQLException,这是JDBC操作中常见的异常。另一个可能的异常是IOException,因为它要操作OutputStreamWriter。显然,在同一个catch块中处理这两种截然不同的异常是不合适的。如果用两个catch块分别捕获SQLException和IOException就要好多了。这就是说,catch语句应当尽量指定具体的异常类型,而不应该指定涵盖范围太广的Exception类。 

另一方面,除了这两个特定的异常,还有其他许多异常也可能出现。例如,如果由于某种原因,executeQuery返回了null,该怎么办?答案是让它们继续抛出,即不必捕获也不必处理。实际上,我们不能也不应该去捕获可能出现的所有异常,程序的其他地方还有捕获异常的机会??直至最后由JVM处理。 

结论二:在catch语句中尽可能指定具体的异常类型,必要时使用多个catch。不要试图处理所有可能出现的异常。 

反例之三:占用资源不释放 

代码:3行-14行。 

异常改变了程序正常的执行流程。这个道理虽然简单,却常常被人们忽视。如果程序用到了文件、Socket、JDBC连接之类的资源,即使遇到了异常,也要正确释放占用的资源。为此,Java提供了一个简化这类操作的关键词finally。 

finally是样好东西:不管是否出现了异常,Finally保证在try/catch/finally块结束之前,执行清理任务的代码总是有机会执行。遗憾的是有些人却不习惯使用finally。 

当然,编写finally块应当多加小心,特别是要注意在finally块之内抛出的异常??这是执行清理任务的最后机会,尽量不要再有难以处理的错误。 

结论三:保证所有资源都被正确释放。充分运用finally关键词。

反例之四:不说明异常的详细信息 

  代码:3行-18行。 

仔细观察这段代码:如果循环内部出现了异常,会发生什么事情?我们可以得到足够的信息判断循环内部出错的原因吗?不能。我们只能知道当前正在处理的类发生了某种错误,但却不能获得任何信息判断导致当前错误的原因。 

printStackTrace的堆栈跟踪功能显示出程序运行到当前类的执行流程,但只提供了一些最基本的信息,未能说明实际导致错误的原因,同时也不易解读。 

因此,在出现异常时,最好能够提供一些文字信息,例如当前正在执行的类、方法和其他状态信息,包括以一种更适合阅读的方式整理和组织printStackTrace提供的信息。 

结论四:在异常处理模块中提供适量的错误原因信息,组织错误信息使其易于理解和阅读。 

反例之五:过于庞大的try块 

代码:3行-14行。 

经常可以看到有人把大量的代码放入单个try块,实际上这不是好习惯。这种现象之所以常见,原因就在于有些人图省事,不愿花时间分析一大块代码中哪几行代码会抛出异常、异常的具体类型是什么。把大量的语句装入单个巨大的try块就象是出门旅游时把所有日常用品塞入一个大箱子,虽然东西是带上了,但要找出来可不容易。 

一些新手常常把大量的代码放入单个try块,然后再在catch语句中声明Exception,而不是分离各个可能出现异常的段落并分别捕获其异常。这种做法为分析程序抛出异常的原因带来了困难,因为一大段代码中有太多的地方可能抛出Exception。 

结论五:尽量减小try块的体积。 

反例之六:输出数据不完整 

代码:7行-11行。 

不完整的数据是Java程序的隐形杀手。仔细观察这段代码,考虑一下如果循环的中间抛出了异常,会发生什么事情。循环的执行当然是要被打断的,其次,catch块会执行??就这些,再也没有其他动作了。已经输出的数据怎么办?使用这些数据的人或设备将收到一份不完整的(因而也是错误的)数据,却得不到任何有关这份数据是否完整的提示。对于有些系统来说,数据不完整可能比系统停止运行带来更大的损失。 

较为理想的处置办法是向输出设备写一些信息,声明数据的不完整性;另一种可能有效的办法是,先缓冲要输出的数据,准备好全部数据之后再一次性输出。 

结论六:全面考虑可能出现的异常以及这些异常对执行流程的影响。 

改写后的代码 

根据上面的讨论,下面给出改写后的代码。也许有人会说它稍微有点?嗦,但是它有了比较完备的异常处理机制。 

OutputStreamWriter out = ... 
java.sql.Connection conn = ... 
try { 
Statement stat = conn.createStatement(); 
ResultSet rs = stat.executeQuery( 
"select uid, name from user"); 
while (rs.next()) 

out.println("ID:" + rs.getString("uid") + ",姓名: " + rs.getString("name")); 


catch(SQLException sqlex) 

out.println("警告:数据不完整"); 
throw new ApplicationException("读取数据时出现SQL错误", sqlex); 

catch(IOException ioex) 

throw new ApplicationException("写入数据时出现IO错误", ioex); 

finally 

if (conn != null) { 
try { 
conn.close(); 

catch(SQLException sqlex2) 

System.err(this.getClass().getName() + ".mymethod - 不能关闭数据库连接: " + sqlex2.toString()); 



if (out != null) { 
try { 
out.close(); 

catch(IOException ioex2) 

System.err(this.getClass().getName() + ".mymethod - 不能关闭输出文件" + ioex2.toString()); 


}

  本文的结论不是放之四海皆准的教条,有时常识和经验才是最好的老师。如果你对自己的做法没有百分之百的信心,务必加上详细、全面的注释。 

另一方面,不要笑话这些错误,不妨问问你自己是否真地彻底摆脱了这些坏习惯。即使最有经验的程序员偶尔也会误入歧途,原因很简单,因为它们确确实实带来了“方便”。所有这些反例都可以看作Java编程世界的恶魔,它们美丽动人,无孔不入,时刻诱惑着你。也许有人会认为这些都属于鸡皮蒜毛的小事,不足挂齿,但请记住:勿以恶小而为之,勿以善小而不为。






------------------------------------------------------------------下面是一些java异常集-------------------------------------------------------------------------------------------

算术异常类:ArithmeticExecption

空指针异常类:NullPointerException

类型强制转换异常:ClassCastException

数组负下标异常:NegativeArrayException

数组下标越界异常:ArrayIndexOutOfBoundsException

违背安全原则异常:SecturityException

文件已结束异常:EOFException

文件未找到异常:FileNotFoundException

字符串转换为数字异常:NumberFormatException


操作数据库异常:SQLException


输入输出异常:IOException


方法未找到异常:NoSuchMethodException

java.lang.AbstractMethodError

抽象方法错误。当应用试图调用抽象方法时抛出。

java.lang.AssertionError

断言错。用来指示一个断言失败的情况。

java.lang.ClassCircularityError

类循环依赖错误。在初始化一个类时,若检测到类之间循环依赖则抛出该异常。

java.lang.ClassFormatError

类格式错误。当Java虚拟机试图从一个文件中读取Java类,而检测到该文件的内容不符合类的有效格式时抛出。

java.lang.Error

错误。是所有错误的基类,用于标识严重的程序运行问题。这些问题通常描述一些不应被应用程序捕获的反常情况。

java.lang.ExceptionInInitializerError

初始化程序错误。当执行一个类的静态初始化程序的过程中,发生了异常时抛出。静态初始化程序是指直接包含于类中的static语句段。

java.lang.IllegalAccessError

违法访问错误。当一个应用试图访问、修改某个类的域(Field)或者调用其方法,但是又违反域或方法的可见性声明,则抛出该异常。

java.lang.IncompatibleClassChangeError

不兼容的类变化错误。当正在执行的方法所依赖的类定义发生了不兼容的改变时,抛出该异常。一般在修改了应用中的某些类的声明定义而没有对整个应用重新编译而直接运行的情况下,容易引发该错误。

java.lang.InstantiationError

实例化错误。当一个应用试图通过Java的new操作符构造一个抽象类或者接口时抛出该异常.

java.lang.InternalError

内部错误。用于指示Java虚拟机发生了内部错误。

java.lang.LinkageError

链接错误。该错误及其所有子类指示某个类依赖于另外一些类,在该类编译之后,被依赖的类改变了其类定义而没有重新编译所有的类,进而引发错误的情况。

java.lang.NoClassDefFoundError

未找到类定义错误。当Java虚拟机或者类装载器试图实例化某个类,而找不到该类的定义时抛出该错误。

java.lang.NoSuchFieldError

域不存在错误。当应用试图访问或者修改某类的某个域,而该类的定义中没有该域的定义时抛出该错误。

java.lang.NoSuchMethodError

方法不存在错误。当应用试图调用某类的某个方法,而该类的定义中没有该方法的定义时抛出该错误。

java.lang.OutOfMemoryError

内存不足错误。当可用内存不足以让Java虚拟机分配给一个对象时抛出该错误。

java.lang.StackOverflowError

堆栈溢出错误。当一个应用递归调用的层次太深而导致堆栈溢出时抛出该错误。

java.lang.ThreadDeath

线程结束。当调用Thread类的stop方法时抛出该错误,用于指示线程结束。

java.lang.UnknownError

未知错误。用于指示Java虚拟机发生了未知严重错误的情况。

java.lang.UnsatisfiedLinkError

未满足的链接错误。当Java虚拟机未找到某个类的声明为native方法的本机语言定义时抛出。

java.lang.UnsupportedClassVersionError

不支持的类版本错误。当Java虚拟机试图从读取某个类文件,但是发现该文件的主、次版本号不被当前Java虚拟机支持的时候,抛出该错误。

java.lang.VerifyError

验证错误。当验证器检测到某个类文件中存在内部不兼容或者安全问题时抛出该错误。

java.lang.VirtualMachineError

虚拟机错误。用于指示虚拟机被破坏或者继续执行操作所需的资源不足的情况。


java.lang.ArithmeticException

算术条件异常。譬如:整数除零等。

java.lang.ArrayIndexOutOfBoundsException

数组索引越界异常。当对数组的索引值为负数或大于等于数组大小时抛出。

java.lang.ArrayStoreException

数组存储异常。当向数组中存放非数组声明类型对象时抛出。

java.lang.ClassCastException

类造型异常。假设有类A和B(A不是B的父类或子类),O是A的实例,那么当强制将O构造为类B的实例时抛出该异常。该异常经常被称为强制类型转换异常。

java.lang.ClassNotFoundException

找不到类异常。当应用试图根据字符串形式的类名构造类,而在遍历CLASSPAH之后找不到对应名称的class文件时,抛出该异常。

java.lang.CloneNotSupportedException

不支持克隆异常。当没有实现Cloneable接口或者不支持克隆方法时,调用其clone()方法则抛出该异常。

java.lang.EnumConstantNotPresentException

枚举常量不存在异常。当应用试图通过名称和枚举类型访问一个枚举对象,但该枚举对象并不包含常量时,抛出该异常。

java.lang.Exception

根异常。用以描述应用程序希望捕获的情况。

java.lang.IllegalAccessException

违法的访问异常。当应用试图通过反射方式创建某个类的实例、访问该类属性、调用该类方法,而当时又无法访问类的、属性的、方法的或构造方法的定义时抛出该异常。

java.lang.IllegalMonitorStateException

违法的监控状态异常。当某个线程试图等待一个自己并不拥有的对象(O)的监控器或者通知其他线程等待该对象(O)的监控器时,抛出该异常。

java.lang.IllegalStateException

违法的状态异常。当在Java环境和应用尚未处于某个方法的合法调用状态,而调用了该方法时,抛出该异常。

java.lang.IllegalThreadStateException

违法的线程状态异常。当县城尚未处于某个方法的合法调用状态,而调用了该方法时,抛出异常。

java.lang.IndexOutOfBoundsException

索引越界异常。当访问某个序列的索引值小于0或大于等于序列大小时,抛出该异常。

java.lang.InstantiationException

实例化异常。当试图通过newInstance()方法创建某个类的实例,而该类是一个抽象类或接口时,抛出该异常。

java.lang.InterruptedException

被中止异常。当某个线程处于长时间的等待、休眠或其他暂停状态,而此时其他的线程通过Thread的interrupt方法终止该线程时抛出该异常。

java.lang.NegativeArraySizeException

数组大小为负值异常。当使用负数大小值创建数组时抛出该异常。

java.lang.NoSuchFieldException

属性不存在异常。当访问某个类的不存在的属性时抛出该异常。

java.lang.NoSuchMethodException

方法不存在异常。当访问某个类的不存在的方法时抛出该异常。

java.lang.NullPointerException

空指针异常。当应用试图在要求使用对象的地方使用了null时,抛出该异常。譬如:调用null对象的实例方法、访问null对象的属性、计算null对象的长度、使用throw语句抛出null等等。

java.lang.NumberFormatException

数字格式异常。当试图将一个String转换为指定的数字类型,而该字符串确不满足数字类型要求的格式时,抛出该异常。

java.lang.RuntimeException

运行时异常。是所有Java虚拟机正常操作期间可以被抛出的异常的父类。

java.lang.SecurityException

安全异常。由安全管理器抛出,用于指示违反安全情况的异常。

java.lang.StringIndexOutOfBoundsException

字符串索引越界异常。当使用索引值访问某个字符串中的字符,而该索引值小于0或大于等于序列大小时,抛出该异常。

java.lang.TypeNotPresentException

类型不存在异常。当应用试图以某个类型名称的字符串表达方式访问该类型,但是根据给定的名称又找不到该类型是抛出该异常。该异常与ClassNotFoundException的区别在于该异常是unchecked(不被检查)异常,而ClassNotFoundException是checked(被检查)异常。

java.lang.UnsupportedOperationException

不支持的方法异常。指明请求的方法不被支持情况的异常。

异常
javax.servlet.jsp.JspException: Cannot retrieve mapping for action /Login (/Login是你的action名字)  

可能原因
action没有再struts-config.xml 中定义,或没有找到匹配的action,例如在JSP文件中使用 <html:form action="Login.do".将表单提交给Login.do处理,如果出现上述异常,请查看struts-config.xml中的定义部分,有时可能是打错了字符或者是某些不符合规则,可以使用strutsconsole工具来检查。
-----------------------------------------------------------------------------------------------------------------
异常
org.apache.jasper.JasperException: Cannot retrieve definition for form bean null

可能原因      
       
这个异常是因为Struts根据struts-config.xml中的mapping没有找到action期望的form bean。大部分的情况可能是因为在form-bean中设置的name属性和action中设置的name属性不匹配所致。换句话说,action和form都应该各自有一个name属性,并且要精确匹配,包括大小写。这个错误当没有name属性和action关联时也会发生,如果没有在action中指定name属性,那么就没有name属性和action相关联。当然当action制作某些控制时,譬如根据参数值跳转到相应的jsp页面,而不是处理表单数据,这是就不用name属性,这也是action的使用方法之一。
-----------------------------------------------------------------------------------------------------------------
异常
No action instance for path /xxxx could be created

可能原因
特别提示:因为有很多中情况会导致这个错误的发生,所以推荐大家调高你的web服务器的日志/调试级别,这样可以从更多的信息中看到潜在的、在试图创建action类时发生的错误,这个action类你已经在struts-config.xml中设置了关联(即添加了<action>标签)。

在struts-config.xml中通过action标签的class属性指定的action类不能被找到有很多种原因,例如:定位编译后的.class文件失败。Failure to place compiled .class file for the action in the classpath (在web开发中,class的的位置在r WEB-INF/classes,所以你的action class必须要在这个目录下。例如你的action类位于WEB-INF/classes/action/Login.class,那么在struts-config.xml中设置action的属性type时就是action.Login).
拼写错误,这个也时有发生,并且不易找到,特别注意第一个字母的大小写和包的名称。 
-----------------------------------------------------------------------------------------------------------------
异常
javax.servlet.jsp.JspException: No getter method for property username of bean org.apache.struts.taglib.html.BEAN

可能原因
没有位form bean中的某个变量定义getter 方法

这个错误主要发生在表单提交的FormBean中,用struts标记<html:text property=”username”>时,在FormBean中必须有一个getUsername()方法。注意字母“U”。
-----------------------------------------------------------------------------------------------------------------
异常
java.lang.NoClassDefFoundError: org/apache/struts/action/ActionForm

可能原因
这个错误主要发生在在classpath中找不到相应的Java .class文件。如果这个错误发生在web应用程序的运行时,主要是因为指定的class文件不在web server的classpath中(/WEB-INF/classes 和 /WEB-INF/lib)。在上面的错误中,原因是找不到ActionForm类。
-----------------------------------------------------------------------------------------------------------------
异常
javax.servlet.jsp.JspException: Exception creating bean of class org.apache.struts.action.ActionForm: {1}

可能原因
Instantiating Struts-provided ActionForm class directly instead of instantiating a class derived off ActionForm. This mightoccur implicitly if you specify that a form-bean is this Struts ActionForm class rather than specifying a child of this classfor the form-bean.

Not associating an ActionForm-descended class with an action can also lead to this error.
-----------------------------------------------------------------------------------------------------------------
异常
javax.servlet.jsp.JspException: Cannot find ActionMappings or ActionFormBeans collection

可能原因
不是标识Struts actionServlet的<servlet>标记就是映射.do扩展名的<sevlet-mapping>标记或者两者都没有在web.xml中声明。

在struts-config.xml中的打字或者拼写错误也可导致这个异常的发生。例如缺少一个标记的关闭符号/>。最好使用struts console工具检查一下。

另外,load-on-startup必须在web.xml中声明,这要么是一个空标记,要么指定一个数值,这个数值用来表servlet运行的优先级,数值越大优先级越低。

还有一个和使用load-on-startup有关的是使用Struts预编译JSP文件时也可能导致这个异常。
-----------------------------------------------------------------------------------------------------------------
异常
java.lang.NullPointerException at org.apache.struts.util.RequestUtils.forwardURL(RequestUtils.java:1223)

可能原因
在struts-config.xml中的forward元素缺少path属性。例如应该是如下形式:
<forward name="userhome" path="/user/userhome.jsp"/>
-----------------------------------------------------------------------------------------------------------------
异常
javax.servlet.jsp.JspException: Cannot find bean org.apache.struts.taglib.html.BEAN in any scope

Probable Causes
试图在Struts的form标记外使用form的子元素。这常常发生在你在</html:form>后面使用Struts的html标记。另外要注意可能你不经意使用的无主体的标记,如<html:form … />,这样web 服务器解析时就当作一个无主体的标记,随后使用的所有<html>标记都被认为是在这个标记之外的,如又使用了<html:text property=”id”>还有就是在使用taglib引入HTML标记库时,你使用的prefix的值不是html。
-----------------------------------------------------------------------------------------------------------------
异常
javax.servlet.jsp.JspException: Missing message for key xx.xx.xx

Probable Causes
这个key的值对没有在资源文件ApplicationResources.properties中定义。如果你使用eclipse时经常碰到这样的情况,当项目重新编译时,eclipse会自动将classes目录下的资源文件删除。

资源文件ApplicationResources.properties 不在classpath中应将资源文件放到 WEB-INF/classes 目录下,当然要在struts-config.xml中定义)
-----------------------------------------------------------------------------------------------------------------
异常
Cannot find message resources under key org.apache.struts.action.MESSAGE

可能原因
很显然,这个错误是发生在使用资源文件时,而Struts没有找到资源文件。

Implicitly trying to use message resources that are not available (such as using empty html:options tag instead of specifyingthe options in its body -- this assumes options are specified in ApplicationResources.properties file)

XML parser issues -- too many, too few, incorrect/incompatible versions
-----------------------------------------------------------------------------------------------------------------
异常
Strange and seemingly random characters in HTML and on screen, but not in original JSP or servlet.

可能原因
混和使用Struts的html:form标记和标准的HTML标记不正确。

使用的编码样式在本页中不支持。
-----------------------------------------------------------------------------------------------------------------
异常
"Document contained no data" in Netscape

No data rendered (completely empty) page in Microsoft Internet Explorer

可能原因
使用一个Action的派生类而没有实现perform()方法或execute()方法。在Struts1.0中实现的是perform()方法,在Struts1.1中实现的是execute()方法,但Struts1.1向后兼容perform()方法。但你使用Struts1.1创建一个Action的派生类,并且实现了execute()方法,而你在Struts1.0中运行的话,就会得到"Document contained nodata" error message in Netscape or a completely empty (no HTML whatsoever) page rendered in Microsoft Internet Explorer.”的错误信息。

---------------------------------------------------------------------------------------------------------------------------
异常
ServletException: BeanUtils.populate
解决方案
在用Struts上传文件时,遇到了javax.servlet.ServletException: BeanUtils.populate异常。
我的ActionServlet并没有用到BeanUtils这些工具类。后来仔细检查代码发现是在jsp文件里的form忘了加enctype=&quot;multipart/form-data&quot; 了。所以写程序遇到错误或异常应该从多方面考虑问题存在的可能性,想到系统提示信息以外的东西。
----------------------------------------------------------------------------------------------------------------------------
1. 定义Action后, 如果指定了name, 那么必须要定义一个与它同名的FormBean才能进行form映射.2. 如果定义Action后, 提交页面时出现 "No input attribute for mapping path..." 错误, 则需要在其input属性中定义转向的页面.3. 如果插入新的数据时出现 "Batch update row count wrong:..." 错误, 则说明XXX.hbm.xml中指定的key的类型为原始类型(int, long),因为这种类型会自动分配值, 而这个值往往会让系统认为已经存在该记录, 正确的方法是使用java.lang.Integer或java.lang.Long对象.4. 如果插入数据时出现 "argument type mismatch" 错误, 可能是你使用了Date等特殊对象, 因为struts不能自动从String型转换成Date型,所以, 你需要在Action中手动把String型转换成Date型.5. Hibernate中, Query的iterator()比list()方法快很多.6. 如果出现 "equal symbol expected" 错误, 说明你的strtus标签中包含另一个标签或者变量, 例如:
<html:select property="test" onchange="<%=test%>"/>
或者
<html:hidden property="test" value="<bean:write name="t" property="p"/>"/>
这样的情况... 
---------------------------------------------------------------------------------------------------------------------------
错误:Exception in thread "main" org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update原因与解决:      因为Hibernate Tools(或者Eclipse本身的Database Explorer)生成*.hbn.xml工具中包含有catalog="***"(*表示数据库名称)这样的属性,将该属性删除就可以了
---------------------------------------------------------------------------------------------------------------------------
错误:org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations)
原因与解决:
方法1 删除Set方的cascade
方法2 解决关联关系后,再删除
方法3 在many-to-one方增加cascade 但值不能是none
最后一招:
检查一下hashCode equals是否使用了id作为唯一标示的选项了;我用uuid.hex时是没有问题的;但是用了native,就不行了,怎么办?删除啊!
----------------------------------------------------------------------------------------------------------------------------
问题:今天用Tomcat 5.5.12,发现原来很好用的系统不能用了,反复测试发现页面中不能包含 taglib,否则会出现以下提示:HTTP Status 500 -type Exception reportMessage description The server encountered an internal error () that prevented it from fulfilling this request.exceptionorg.apache.jasper.JasperException: /index.jsp(1,1) Unable to read TLD "META-INF/tlds/struts-bean.tld" from JAR file"file:*****/WEB-INF/lib/struts.jar":原因:更新了工程用的lib文件夹下的jar,发布时也发布了servlet.jar和jsp-api.jar。解决:把jsp-api.jar删除就解决这个问题了。-----------------------------------------------------------------------------------------------------------------------------
错误: java.lang.NullPointerException
原因: 发现 dao 实例、 manage 实例等需要注入的东西没有被注入(俗称空指针异常)解决:这个时候,你应该查看日志文件;默认是应用服务器的 log 文件,比如 Tomcat 就是 [Tomcat 安装目录 ]/logs ;你会发现提示你:可能是:org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sf' defined in ServletContextresource [/WEB-INF/applicationContext.xml]: Initialization of bean failed; nested exception isorg.hibernate.HibernateException: could not configure from URL: file:src/hibernate.cfg.xmlorg.hibernate.HibernateException: could not configure from URL: file:src/hibernate.cfg.xml……………………….Caused by: java.io.FileNotFoundException: src\hibernate.cfg.xml可能是:org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined inServletContext resource [/WEB-INF/applicationContext.xml]: Initialization of bean failed; nested exception isorg.hibernate.MappingException: Resource: com/mcc/coupon/model/UserRole.hbm.xml not foundorg.hibernate.MappingException: Resource: com/mcc/coupon/model/UserRole.hbm.xml not found然后你就知道原因是因为配置文件的解析出了错误,这个通过 Web 页面是看不出来的。更多的是持久化影射文件出的错误;导致了没有被解析;当然你需要的功能就无法使用了。
----------------------------------------------------------------------------------------------------------------------------
错误:StandardWrapperValve[action]: Servlet.service() for servlet action threw exception
javax.servlet.jsp.JspException: Cannot retrieve mapping for action /settlementTypeManage
或者:      type Status report      message Servlet action is not available      description The requested resource (Servlet action is not available) is not available.
原因: 同 上
----------------------------------------------------------------------------------------------------------------------------
错误StandardWrapperValve[jsp]: Servlet.service() for servlet jsp threw exceptionjava.lang.ClassNotFoundException: org.apache.struts.taglib.bean.CookieTei界面错误具体描述:
org.apache.jasper.JasperException: Failed to load or instantiate TagExtraInfo class: org.apache.struts.taglib.bean.CookieTei
      原因与解决:    <方案一>你的“html:”开头的标签没有放在一个<html:form>中       <方案二>重新启动你的应用服务器,自动就没有这个问题

posted @ 2009-08-10 10:32 AntiquMan 阅读(443) | 评论 (1)编辑 收藏

     1.JDK.这个不必说(我的是1.6.0_03)
2.改变安装文件权限。在终端中用cd命令把当前目录转移到jdk-6u3--i586-rpm.bin所在目录,用ls -l命令查看文件权限,如果是可执行x(eXecute)则不需要更改,否则用命令 chmod 755 jdk-6u3--i586-rpm.bin,使自解压包文件可执行
3.安装。在终端输入。/jdk-6u3-Linux-i586-rpm.bin,按提示一步步执行即可。
4.更改环境变量。刚才安装的版本默认在/usr/Java/jdk1.6.0_03,我们把它加到环境变量。用cd命令转移到etc目录,输入gedit profile,在profile在后三行
#
# End of /etc/profile
#
上面添加如下文本:
export JAVA_HOME=/usr/java/jdk1.6.0_03
export CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
export JRE_HOME=$JAVA_HOME/jre
5.重新启动系统,在终端输入java -version,显示内容:
java version "1.6.0_03"
(TM) SE Runtime Environment (build 1.6.0_03-b05)
HotSpot(TM) Client VM (build 1.6.0_03-b05, mixed mode, sharing)
说明环境变量设置成功。

posted @ 2009-08-10 10:22 AntiquMan 阅读(179) | 评论 (0)编辑 收藏

基本演示了线程池和队列的应用

  public class WorkQueue { 
   

   private final int nThreads;//线程池的大小 
   private final PoolWorker[] threads;//用数组实现线程池 
   private final LinkedList queue;//任务队列 

  public WorkQueue(int nThreads){ 
     this.nThreads = nThreads; 
     queue = new LinkedList(); 
     threads = new PoolWorker[nThreads]; 

      for (int i=0; i<nThreads;i++){

         threads[i] = new PoolWorker(); 
         threads[i].start();//启动所有工作线程 
      } 
  } 

  public void execute(Runnable r) {//
任务 
    synchronized(queue) { 
            queue.addLast(r); 
            queue.notify(); 
    } 
  } 

  private class PoolWorker extends Thread {//工作线程类 
        public void run() { 
               Runnable r; 
               while (true) { 
                    synchronized(queue) { 
                      while (queue.isEmpty()) {//如果任务队列中没有任务,等待 
                        try{ 
                          queue.wait(); 
                        }catch (InterruptedException ignored){} 
                      }    
                       r = (Runnable) queue.removeFirst();//有任务时,取出任务 
                   } 
                   try { 
                       r.run();//执行任务 
                   }catch (RuntimeException e) { 
                      // You might want to log something here 
                  } 
              } 
      } 
   } 


 public static void main(String args[]){ 
      WorkQueue wq=new WorkQueue(10);//10个工作线程 
      Mytask r[]=new Mytask[20];//20个任务 
   
      for(int i=0;i<20;i++){ 
           r[i]=new Mytask(); 
           wq.execute(r[i]); 
      }       
 } 

class Mytask implements Runnable{//任务接口 
         public void run(){ 
              String name=Thread.currentThread().getName(); 
              try{ 
                  Thread.sleep(100);//模拟任务执行的时间 
              }catch(InterruptedException e){} 
              System.out.println(name+" executed OK"); 
         } 
  } 

posted @ 2009-08-03 18:18 AntiquMan 阅读(195) | 评论 (0)编辑 收藏

上周在优化预警分析的工作中,发现由于分页功能需要提供总条数 ,项目组内的普遍做法是进行两次sql查询,一次用count(*)获得总条数,一次获取真正的展现数据。其实oracle提供了olap函数对此进行优化,可通过伪列:count(*) over()获得当前sql的总条数。

    比如:select t.*,count(*) over() from dual 会返回总条数为1。
 
    olap函数主要用于统计分析,熟练掌握能很好的提高sql执行效率。
        count(*) over() 具体功能描述如下:
       对一组内发生的事情进行累积计数,如果指定*或一些非空常数,count将对所有行计数,如果指定一个表达式,count返回表达式非空赋值的计数,当有相同值出现时,这些相等的值都会被纳入被计算的值;可以使用DISTINCT来记录去掉一组中完全相同的数据后出现的行数。
SAMPLE:下面例子中计算每个员工在按薪水排序中当前行附近薪水在[n-50,n+150]之间的行数,n表示当前行的薪水
       例如,Philtanker的薪水2200,排在他之前的行中薪水大于等于2200-50的有1行,排在他之后的行中薪水小于等于2200+150的行没有,所以count计数值cnt3为2(包括自己当前行);cnt2值相当于小于等于当前行的SALARY值的所有行数
sql如下:

 SELECT last_name, salary, COUNT(*) OVER () AS cnt1,
           COUNT(*) OVER (ORDER BY salary) AS cnt2,
           COUNT(*) OVER (ORDER BY salary RANGE BETWEEN 50 PRECEDING AND 150 FOLLOWING) AS cnt3 FROM employees;

结果如下 :

LAST_NAME  SALARY  CNT2   CNT2  CNT3
Olson          2100 107 1 3
Markle 2200 107 3 2
Philtanker 2200 107 3 2
Landry 2400 107 5 8
Gee 2400 107 5 8
Colmenares 2500 107 11 10
Patel 2500 107 10 10

posted @ 2009-08-03 18:11 AntiquMan 阅读(314) | 评论 (0)编辑 收藏

Code
 
01.//Copyright © 2009. Http://L4cd.Net All Rights Reserved.
02.package net.L4cd.display
03.{
04.    import flash.events.Event;
05.    import flash.events.TextEvent;
06.    import flash.text.TextField;
07.    import flash.utils.ByteArray;
08.  
09.    /**
10.     * 扩展TextField类,中文以2字符长度计算
11.     *
12.     * @author L4cd.Net
13.     * @playerversion Flash player 9
14.     * @langversion 3.0
15.     * @version 2009-06-16
16.     */
17.    public class TextFieldExt extends TextField
18.    {
19.        private var _maxChars:int = -1;
20.        public function TextFieldExt()
21.        {
22.            super();
23.              
24.        }
25.        override public function get maxChars():int
26.        {
27.            return _maxChars;
28.        }
29.        override public function set maxChars(value:int):void
30.        {
31.            _maxChars = value;
32.            if(maxChars<0)
33.            {
34.                removeEventListener(TextEvent.TEXT_INPUT,input);      
35.            }else
36.            {
37.                addEventListener(TextEvent.TEXT_INPUT,input);
38.                text = getTextByCharLength(text,maxChars);
39.            }
40.        }
41.        override public function get length():int
42.        {
43.            return getCharLength(text);
44.        }
45.        private function input(e:TextEvent):void
46.        {
47.            //拦截并阻止textinput事件,手动处理内容输入
48.            var textField:TextField = e.currentTarget as TextField;
49.            var temp:String = getTextByCharLength(e.text,maxChars - getCharLength(text) + getCharLength(selectedText));
50.            var index:int = selectionBeginIndex;
51.            replaceText(selectionBeginIndex,selectionEndIndex,temp);
52.            setSelection(index+temp.length,index+temp.length);
53.            dispatchEvent(new Event(Event.CHANGE,true));
54.            e.preventDefault();
55.        }
56.        /**
57.         * 获取字符长度,一个中文算2长度
58.         * @param txt
59.         * @return 返回长度值
60.         */    
61.        private function getCharLength(txt:String):int
62.        {
63.            var byte:ByteArray = new ByteArray();
64.            byte.writeMultiByte(txt,"gb2312");
65.            byte.position = 0;
66.            return byte.bytesAvailable;
67.        }
68.        /**
69.         * 截取指定长度的文本内容,一个中文算2长度
70.         * @param txt 需要截取的文本
71.         * @param length 需要截取的长度
72.         * @return 截取后的内容
73.         */    
74.        private function getTextByCharLength(txt:String,length:int):String
75.        {
76.            if(length<1)return "";
77.            var byte:ByteArray = new ByteArray();
78.            byte.writeMultiByte(txt,"gb2312");
79.            byte.position = 0;
80.            return byte.readMultiByte(Math.min(length,byte.bytesAvailable),"gb2312");
81.        }
82.    }
83.}




调用方法和普通TextField无异
1.import net.L4cd.display.TextFieldExt
2.var ext:TextFieldExt = new TextFieldExt();
3.ext.maxChars = 15;
4.addChild(ext);





一般的输入,粘贴等操作均没问题..
直接对text进行赋值没有进行限制 (原来的TextField也没限制)..
如需限制~可以调用一次maxChars = maxChars即可..

posted @ 2009-07-03 14:47 AntiquMan 阅读(507) | 评论 (0)编辑 收藏

一、同步问题提出
 
线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏。
例如:两个线程ThreadA、ThreadB都操作同一个对象Foo对象,并修改Foo对象上的数据。
 
public class Foo {
    private int x = 100;

    public int getX() {
        return x;
    }

    public int fix(int y) {
        x = x - y;
        return x;
    }
}
 
public class MyRunnable implements Runnable {
    private Foo foo = new Foo();

    public static void main(String[] args) {
        MyRunnable r = new MyRunnable();
        Thread ta = new Thread(r, "Thread-A");
        Thread tb = new Thread(r, "Thread-B");
        ta.start();
        tb.start();
    }

    public void run() {
        for (int i = 0; i < 3; i++) {
            this.fix(30);
            try {
                Thread.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + " : 当前foo对象的x值= " + foo.getX());
        }
    }

    public int fix(int y) {
        return foo.fix(y);
    }
}
 
运行结果:
Thread-A : 当前foo对象的x值= 40
Thread-B : 当前foo对象的x值= 40
Thread-B : 当前foo对象的x值= -20
Thread-A : 当前foo对象的x值= -50
Thread-A : 当前foo对象的x值= -80
Thread-B : 当前foo对象的x值= -80

Process finished with exit code 0
 
从结果发现,这样的输出值明显是不合理的。原因是两个线程不加控制的访问Foo对象并修改其数据所致。
 
如果要保持结果的合理性,只需要达到一个目的,就是将对Foo的访问加以限制,每次只能有一个线程在访问。这样就能保证Foo对象中数据的合理性了。
 
在具体的Java代码中需要完成一下两个操作:
把竞争访问的资源类Foo变量x标识为private;
同步哪些修改变量的代码,使用synchronized关键字同步方法或代码。
 
二、同步和锁定
 
1、锁的原理
 
Java中每个对象都有一个内置锁
 
当程序运行到非静态的synchronized同步方法上时,自动获得与正在执行代码类的当前实例(this实例)有关的锁。获得一个对象的锁也称为获取锁、锁定对象、在对象上锁定或在对象上同步。
 
当程序运行到synchronized同步方法或代码块时才该对象锁才起作用。
 
一个对象只有一个锁。所以,如果一个线程获得该锁,就没有其他线程可以获得锁,直到第一个线程释放(或返回)锁。这也意味着任何其他线程都不能进入该对象上的synchronized方法或代码块,直到该锁被释放。
 
释放锁是指持锁线程退出了synchronized同步方法或代码块。
 
关于锁和同步,有一下几个要点:
1)、只能同步方法,而不能同步变量和类;
2)、每个对象只有一个锁;当提到同步时,应该清楚在什么上同步?也就是说,在哪个对象上同步?
3)、不必同步类中所有的方法,类可以同时拥有同步和非同步方法。
4)、如果两个线程要执行一个类中的synchronized方法,并且两个线程使用相同的实例来调用方法,那么一次只能有一个线程能够执行方法,另一个需要等待,直到锁被释放。也就是说:如果一个线程在对象上获得一个锁,就没有任何其他线程可以进入(该对象的)类中的任何一个同步方法。
5)、如果线程拥有同步和非同步方法,则非同步方法可以被多个线程自由访问而不受锁的限制。

6)、线程睡眠时,它所持的任何锁都不会释放。

7)、线程可以获得多个锁。比如,在一个对象的同步方法里面调用另外一个对象的同步方法,则获取了两个对象的同步锁。
8)、同步损害并发性,应该尽可能缩小同步范围。同步不但可以同步整个方法,还可以同步方法中一部分代码块。
9)、在使用同步代码块时候,应该指定在哪个对象上同步,也就是说要获取哪个对象的锁。例如:
    public int fix(int y) {
        synchronized (this) {
            x = x - y;
        }
        return x;
    }
 
当然,同步方法也可以改写为非同步方法,但功能完全一样的,例如:
    public synchronized int getX() {
        return x++;
    }
    public int getX() {
        synchronized (this) {
            return x;
        }
    }
效果是完全一样的。
 
三、静态方法同步
 
要同步静态方法,需要一个用于整个类对象的锁,这个对象是就是这个类(XXX.class)。
例如:
public static synchronized int setName(String name){
      Xxx.name = name;
}
等价于
public static int setName(String name){
      synchronized(Xxx.class){
            Xxx.name = name;
      }
}

 
四、如果线程不能不能获得锁会怎么样
 
如果线程试图进入同步方法,而其锁已经被占用,则线程在该对象上被阻塞。实质上,线程进入该对象的的一种池中,必须在哪里等待,直到其锁被释放,该线程再次变为可运行或运行为止。
 
当考虑阻塞时,一定要注意哪个对象正被用于锁定:
1、调用同一个对象中非静态同步方法的线程将彼此阻塞。如果是不同对象,则每个线程有自己的对象的锁,线程间彼此互不干预。
 
2、调用同一个类中的静态同步方法的线程将彼此阻塞,它们都是锁定在相同的Class对象上。
 
3、静态同步方法和非静态同步方法将永远不会彼此阻塞,因为静态方法锁定在Class对象上,非静态方法锁定在该类的对象上。
 
4、对于同步代码块,要看清楚什么对象已经用于锁定(synchronized后面括号的内容)。在同一个对象上进行同步的线程将彼此阻塞,在不同对象上锁定的线程将永远不会彼此阻塞。
 
五、何时需要同步
 
在多个线程同时访问互斥(可交换)数据时,应该同步以保护数据,确保两个线程不会同时修改更改它。
 
对于非静态字段中可更改的数据,通常使用非静态方法访问。
对于静态字段中可更改的数据,通常使用静态方法访问。
 
如果需要在非静态方法中使用静态字段,或者在静态字段中调用非静态方法,问题将变得非常复杂。已经超出SJCP考试范围了。
 
六、线程安全类
 
当一个类已经很好的同步以保护它的数据时,这个类就称为“线程安全的”。
 
即使是线程安全类,也应该特别小心,因为操作的线程是间仍然不一定安全。
 
举个形象的例子,比如一个集合是线程安全的,有两个线程在操作同一个集合对象,当第一个线程查询集合非空后,删除集合中所有元素的时候。第二个线程也来执行与第一个线程相同的操作,也许在第一个线程查询后,第二个线程也查询出集合非空,但是当第一个执行清除后,第二个再执行删除显然是不对的,因为此时集合已经为空了。
看个代码:
 
public class NameList {
    private List nameList = Collections.synchronizedList(new LinkedList());

    public void add(String name) {
        nameList.add(name);
    }

    public String removeFirst() {
        if (nameList.size() > 0) {
            return (String) nameList.remove(0);
        } else {
            return null;
        }
    }
}
 
public class Test {
    public static void main(String[] args) {
        final NameList nl = new NameList();
        nl.add("aaa");
        class NameDropper extends Thread{
            public void run(){
                String name = nl.removeFirst();
                System.out.println(name);
            }
        }

        Thread t1 = new NameDropper();
        Thread t2 = new NameDropper();
        t1.start();
        t2.start();
    }
}
 
虽然集合对象
    private List nameList = Collections.synchronizedList(new LinkedList());
是同步的,但是程序还不是线程安全的。
出现这种事件的原因是,上例中一个线程操作列表过程中无法阻止另外一个线程对列表的其他操作。
 
解决上面问题的办法是,在操作集合对象的NameList上面做一个同步。改写后的代码如下:
public class NameList {
    private List nameList = Collections.synchronizedList(new LinkedList());

    public synchronized void add(String name) {
        nameList.add(name);
    }

    public synchronized String removeFirst() {
        if (nameList.size() > 0) {
            return (String) nameList.remove(0);
        } else {
            return null;
        }
    }
}
 
这样,当一个线程访问其中一个同步方法时,其他线程只有等待。
 
七、线程死锁
 
死锁对Java程序来说,是很复杂的,也很难发现问题。当两个线程被阻塞,每个线程在等待另一个线程时就发生死锁。
 
还是看一个比较直观的死锁例子:
 
public class DeadlockRisk {
    private static class Resource {
        public int value;
    }

    private Resource resourceA = new Resource();
    private Resource resourceB = new Resource();

    public int read() {
        synchronized (resourceA) {
            synchronized (resourceB) {
                return resourceB.value + resourceA.value;
            }
        }
    }

    public void write(int a, int b) {
        synchronized (resourceB) {
            synchronized (resourceA) {
                resourceA.value = a;
                resourceB.value = b;
            }
        }
    }
}
 
假设read()方法由一个线程启动,write()方法由另外一个线程启动。读线程将拥有resourceA锁,写线程将拥有resourceB锁,两者都坚持等待的话就出现死锁。
 
实际上,上面这个例子发生死锁的概率很小。因为在代码内的某个点,CPU必须从读线程切换到写线程,所以,死锁基本上不能发生。
 
但是,无论代码中发生死锁的概率有多小,一旦发生死锁,程序就死掉。有一些设计方法能帮助避免死锁,包括始终按照预定义的顺序获取锁这一策略。已经超出SCJP的考试范围。
 
八、线程同步小结
 
1、线程同步的目的是为了保护多个线程反问一个资源时对资源的破坏。
2、线程同步方法是通过锁来实现,每个对象都有切仅有一个锁,这个锁与一个特定的对象关联,线程一旦获取了对象锁,其他访问该对象的线程就无法再访问该对象的其他非同步方法。
3、对于静态同步方法,锁是针对这个类的,锁对象是该类的Class对象。静态和非静态方法的锁互不干预。一个线程获得锁,当在一个同步方法中访问另外对象上的同步方法时,会获取这两个对象锁。
4、对于同步,要时刻清醒在哪个对象上同步,这是关键。
5、编写线程安全的类,需要时刻注意对多个线程竞争访问资源的逻辑和安全做出正确的判断,对“原子”操作做出分析,并保证原子操作期间别的线程无法访问竞争资源。
6、当多个线程等待一个对象锁时,没有获取到锁的线程将发生阻塞。
7、死锁是线程间相互等待锁锁造成的,在实际中发生的概率非常的小。真让你写个死锁程序,不一定好使,呵呵。但是,一旦程序发生死锁,程序将死掉。

posted @ 2009-07-03 14:45 AntiquMan 阅读(137) | 评论 (0)编辑 收藏

1.基本结构
CREATE OR REPLACE PROCEDURE 存储过程名字
(
    参数1 IN NUMBER,
    参数2 IN NUMBER
) IS
变量1 INTEGER :=0;
变量2 DATE;
BEGIN

END 存储过程名字

2.SELECT INTO STATEMENT
  将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条
  记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND)
  例子:
  BEGIN
  SELECT col1,col2 into 变量1,变量2 FROM typestruct where xxx;
  EXCEPTION
  WHEN NO_DATA_FOUND THEN
      xxxx;
  END;
  ...

3.IF 判断
  IF V_TEST=1 THEN
    BEGIN
       do something
    END;
  END IF;

4.while 循环
  WHILE V_TEST=1 LOOP
  BEGIN
 XXXX
  END;
  END LOOP;

5.变量赋值
  V_TEST := 123;

6.用for in 使用cursor
  ...
  IS
  CURSOR cur IS SELECT * FROM xxx;
  BEGIN
 FOR cur_result in cur LOOP
  BEGIN
   V_SUM :=cur_result.列名1+cur_result.列名2
  END;
 END LOOP;
  END;

7.带参数的cursor
  CURSOR C_USER(C_ID NUMBER) IS SELECT NAME FROM USER WHERE TYPEID=C_ID;
  OPEN C_USER(变量值);
  LOOP
 FETCH C_USER INTO V_NAME;
 EXIT FETCH C_USER%NOTFOUND;
    do something
  END LOOP;
  CLOSE C_USER;

8.用pl/sql developer debug
  连接数据库后建立一个Test WINDOW
  在窗口输入调用SP的代码,F9开始debug,CTRL+N单步调试

 

关于oracle存储过程的若干问题备忘
1.在oracle中,数据表别名不能加as,如:

select a.appname from appinfo a;-- 正确
select a.appname from appinfo as a;-- 错误
 也许,是怕和oracle中的存储过程中的关键字as冲突的问题吧

2.在存储过程中,select某一字段时,后面必须紧跟into,如果select整个记录,利用游标的话就另当别论了。

  select af.keynode into kn from APPFOUNDATION af where af.appid=aid and af.foundationid=fid;-- 有into,正确编译
  select af.keynode from APPFOUNDATION af where af.appid=aid and af.foundationid=fid;-- 没有into,编译报错,提示:Compilation
  Error: PLS-00428: an INTO clause is expected in this SELECT statement


3.在利用select...into...语法时,必须先确保数据库中有该条记录,否则会报出"no data found"异常。

   可以在该语法之前,先利用select count(*) from 查看数据库中是否存在该记录,如果存在,再利用select...into...

4.在存储过程中,别名不能和字段名称相同,否则虽然编译可以通过,但在运行阶段会报错

 select keynode into kn from APPFOUNDATION where appid=aid and foundationid=fid;-- 正确运行
select af.keynode into kn from APPFOUNDATION af where af.appid=appid and af.foundationid=foundationid;-- 运行阶段报错,提示
ORA-01422:exact fetch returns more than requested number of rows
5.在存储过程中,关于出现null的问题

假设有一个表A,定义如下:
create table A(
id varchar2(50) primary key not null,
vcount number(8) not null,
bid varchar2(50) not null -- 外键
);如果在存储过程中,使用如下语句:
select sum(vcount) into fcount from A where bid='xxxxxx';如果A表中不存在bid="xxxxxx"的记录,则fcount=null(即使fcount定义时设置了默认值,如:fcount number(8):=0依然无效,fcount还是会变成null),这样以后使用fcount时就可能有问题,所以在这里最好先判断一下:
if fcount is null then
    fcount:=0;
end if;这样就一切ok了。

6.Hibernate调用oracle存储过程

        this.pnumberManager.getHibernateTemplate().execute(
                new HibernateCallback() ...{
                    public Object doInHibernate(Session session)
                            throws HibernateException, SQLException ...{
                        CallableStatement cs = session
                                .connection()
                                .prepareCall("{call modifyapppnumber_remain(?)}");
                        cs.setString(1, foundationid);
                        cs.execute();
                        return null;
                    }
                });
 

 

posted @ 2009-07-01 16:17 AntiquMan 阅读(243) | 评论 (0)编辑 收藏