2010年8月22日星期日

JAVA开发二三事(续一)

dom4j 写入 xml 文件汉字乱码的问题

1、代码:
XMLWriter xmlWriter = new XMLWriter(new java.io.FileWriter(path));

2、问题:
在集成开发环境下启动的程序,写入文件,汉字确实是utf-8,不乱码;但是在console控制台下启动的独立运行,汉字就是乱码了。

3、解决的方法:
代码改成:
XMLWriter xmlWriter = new XMLWriter(new java.io.FileOutputStream());
问题解决。

4、原因:
java.io.FileWriter 没有实现 ENCODING 相关的接口(该说法来源于网络),所以在集成开发环境都是utf-8的情况下,可以输出utf-8,但是在console控制台下,是GBK环境,写入的就不是utf-8了。即使设置了也不起作用。
java.io.FileOutputStream 是二进制的流,实现了相关接口,所以没有问题。

2010年8月15日星期日

JAVA开发二三事

最近做了一个简单的JAVA图形界面程序,给一个同事的项目用。网上搜索解决了不少问题,现在总结一下,做个存档。

一、JAVA Sybase数据库连接:
1、JDBC连接字符串:
String url = "jdbc:sybase:Tds:" + machine + ":" + port + "/" + dbname + "?charset=cp936";
properties = new Properties();
properties.put("user", userID);
properties.put("password", password);
其中:machine是数据库服务器的IP地址。不能是机器名、不能是Localhost、不能是127.0.0.1。我的操作系统是Win7,除了静态IP地址,其他的都连接不上,这个折腾的时间最多。还有端口port是5000,不是文档上说的那个43XX。dbname是数据库的名字。加上 "?charset=cp936"参数是指明了字符集,为了返回结果中的中文正常显示,否是是乱码。默认的userID是sa,password是空字符串。

2、打开连接:
Class.forName("com.sybase.jdbc3.jdbc.SybDriver").newInstance();
connection1 = DriverManager.getConnection(url, properties);

3、数据库读取操作以及结果集循环:
Statement selectStatement;
ResultSet resultSet;
String kmdm;
String mc;
try {
if (connection1 != null) {
selectStatement = connection1.createStatement();
resultSet = selectStatement.executeQuery("SELECT KMDM, "
+ " MC "
+ " FROM KM" + cyear
+ " WHERE 1=1 ");
while (resultSet.next()) {
kmdm = resultSet.getString("kmdm");
mc = resultSet.getString("mc");
jTextArea1.append(kmdm + " - '" + mc + "'\n");
} catch (Exception exception) {
jTextArea1.append("Error: " + exception.getMessage());
}

二、JAVA Sybase Spring JdbcTemplate数据库连接:
1、连接字符串
String url = "jdbc:sybase:Tds:" + machine + ":" + port + "/" + dbname + "?charset=cp936";
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.sybase.jdbc3.jdbc.SybDriver");
dataSource.setUrl(url);
dataSource.setUsername(userID);
dataSource.setPassword(password);
其中:dataSource.setUsername和dataSource.setPassword不能省略。其实连接字符串中的url里面也能写上用户名和密码,但是会报错,一定要写。
2、查询一:
JdbcTemplate jt = new JdbcTemplate();
jt.setDataSource(dataSource);
String qry;
qry = "select count(MAX(SXH)) from BAK_PZ" + cyear + " GROUP BY YUE,PZLB,PZBH";
pzcount = jt.queryForInt(qry);
其中:queryForInt能直接得到整数型的返回值;
3、查询二:
qry = "SELECT A.* FROM BAK_PZ" + cyear + " A JOIN "
+ " (SELECT MAX(SXH) AS SXH,YUE,PZLB,PZBH FROM BAK_PZ" + cyear
+ " GROUP BY YUE,PZLB,PZBH) B "
+ " ON A.SXH =B.SXH AND A.YUE=B.YUE AND A.PZLB=B.PZLB AND A.PZBH=B.PZBH "
+ " ORDER BY A.YUE,A.PZLB,A.PZBH ";

List rows = jt.queryForList(qry);

Iterator it = rows.iterator();
String shrNull;
int tmpi = 0;
while (it.hasNext()) {
Map userMap = (Map) it.next();
shrNull = userMap.get("SHR") == null ? "" : userMap.get("SHR").toString().trim();
其中:queryForList 能直接把返回结果集组装成一个list,每个list里面是一个个的map,存放的是字段和对应的值,遍历、使用都非常方便。唯一的缺点是字段的值被装箱成Object了,一是要自己类型转换;二是内存消耗很大。方便飞副作用就是内存占用上升。

三、dom4j的使用(XML的生成、写入文件)
1、创建xml跟节点:
Document doc = null;
Element root = null;
doc = DocumentHelper.createDocument();
root = DocumentHelper.createElement("ufinterface");
doc.setRootElement(root);

2、给某个节点添加属性:
root.addAttribute("roottag", "voucher");

3、增加子节点
Element voucherElem = root.addElement("voucher");
voucherElem.addAttribute("id");
或者直接连续增加:
voucher_head.addElement("fiscal_year").addText(cyear);

4、DOM XML写入文件:
OutputFormat outFmt = OutputFormat.createPrettyPrint();
outFmt.setEncoding("UTF-8");
outFmt.setIndent(" ");//设置缩进
outFmt.setNewlines(true);//让xml换行,方便查看
XMLWriter xmlWriter = new XMLWriter(new java.io.FileWriter("c:\\凭证_" + dbname +pk_corp + "公司" + cyear + "年.xml"), outFmt);
xmlWriter.write(doc);
xmlWriter.close();
其中:Encoding设置为UTF-8能保证不乱码。缩进和换行是为了后续调试xml方便。为了减少体积可以不加。

四、用Netbeans来写GUI 图形界面程序太爽了,简直就是VB、C#图形程序的开发方式,拖拉控件、设置布局、写事件响应代码、挂接。很高效。当然,这个是调用的Netbeans自带的Swing开发框架。您老要是觉得不地道,自己整Swing或者AWT都行。Eclipse里面也可以自己去弄响应的框架。

五、JAVA 程序的打包发行。偷懒的也是最简单的做法,把编译生成的jar和自己加工过的jdk一起压缩发给客户。就40MB。然后写个简单的批处理文件,如下调用:
.\jdk1.6.0_20L\jre\bin\java -jar .\DesktopApplication1\dist\DesktopApplication1.jar
看到了吗,我直接把整个Netbeans项目文件夹都给客户了。顶多删除源码。jdk就是安装之后的1.6.0.20版,自己删除了里面带的源码、例子等等不需要的做了精简。

六、想到再说。吃饭了。

2010年4月25日星期日

Java 读写 Word doc 文件的方法(POI代码示例)

都说懒人推动社会进步。
我的出发点是,想做个自动生成工作日志的工具。思路是读取google日历中我每日的工作记录,填充生成公司规定格式的word文件,然后再调用邮件函数发送邮件到领导的信箱里面去。

这其中一环就是Java读写doc文件。网上找了不少资料,初步选用了Apache POI,可以读写整个Office系列的各种文档,并且不依赖Office的任何库,纯JAVA代码。直接读写doc的二进制文件,我最喜欢了。相对的有个Java com 桥的方法,用Java来操作com对象,后台运行隐藏的word程序,甚为不喜。

POI API Documentation 的文档写的太差了,没有例子,Apache 的 POI 项目主页也没有代码,直接说想看代码,请去svn下载代码,阅读他的单元测试用例,TestCase。
最后磕磕绊绊写了下面的一个测试的例子。基本可以看清这个POI的hwpf库,读写word doc 文件的方法。代码、注释都是原创,高手飘过去就行了。

import java.io.*;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.usermodel.Paragraph;
import org.apache.poi.hwpf.usermodel.Range;
import org.apache.poi.hwpf.usermodel.Section;

public class Main {

public static void main(String[] args) {
try {
//新建 HWPFDocument 对象,读入doc文件
HWPFDocument doc = new HWPFDocument(new FileInputStream("c:\\test.doc"));
//得到整个doc文档的Range,可以理解为文档对象
Range r = doc.getRange();

System.out.println("Example you supplied:");
System.out.println("---------------------");

String text = new String("");
//得到整个文档里面的所有纯文字,包含回车换行。一段是一行
text = r.text();
//System.out.println(text);

//得到整个文档的分节数。一般只有一节,排版很漂亮的word文档一般分为多节
System.out.println("numSections: " + r.numSections());
//得到倒数第一节的Section对象
Section section = r.getSection(r.numSections() - 1);
//得到该节里面的段落数
System.out.println(section.numParagraphs());
System.out.println("numParagraphs: " + section.numParagraphs());

String searchText = "${Ryan}";
String replacementText = "Apache Software Foundation";

//循环得到每一段落的文字。这个跟Range.text()是不同的。
for (int np = 0; np < section.numParagraphs(); np++) {
Paragraph para = section.getParagraph(np);
//得到该段落的文字
text = para.text();
//System.out.println(Integer.toString(np) + ":" + text);
int offset = text.indexOf(searchText);
if (offset >= 0) {
System.out.println(Integer.toString(np) + ":" + para.text());
//如果找到了,就进行文字的替换。replaceText只能针对段落
para.replaceText(searchText, replacementText);
break;
}
}
//写入到新的doc文件
OutputStream outdoc = new FileOutputStream("c:\\test2.doc");
doc.write(outdoc);
outdoc.flush();
outdoc.close();

} catch (Throwable t) {
t.printStackTrace();
}
}
}


编译运行很顺利,但是悲剧的是,最后调用write方法写入的doc文件打不开了,报格式错误,用Notepad++打开这个doc文件对比原来的,发现文字确实替换成功了,但是文件的尾巴上少了一部分内容,二进制和assic混合的,格式看来是被破坏了。

忙活了半天,最后发现杯具了。应该是兼容性的问题。改天去他们的邮件列表问问。或者路过的看官知道的,指导一下我。

我在写这个文章的时候,又想到一个绝妙的注意。何必绕道这么远呢?
实施工作日志内容来源于google calendar,如果能够利用google app doc 自己本身的宏:google script,的功能,读取日历数据,形成doc文件,调用gmail发送到指定的信箱,不是齐活了吗?费不着用Java了。

其实在决定用java之前,想过用VB,这个做肯定不存在问题,VB操作com对象本身是轻车熟路,顶多再找个发邮件的库,实在不行了没人手工发送。方法还是很多的。

科技以人为本。

2010年3月20日星期六

在 Ubuntu 下安装 SUN JDK 6 和 Eclipse

Ubuntu下安装JDK 6和Eclipse

开发笔记:在Ubuntu下安装JDK 6和Eclipse 
首先需要安装JDK 6 
sudo apt-get install sun-java6-jdk 

之后需要设置默认的java程序 
sudo update-alternatives --config java 
按照提示输入对应的选项,指定为JDK 6 

下面设置 
sudo vim /etc/environment 

在其中添加如下两行: 
CLASSPATH=/usr/lib/jvm/java-6-sun/lib 
JAVA_HOME=/usr/lib/jvm/java-6-sun 
如果其中已经设置了CLASSPATH和JAVA_HOME,则将其修改为上面的形式,保存退出。 

接下来安装Eclipse 
sudo apt-get install eclipse 

需要注意的是,此时Eclipse并不关心之前设置的update-alternative 

所以应该修改Eclipse的配置。首先将 SUN-JDK-6彻底设为系统默认: 

sudo update-java-alternatives -s java-6-sun 

然后编辑JVM配置文件: 
sudo vim /etc/jvm 

在文件顶部添加 
/usr/lib/jvm/java-6-sun 
(如果没有则自己新建) 

sudo vim /etc/eclipse/java_home 

也是在文件顶部添加 
/usr/lib/jvm/java-6-sun 

之后启动Eclipse,选择Help->About Eclipse SDK,选择Configuration Details,可以看到JDK6的设置已经生效。 

ubuntu下设置华文黑体

如何安装Mac的华文黑体来美化汉字的显示:
(1)先到这里sthei.ttf.gz去下载sthei.ttf字体,解压;
(2)把它copy到"/usr/share/fonts/custom/cn"目录下;fonts下没有custom/cn目录就先建一个
(3)减少中文字体过度渲染:sudo fontconfig-voodoo -f -s zh_CN
(4)修改字体配置文件,加入sthei字体:sudo gedit /etc/fonts/language-selector.conf;在<family>Bitstream Vera Sans</family>行下面添加:<family>STHeiti</family>保存后退出
(5)强制刷新字体缓存:sudo fc-cache -f -v
(6)系统 -首选项 � 字体:设置所有非等宽字体为 Bitstream Vera Sans 10号,其中窗口标题字体设置为粗体。等宽字体设置为Courier 10 Pitch,在AA时,Courier 10 Pitch比Courier New字体更清楚。
(7)顶顶重要的:在"字体渲染"中,选择"细节","平滑"设置为"灰度","微调"设置为"无"。
(8)打开firefox,设置firefox字体,无衬线字体:Bitstream Vera Sans;等宽字体:Courier 10 Pitch 大小:13;其它的可以不改。
(9)退出当前登录,重新登录。一切OK了。

以上来自我2006年在donews的博客。现在网站已经打不开来。好在还有google cache。
最关键的是box.net的文件共享依然还在,每当有人下载了我共享的华文黑体,它都会发一封邮件给我。
作为一个美国网站,免费到为一个中国人提供来长达5年的免费文件寄存服务,这是怎样的一种精神病啊!
类似这样到外国公司,你们要把他们赶出中国去,你们连精神病都不如。

2010年2月22日星期一

GAE(Google App Engine) 对 struts Spring 等的支持情况

完整描述见这里:(要fuckgfw)
http://groups.google.com/group/google-appengine-java/web/will-it-play-in-app-engine

Spring MVC
Version: 2.5.6
Status: COMPATIBLE
To see Spring's MVC framework running on App Engine, check out the autoshoppe sample application.
If you're using Spring forms (e.g. using the spring-form.tld tag library and subclassing SimpleFormController), you will need to register custom editors for your properties. This is covered in http://groups.google.com/group/google-appengine-java/browse_thread/thread/d93fd7385bf85bf7.

Spring ORM
Version: 2.5.6
Status: COMPATIBLE
To get Spring working with the App Engine-provided JPA interface, follow the instructions at http://objectuser.wordpress.com/2009/05/19/spring-jpa-in-google-app-engine/, which discusses a workaround to the dependency on javax.naming needed for @PersistenceContext. A more complex workaround is available at http://groups.google.com/group/google-appengine-java/browse_thread/thread/187d41712ec1d394.

Spring Security
Version(s): ?
Status: SEMI-COMPATIBLE
To work around a ClassNotFoundException, you can use a re-compiled version of the library which adds a StringInsensitiveComparator class -- the download is provided at http://www.google-app-engine.com/blog/post/Spring-security-fix-for-google-app-engine.aspx.
See http://www.dotnetguru2.org/bmarchesson/index.php?p=1100 for tips on how to get Spring Security running with App Engine and GWT (in French).

Stripes Framework
Version(s): ?
Status: COMPATIBLE
The default multipartwrapper implementation needs a temporary directory on the local file system for file uploads, which App Engine doesn't allow. The workaround is to create your own implementation -- more details at http://groups.google.com/group/google-appengine-java/browse_thread/thread/81dbcf7cf2281014.

Struts 1
Version: 1.2.28
Status: COMPATIBLE

Struts 2
Version(s): ?
Status: COMPATIBLE (see notes)
Struts will not initially work because the OGNL permissions which the framework relies on can't be set due to security restrictions in App Engine's sandbox. However, some users have documented a workaround at http://groups.google.com/group/google-appengine-java/browse_thread/thread/19018b0317f27817.
A tutorial on uploading files using Struts running on App Engine is available at http://whyjava.wordpress.com/2009/10/04/file-upload-on-google-app-engine-using-struts2/.
Will need to set devMode to false in struts.xml: <constant name="struts.devMode" value="false" />


这个人的博客上也描述了如何使用 Struts 2 with App Engine:

还有这个博客,关于GAE、Spring、JPA、JDO 内容非常丰富:(要fuckgfw)

  • Spring + JDO in Google App Engine
  • 17 Minute JDO!
  • Spring + JPA in Google App Engine
  • More on Spring Security in Google App Engine
  • Spring Security in Google App Engine
  • Google App Engine Testing with Spring
  • Queries in GAE: One to Many Relationships
  • Google App Engine
  • Queries in GAE: Many to Many Relationships
  • Queries in GAE: One to One Relationships

Spring + JPA in Google App Engine


I've been playing around with Google App Engine because it's new and cool and has some interesting possibilities. However, it's in a preview mode currently and has some limitations, as expected.

One difficulty I encountered was getting Spring (2.5.6) to work nicely with the App Engine-provided JPA. But now I have it working. Here's how.

The basic problem is that PersistenceAnnotationBeanPostProcessor has a dependency on javax.naming. But that's the thing you need to get @PersistenceContext to work. And you want that to work because you want to be able to have transactions that span DAOs (or, at least, I wanted that).

That dependency is easy to resolve, however. Just grab the source to PersistenceAnnotationBeanPostProcessor, put it in your own package, and replace the catch blocks with NamingException with just Exception … you won't be using those things anyway.

Now, use that bean in your context configuration file.
<bean id="persistienceAnnotationBeanPostProcessor"
class="your.package.name.PersistenceAnnotationBeanPostProcessor" />

Finally, use the @PersistenceContext annotation in your DAO just like it says in the Spring documentation:
@PersistenceContext
private EntityManager entityManager;

You're done. Thank me.

Update 5/25: As Alex points out I spelled the bean ID incorrectly. However, that was right from my code, so the id doesn't really matter. In fact, now I have:
<bean class="your.package.name.PersistenceAnnotationBeanPostProcessor" />

2010年2月5日星期五

Oralce游标定义、游标变量、游标循环的实际例子


--给销售订单加上行号
--同一个单据号(djh)之内,行号(rowno)按照10的步长来编号
--新单据号,行号要重新从10开始
declare
--本例子演示了Oralce游标定义、Oracle游标变量、Oracle游标循环
--以及在游标里面更新数据库的技巧
cursor cc is select nno,djh,rowno
from temp_so order by nno;
--定义游标变量
ccrec cc%rowtype;
--定义自己的变量
irowno number;
idjh varchar2(50);
begin
--打开游标
open cc;
--提取一行数据到ccrec中
fetch cc into ccrec;
--判断是否提取到值,没取到值就退出
--取到值cc%notfound 是false
--取不到值cc%notfound 是true
idjh := ccrec.djh;
irowno:=10;
loop --loop循环
--exit when (cc%notfound or cc%rowcount =300);
exit when (cc%notfound);

if (idjh = ccrec.djh) then
update temp_so set temp_so.rowno = irowno where temp_so.nno = ccrec.nno;
--dbms_output.put_line(cc%rowcount||' '||ccrec.djh||' '||idjh||' '||irowno);
else
irowno:=10;
idjh := ccrec.djh;
update temp_so set temp_so.rowno = irowno where temp_so.nno = ccrec.nno;
-- dbms_output.put_line(cc%rowcount||' '||ccrec.djh||' '||idjh||' '||irowno);
end if;
fetch cc into ccrec;
irowno:=irowno+10;
end loop;
close cc;
commit;
end;


-------------------
A Contre Courant

2010年1月8日星期五

NC系统日常维护技术手册

1 数据库日常操作

1.1 Oracle数据库

1.1.1 数据库的启动:

1)启动数据库实例(Unix/Linux系统需切换到Oracle用户下):

sqlplus “/ as sysdba”

startup (启动数据库实例)

shutdown immediate (关闭数据库实例)

2)启动/关闭数据库监听进程.

lsnrctl

LSNRCTL> start (启动监听)

LSNRCTL> stop (关闭监听)

1.1.2 用户口令的修改:

SQL> ALTER USER “用户名” IDENTIFIED BY “新口令

如果数据库管理员的口令丢失, 可执行如下步骤:

sqlplus “/ as sysdba”

SQL> ALTER USER “sys” IDENTIFIED BY “新口令

SQL> ALTER USER “system” IDENTIFIED BY “新口令

1.1.3 数据库参数文件SPFILEPFILE

(假设Oracle安装在D:\Oracle目录下)

(1) SPFILE文件:

存储在D:\Oracle\ora92\database目录下, 为二进制的参数文件,无法直接编辑.

文件名为”SPFILE+例程名.ora”

(2) PFILE文件:

存储在D:\Oracle\ora92\database目录下, 为文本的参数文件,可直接修改.文件名为”init+例程名.ora”, 打开此文件,内容为”IFILE=’d:\oracle\admin\实例名\pfile\init.ora’”, 也就是说真正的参数文件为init.ora, 此文件为文本文件,可直接编辑.

(3) 数据库启动所使用的参数文件.

数据库启动时, 首先寻找”SPFILE+例程名.ora”文件,若文件存在,就按照文件设

置的参数启动例程;”SPFILE+例程名.ora”文件不存在,转向寻找”init+例程名.ora”文件,按照”init+例程名.ora”文件里指定的实际参数文件init.ora的参数启动例程.

(4) SPFILEPFILE的相互转换.

a) PFILE文件创建SPFILE文件.

Create spfile=’spfile路径’ from pfile=’pfile路径’;

b) SPFILE文件创建PFILE文件.

Create pfile=’ pfile路径’ from spfile=’spfile路径’;

c) 如果PFILE文件与SPFILE文件都在默认的安装路径下,用下面命令即可:

create spfile from pfile (pfile文件创建spfile文件)

create pfile from spfile (spfile文件创建pfile文件)

1.2 DB2 数据库的常用操作

1.启动数据库

db2start

2.停止数据库

db2stop

3.连接数据库

db2 connect to o_yd user db2 using pwd

4.读数据库管理程序配置

db2 get dbm cfg

5.写数据库管理程序配置

db2 update dbm cfg using 参数名 参数值

6.读数据库的配置

db2 connect to 数据库名 user db2 using pwd

db2 get db cfg for数据库名

7.写数据库的配置

db2 connect to数据库名user db2 using pwd

db2 update db cfg for数据库名using 参数名 参数值

8.关闭所有应用连接

db2 force application all

9.执行一个sql文件

db2 tf sql文件名

(文件中每一条命令用 ;结束)

10.列出所有的系统表

 list tables for system

2 数据库备份与恢复

2.1 Oracle的逻辑备份与恢复

2.1.1 逻辑备份

使用EXP命令, exp help=y得到所有关于exp命令的参数

例:将nc30用户的所有数据备份到nc30bak.dmp文件中.

exp nc30/1@ncdb owner=nc30 file=nc30bak.dmp log=exp.log

其中:

nc30/1: ncOracle用户名与密码

ncdb: Oracle的实例名

nc30bak.dmp: 为导出文件

exp.log : 导出过程的log文件.

2.1.2 逻辑恢复

使用IMP命令,imp help=y得到所有关于exp命令的参数

例:将nc30bak.dmp文件中的nc30用户的所有数据恢复到nc30new用户下.

imp nc30new/1@ncdb formuser=nc30 touser=nc30new file=nc30bak.dmp log=imp.log

其中:

nc30/1: 要导入的Oracle用户名与密码

ncdb: Oracle的实例名

nc30: 导出时的Oracle用户名

nc30new: 要导入数据到此Oracle用户下

nc30bak.dmp: 为导出文件

imp.log : 导入过程的log文件.

2.2 DB2的备份与恢复

2.2.1 备份

通过DB2控制中心图形界面备份,右键点击选中的数据库,选择备份数据库,根据提示操作即可;

命令行操作

db2 backup db dbname to backupdir

注释:该命令有丰富参数,可以使用命令db2 ? backup db查看。在命令行下输入db2 ? msgmsg可以是错误提示信息如SQL1013N,也可以是某个命令如backup db

注意事项

windows服务器的备份文件放在一个较深的目录结构下,注意复制时要保留目录结构,例:C:\MYDB\DB2\NODE0000\CATN0000\20030401\120001.001

备份如果提示有活动应用程序连接,则在确认事务都已经提交后,断调连接后再备份

db2 force application all

对于用于不同操作系统下数据库恢复目的的数据库备份:

假如,你的数据库在AIX平台上,你想在WIN平台上来恢复数据环境,可用dbmove来做。dbmove只导出了表结构与表数据,而其他如视图等对象并没有被创建,所以还要用db2look做一个库结构的备份。操作步骤如下所示:

db2look –d dbname –u db2inst1 –e –o d:\credb.sql –i db2inst1 –w db2inst1

db2move dbname export –tc db2inst1 –u db2inst1 –p db2inst1

2.2.2 恢复

通过控制中心图形界面恢复,右键点击指定实例下面的数据库,选择“根据备份创建数据库”,根据提示操作;

命令行操作

db2 restore db dbname from backupdir

对于通过dbmove来的数据我们如何做恢复呢?步骤如下:

dbmove dbname import –io replace_create db2inst1 –u db2inst1 –p db2inst1

db2 connect to dbname user db2inst1 using db2inst1

db2 –tvf d:\credb.sql > credb.log

执行以上步骤后打开credb.log文件查看有哪些异常,在日志文件中前半部份涉及到创建表的语句会报错,因为通过dbmove后表已创建起来,我们把他当做正常错误来看待。关键是要看后面的涉及到表的约束条件及索引、视图、触发器的建立是否正常。

3 数据库执行统计分析更新

作用:保证统计信息的最新与准确性最好每周做一下统计信息更新:

3.1 Oracle:

使用sqlplus以要更新的用户身份登陆到数据库,执行:

begin
dbms_stats.gather_schema_stats(ownname=> ‘
(用户名)’ , cascade=> TRUE);

end;

上述语句会把该用户模式下的所有表、索引的统计信息更新。

如果只想更新其中某个对象的统计信息,可执行 analyze table表名 compute statistics analyze table表名compute statistics for all indexes; analyze table表名compute statistics for all columns;

3.2 DB2

以表的所有者的用户权限登陆数据库,执行:

reorgchk update statistics on table all

上述语句会更新该数据库内该用户所拥有的所有表、索引的统计信息

如果只想更新其中某个对象的统计信息,可执行

RUNSTATS ON TABLE(表名) and indexes all

3.3 SQL Server

使用Query Analyzer登陆到SQL Server,执行:

use用户数据库名称

sp_updatestats

上述语句会把该数据库内的所有表、索引的统计信息更新。

如果只想更新其中某个对象的统计信息,可执行:

UPDATE STATISTICS表名

4 数据库重建索引

如果系统已经运行三月以上,并且数据变化很大,可以考虑重建索引.

4.1 oracle

执行:

set pagesize 20000

spool c:\index.sql;

select ‘alter index ‘||index_name||’ rebuild online;’ from user_indexes;

spool off;

编辑c:\index.sql文件,删除除’alter index......’外的其他内容。运行:

@@c:\index.sql;

4.2 db2

在用户数据库先执行:

select ‘REORG TABLE ‘||rtrim(TBCREATOR)||’.’||TBNAME||’ INDEX ‘||rtrim(CREATOR)||’.’||NAME||‘;’ from sysibm.sysindexes

然后把运行结果执行

4.3 sql server:

在用户数据库先执行:

select ‘dbcc dbreindex(‘+name+’)’ from sysobjects where xtype=’u’

然后把运行结果执行

5 Oracle数据库重要参数配置说明

硬件配置在2CPU2G内存设置情况

系统大约支持用户并发数:30左右

----------------------------------------------------------------------------------------------------

oracle 9i 版本(32bit)

db_cache_size = 629145600600M

shared_pool_size = 209715200 200M

large_pool_size = 614400

java_pool_size = 20971520

processes = 80

log_buffer = 5242880

db_block_size = 8192

db_writer_processes =2

open_cursors = 2000

workarea_size_policy = auto

pga_aggregate_target = 250M

pre_page_sga = true(win2000下参数)

lock_sga = true (unix下参数,不包含solaris)

optimizer_index_cost_adj =40

optimizer_dynamic_sampling=2

oracle 10g 版本(32bit)

db_cache_size = 629145600600M

shared_pool_size = 209715200 200M

large_pool_size = 614400

java_pool_size = 20971520

processes = 80

log_buffer = 5242880

db_block_size = 8192

db_writer_processes =2

open_cursors = 2000

workarea_size_policy = auto

pga_aggregate_target = 250M

optimizer_index_cost_adj =40

pre_page_sga = true(win2000下参数)

lock_sga = true (unix下参数,不包含solaris)

----------------------------------------------------------------------------------------------------

硬件配置在4CPU4G内存设置情况

系统大约支持用户并发数:30-50左右

----------------------------------------------------------------------------------------------------

oracle 9i 版本(32bit) OS:win2000

db_cache_size = 120M 1200M

shared_pool_size = 314572800 300M

large_pool_size = 614400

java_pool_size = 20971520

processes = 80

log_buffer = 5242880

db_block_size = 8192

db_write_processes = 3

open_cursors = 2000

workarea_size_policy = auto

pga_aggregate_target = 400M

pre_page_sga = true(win2000下参数)

lock_sga = true (unix下参数,不包含solaris)

optimizer_index_cost_adj =40

optimizer_dynamic_sampling=2

oracle 10g 版本(32bit) OS:win2000

db_cache_size = 1200M 1200M

shared_pool_size = 314572800 300M

large_pool_size = 614400

java_pool_size = 20971520

processes = 80

log_buffer = 5242880

db_block_size = 8192

db_write_processes = 3

open_cursors = 2000

workarea_size_policy = auto

pga_aggregate_target = 400M

pre_page_sga = true(win2000下参数)

lock_sga = true (unix下参数,不包含solaris)

optimizer_index_cost_adj =40

----------------------------------------------------------------------------------------------------

硬件配置在4CPU4G内存设置情况

系统大约支持用户并发数:80左右

----------------------------------------------------------------------------------------------------

oracle 9i 版本(64bit)

db_cache_size = 12884901881.2G

shared_pool_size = 314572800 300M

large_pool_size = 614400

java_pool_size = 20971520

processes = 120

log_buffer = 5242880

db_block_size = 8192

db_writer_processes =3

open_cursors = 2000

workarea_size_policy = auto

pga_aggregate_target = 800M

pre_page_sga = true(win2000下参数)

lock_sga = true (unix下参数,不包含solaris)

optimizer_index_cost_adj =40

optimizer_dynamic_sampling=2

oracle 10g 版本(64bit)

db_cache_size = 12884901881.2G

shared_pool_size = 314572800 300M

large_pool_size = 614400

java_pool_size = 20971520

processes = 120

log_buffer = 5242880

db_block_size = 8192

db_writer_processes =3

open_cursors = 2000

workarea_size_policy = auto

pga_aggregate_target = 800M

pre_page_sga = true(win2000下参数)

lock_sga = true (unix下参数,不包含solaris)

optimizer_index_cost_adj =40

----------------------------------------------------------------------------------------------------

硬件配置在8CPU8G内存设置情况

系统大约支持用户并发数:150左右

----------------------------------------------------------------------------------------------------

oracle 9i 版本(64bit)

db_cache_size = 3500M 3.5G

shared_pool_size = 400M 400M

large_pool_size = 614400

java_pool_size = 20971520

processes = 200

log_buffer = 5242880

db_block_size = 16384

db_writer_processes = 5

open_cursors = 2000

workarea_size_policy = auto

pga_aggregate_target = 2250M

pre_page_sga = true(win2000下参数)

lock_sga = true (unix下参数,不包含solaris)

optimizer_index_cost_adj =40

optimizer_dynamic_sampling=2

oracle 10g 版本(64bit)

db_cache_size = 3500M 3.5G

shared_pool_size = 400M 400M

large_pool_size = 614400

java_pool_size = 20971520

processes = 200

log_buffer = 5242880

db_block_size = 16384

db_writer_processes = 5

open_cursors = 2000

workarea_size_policy = auto

pga_aggregate_target = 2250M

pre_page_sga = true(win2000下参数)

lock_sga = true (unix下参数,不包含solaris)

optimizer_index_cost_adj =40

----------------------------------------------------------------------------------------------------

关于创建和配置oracle数据库的几点补充说明:

1.win2000oracle进程使用的物理内存保持在1.6G以下为佳(SGA+PGA),超过1.7G左右系统开始不稳定,不定期的会出现ora-04030的错误,具体信息观察alert.log文件。如果超过1.6G,考察数据库状况,适当降低db_block_buffersshared_pool_sizesort_area_size(8i)/pga_aggregate_target(9i),具体内容根据数据库状态和并发用户数量对这三个参数进行微调。

2.创建数据库时应选择创建"专用服务器模式",不可创建MTS模式的数据库,对以创建的数据库,查询v$dispatcher,如有记录则说明当前数据库为MTS模式,需将当前数据库改成专用服务器模式。

3.关于redo log file的问题:

a: redo log file的部署,不建议位于raid5上,应位于单独的物理设备上,不要和数据文件放在同一物理设备,建议redo log group member不少于2,并且位于不同的磁盘。

b: redo log file的大小,可以在建库时先将其建为20M,观察alert.log文件中log切换的频率,一般30分中左右切换一次为正常现象,如果切换频率太快,可增大redo log file。如果系统非归档模式,可考虑将redo log file设为100M;如果为归档模式,则redo log file 不应太大,以免归档时造成系统性能降低,综合日志切换频率和一次归档所需时间考虑,一般来说不要超过50M

c: redo log group的数量,在实际上线的生产系统中,归档模式下,group数量在56个。

4.关于数据库文件部署的问题:

a: 重做日志文件和数据文件要分离。

b: 有条件的情况下,临时表空间文件和数据文件要分离。

c: 归档日志路径应为单独的物理存储设备,且不可和重做日志文件及数据文件放在一起。

d: 如果系统没有使用raid(或仅使用raid1),建议将系统的数据文件和nc的数据文件分离在不同的磁盘上,nc数据文件中,存储table和存储index的表空间的文件最好分离在不同的磁盘上。

5.如果备份使用rman,请自行调整Large_pool值;

6.如果想使用Oracle 10g的自动SGA管理,请将db_block_buffers,shared_pool_size,large_pool_size,java_pool_size置为0,并根据内存大小设置SGA_Target值。

6 NC应用服务器系统优化

1.日常业务中一定要避免输出所有sql语句:

如果输出的话,会极大的加重应用服务器I/O的负载.

可以用setting工具中的是否输出sql语句选项,不选,然后点接设置按钮就可以屏蔽掉.

2.保证NC应用服务器启动参数设置正常:

查看启动文件startup中的-Xms -Xmx的值,与发版推荐或技术工作指导手册中推荐的值没有太大出入就行.

如果是NC3.0,可以在setting工具的最后一个面板中获取对应端口中间件的内存使用状况,可以跟踪实际使用中内存是否会存在瓶颈.

3.对于widows操作系统:操作系统尽量干净

不要安装DNS系统

不要安装盗版防火墙软件

在应用服务器上尽量不要安装数据库系统

每周重启一次

4.应用服务器中NC中间件设置自动重启功能

通过设置NC应用服务器每天自动重启来提高NC应用服务器响应的效率.

可以用NCcommander命令来进行设置.

注意:避开NC中自动任务批处理执行时间

1):用commander.bat(commander.sh)中的clock命令可以设置自动重启定时。只要中间件

监控进程没有断掉,设置的自动重启定时就不会销掉。(注意,设置后,除非监控进程

断掉,否则自动重启定时无法取消)

2):还可以在./ierp/bin/clock.properts中设置是否默认启动自动重启定时,以及自动重

启定时的时间。

### 设置服务器重启闹钟

### 闹钟时间

clock = 00:00

### 是否启动闹钟

enable = false

如果enable设置位true,则启动中间件时监控进程会默认启动自动重启定时。时间位clock属性对应的时间。注意该时间不能为00:00,否则默认为不启动闹钟功能。

5. 定时清理NC中的日志

尤其是设置自动重启后,日志出现覆盖重写的几率较小,会出现很多的日志文件

./NCLogs下,需要手动清理掉。

例如:UFNC3000R12_0.logUFNC3001R12_0.logUFNC3002R12_0.log,其中R12表示第12次自动重启后的日志。

6. JDK版本的维护

windows下与unix下有些不同,在windows下可以直接用sun提供的jdk。而在unix下:如果是solaris,需要用jdk for solaris版本,aix需要用ibmjdk for aixhp unix下用hp自己的jdk等等。在unix下,可以这样启动中间件:./startup.sh /jdk目录

7. 定时监控系统注意异常的进程对系统的影响:

windows下如异常的防火墙进程,受病毒感染的进程等等有可能会占用大量的资源。

unix下如异常的对文件操作,访问的进程等等,注意是否存在这样的进程造成大量的cpu资源占用。

8.应用服务器与数据库服务器的通信连接

有时候应用服务器与数据库服务器的通信有可能出现问题,尤其是在大并发访问的情况下,应用服务器与数据库间通信非常频繁的时候。此时要注意:(1):数据库的listener是否能再监听从应用服务器上发过来的新建连接请求。

7 NC应用服务器诊断

7.1 排除 网络、防火墙、其它软件等对NC的影响

用户的网络中安装有防火墙,NC客户端的请求通过网络、防火墙发送到服务器端WEB应用服务器,WEB应用服务器通过SERVLET代理将对应的请求发给数据库服务器,数据库服务器执行对应的数据库操作,并将结果返回到应用服务器,应用服务器处理完毕后,再通过防火墙、网络返回给NC客户端. 因此, 网络和防火墙在其中起到非常重要的作用.同时,很多问题也往往出现在这两个关键环节. 如网络速度慢、防火墙设置不正确等. 会影响NC的使用.

: 在防火墙上要打开80808180828083四个端口. 因为NCstartup启动时,这四个端口是协同对外工作的。

检测网络问题,可以用Ping, Tracert,netstat等检测.

应用服务器和数据库服务器要保证良好的网络通信,不推荐跨网关或跨防火墙通信,不推荐类似于一个在网通,一个在电信网的情况.同时针对应用服务器和数据库服务器,功能要单一,不建议将应用服务器和数据库服务器都放在同一台服务器.

在数据库服务器和应用服务器上, 不要安装DHCPDNSPROXYWINS和、防火墙及邮件服务等与NC无关服务。如在河北网通,一次测试过程中,应用服务器和防火墙在同一台服务器,访问速度特慢,防火墙关闭后,访问速度恢复正常.

另外,软件端口占用和病毒入侵,也时常影响NC的使用. :

IIS端口,默认是80.所以安装前,先在服务处,停止world Wide Web Publishing Service , 然后到计算机管理处,更改IIS端口或停止. 如果安装了ORACLE,往往会出现,NC中间件启动不起来. 原因是OracelOracleOraHome92HTTPServer端口默认是80,所以要将该服务停掉或更改端口. 如果服务器染上病毒, 访问速度会急剧下降.

7.2 通过对CPU、内存及I/O的监控来了解系统资源的分配情况

应用服务器CPU、内存或I/O有可能成为系统的性能瓶颈. CPU处理能力不足. 内存不够引起I/0读写繁忙 或磁盘本身问题等. 都会造成系统运行缓慢. 怎样能查找这些原因呢?

Windows,任务管理器可以了解这些信息. : 当系统运行缓慢,可以通过任务管理器中的进程信息,看哪个进程占用CPU及内存资源较多,然后分析一下该进程为什么会占用这么多资源.

UNIXLINUX,可以使用iostat,top,vmstat,topas,ps等查看资源使用信息.

Vmstat的输出信息中, 如果 r CPU数量的4倍或经常大于系统中CPU的数量,且id经常少于40,表示CPU的负荷能力不足,则需要考虑增加CPU数量或提高其性能.否则,系统将会变慢. 如果系统占用CPU时间(sy)是用户占用CPU时间(us)两倍以上,则系统面临缺少CPU资源.

如果disk繁忙百分值经常处于比较高的状态, 且在 b中的队列大于3, 表示 io性能不好。
如果pipo 长期不等于0 sr一直大于200 pages每秒,表示内存不足。

如果page段的pi超过每秒5次,说明换页太频繁,可能是内存不足;如果page段的sr/fr太高,说明系统中活动子系统太多,要扫描多个页面,才能释放一个空页;页面的调入和调出不仅发生的内存和交换区之间,而且发生在内存和硬盘之间,在用-s的输出后,如果发生在交换区的调入调出和全部的调入调出接近,说明系统的交换区有问题,需要加内存或在不同的硬盘上建交换区。

Iostat输出的信息中,如果%user+%sys>80%,说明CPU处理能力不足。另外如果两者之和为100%时,即%idle%wait0,说明很可能有无限循环的程序在执行。接着可用ps 观察哪个进程的%cpuTIME值较高,找到大量占用CPU的进程,对其进行优化。

top的输出信息中,可以查看单个进程的详细信息.如某个进程占用CPU和内存很高,则可以对该进程进行分析

iostat命令:

iostat反映了终端、磁盘I/O情况和CPU活动。输出结果的第一行是(引导)以来的时间统计信息。接下去的每一行是interval时间段内的统计信息。 iostat的默认参数是tdc(terminal, disk, and CPU)。如果任何其他的选项被指定,这个默认参数将被完全替代,例如,iostat -d将只反映磁盘的统计结果。 iostat生成四种类型的报告,tty CPU 使用率报告、磁盘使用率报告、系统吞吐量报告和适配器吞吐量报告。

语法:
基本语法: iostat <options> interval count
option -
让你指定所需信息的设备,像磁盘、cpu或者终端(-d , -c , -t or -tdc ) x 选项给出了完整的统计结果(gives the extended statistic)。
interval -
在两次统计信息之间的时间间阁(秒)。
count -
就是总共需要统计几次.

每一份后继报告都包含在和前一份报告的时间间隔之间收集的统计信息。Count 参数可被指定来连接 Interval 参数。如果指定了 Count 参数,它的记数值就确定在 Interval 秒间生成的报告数。如果指定了 Interval 参数但没有 Count 参数,iostat 命令就会不断生成报告。

tty CPU 使用率报告:

tin : 显示了系统为所有 tty 读取的字符总数。

tout: 显示了系统为所有 tty 写入的字符总数。

%user: 显示了在用户级(应用程序)执行时占用CPU时间的百分比。

%sys: 显示了在系统级(内核)执行时占用CPU时间的百分比。

% idle: 显示了在 CPU 空闲并且系统没有未完成的磁盘 I/O 请求时的时间百分比。

%iowait: 显示了 CPU 空闲期间系统有未完成的磁盘 I/O 请求时的时间百分比。

wait : average number of transactions waiting for service (Q length)
actv : average number of transactions actively being serviced (removed from

the queue but not yet completed)

svc_t : average service time
%w :percent of time there are transactions waiting for service (queue non-empty)
%b : percent of time the disk is busy (transactions in progress)

磁盘I/O使用率报告: 提供了在每个物理磁盘基础上的统计信息。

% tm_act: 表示物理磁盘处于活动状态的时间百分比.

kbps : 表示以 KB /每秒为单位的传输(读或写)到驱动器的数据量。

tps : 表示每秒钟输出到物理磁盘的传输次数。一次传输就是一个对物理磁盘的 I/O 请求。多个逻辑请求可被并为对磁盘的一个单一 IO 请求。

kb_read: 读取的 KB 总数。

kb_wrtn: 写入的 KB 总数。

r/s : reads per second
w/s : writes per second
Kr/s : kilobytes read per second
Kw/s : kilobytes written per second

通过kbps列和tps列的值我们可以知道哪些磁盘比较忙,哪些磁盘比较闲。

Solaris:

# iostat

tty dad0 fd0 sd0 nfs1 cpu

tin tout kps tps serv kps tps serv kps tps serv kps tps serv us sy wt id

0 107 42 6 132 0 0 0 0 0 3 0 0 0 1 1 5 94

# iostat -xtc 2 2

extended device statistics tty cpu

device r/s w/s kr/s kw/s wait actv svc_t %w %b tin tout us sy wt id

dad0 0.4 5.3 5.6 33.3 0.7 0.1 131.8 1 4 0 98 1 1 4 94

fd0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0

extended device statistics tty cpu

device r/s w/s kr/s kw/s wait actv svc_t %w %b tin tout us sy wt id

dad0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0 0 225 0 0 0 100

fd0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0

AIX:

# iostat

tty tin tout avg-cpu % user % sys % idle % iowait

0.0 26.0 15.4 1.2 79.8 3.6

Disks % tm_act Kbps tps Kb_read Kb_wrtn

hdisk0 1.7 14.1 3.5 80880 11119296

hdisk1 4.9 248.4 14.4 157705902 39691592

cd0 0.0 0.0 0.0 0 0

vmstat命令:

vmstat : 输出关于内核线程的统计信息,包括处于运行和等待队列中的、内存中的、页面调度中的、磁盘中的、中断、系统调用、上下文切换和 CPU 活动的内核线程。

语法:
vmstat <options> interval count
如果没有指定选项,将会显示进程、内存、页、磁盘、中断和CPU信息

interval - 在两次统计信息之间的时间间阁(秒)。
count -
就是总共需要统计几次.
kthr内核线程状态在采样间隔期间每秒钟更改一次。

r: 置于运行队列中的内核线程数目。

b: 置于等待队列(等待资源、等待输入/输出)的内核线程数目。

w: 可以进入运行队列但被替换的进程

内存

AIX:

关于使用虚拟内存和实内存的信息。如果虚拟页已经被访问的话,虚拟页可以被认为是活动的。一页为 4096 个字节。

avm: 活动虚拟页。

fre: 空闲列表的大小。一般不少于120,fre少于120,系统开始自动的kill进程去释放

Solarix:

swap:现在可用的交换内存(k表示)(si: swapped in (Kb/s). so: swap outs (Kb/s)).

free: 闲的内存(k表示)

page:关于缺页故障和调页活动的信息.

re : 页面调度程序从空闲页中回收的页面.

pi : swap调度进的页面数.

po: 调出到swap的页面数.

fr: 空闲的页面数(页面替换).

sr: 通过页面置换算法扫描到的页面数.

cy: 按页置换算法的时钟周期.

mf: 非严重错误的页面.

de: 提前读入的页面中的未命中数.

故障: 平均每秒的捕获和中断率。

in : 设备中断 .

cy : 系统调用.

cs : 内核线程上下文切换.

CPU

us: 显示了在用户级(应用程序)执行时占用CPU时间的百分比。

sy: 显示了在系统级(内核)执行时占用CPU时间的百分比。

id: 显示了在 CPU 空闲并且系统没有未完成的磁盘 I/O 请求时的时间百分比。

wa: 显示了 CPU 空闲期间系统有未完成的磁盘 I/O 请求时的时间百分比。

磁盘:

disk 显示每秒的磁盘操作。 s表示scsi盘,0表示盘号


Solaris:

# vmstat

kthr memory page disk faults cpu

r b w swap free re mf pi po fr de sr dd f0 s0 -- in sy cs us sy id

0 0 0 587680 145568 1 2 7 10 10 0 0 6 0 0 0 425 188 109 1 1 98

Linux:

# vmstat

procs memory swap io system cpu

r b w swpd free buff cache si so bi bo in cs us sy id

1 0 0 208036 62804 104852 262956 0 1 3 2 2 14 1 0 4

AIX:

# vmstat

kthr 内存 故障 cpu

----- ----------- ------------------------ ------------ -----------

r b avm fre re pi po fr sr cy in sy cs us sy id wa

1 2 324253 395413 0 0 0 11 25 0 298 3794 463 15 1 80 4


top
命令:

top命令可以输出:

1.系统基本资料:时间,上线人数,负载. CPU的使用情况. 内存的使用情况. swap的使用情况.

统计Process的状况及负载最重要的一些Process的详细信息.

格式
top [
] [d delay] [q] [c] [S] [s] [i] [n]

d:指定更新的间隔,以秒计算。
q
:没有任何延迟的更新。如果使用者有超级用户,则top命令将会以最高的优先序执行。
c
:显示进程完整的路径与名称。
S
:累积模式,会将己完成或消失的子行程的CPU时间累积起来。
s
:安全模式。
i
:不显示任何闲置(Idle)或无用(Zombie)的行程。
n
:显示更新的次数,完成后将会退出top

top命令的输出信息中:

PIDProcess ID):进程标示号。
USER
:进程所有者的用户名。
PRI
:进程的优先级别。
NI
:进程的优先级别数值。
VIRT
:进程占用的虚拟内存值。
RES
:进程占用的物理内存值。
SHARE
:进程使用的共享内存值。

SIZE:进程占用的工作段大小,以KB为单位

RSS:进程占用的实存数量多少,以KB为单位
S
:进程的状态,其中S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值是负数。
%CPU
:该进程占用的CPU使用率。
%MEM
:该进程占用的物理内存和总内存的百分比。
TIME
:该进程启动后占用的总的CPU时间。
Command
:进程启动的启动命令名称,如果这一行显示不下,进程会有一个完整的命令行。

说明: 占用CPU和内存很多的PROCESS,是我们解决问题时需要特别注意的PROCESS

AIX,topas命令可以查看这些详细信息.

Linux:

#top

13:19:36 up 20 days, 21:07, 3 users, load average: 0.00, 0.00, 0.00

66 processes: 64 sleeping, 2 running, 0 zombie, 0 stopped

CPU states: 0.0% user 0.0% system 0.0% nice 0.0% iowait 100.0% idle

Mem: 513808k av, 451276k used, 62532k free, 0k shrd, 105000k buff

318880k actv, 1672k in_d, 17980k in_c

Swap: 1052248k av, 208036k used, 844212k free 263060k cached

PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME CPU COMMAND

1 root 15 0 104 76 56 S 0.0 0.0 0:04 0 init

2 root 15 0 0 0 0 SW 0.0 0.0 0:01 0 keventd

3 root 15 0 0 0 0 SW 0.0 0.0 0:00 0 kapmd

7.3 NC5X的监控工具sysMonitor

如运行Nchome/bin/ sysMonitor.bat:

输入应用服务器的IP地址及端口 , 选中数据库连接” ,然后刷新”, 可以看到数据连接信息.

选中”SQL日志”, 刷新, 可以看到连接的详细信息.

选中虚拟机”, 刷新,可以查看内存的使用情况

设置功能主要是针对不同的客户端登录IP,输出该客户端的信息.

启用SQL跟踪后,会根据下面SQL运行时间的设置,输出对应的SQL, 输出文件在NC安装目录nclogs目录下的

sql-log[0].log文件中. (: NC502版本中提供了该功能. )

8 WAS的日常管理维护问答

IBM Webshpere 简称WAS,是一个容易管理和维护的中间件。其在国内的市场占有率超过weblogicNC5.0版本开始全面支持WAS中间件,向用户提供更好的服务。

在日常的管理和维护中,管理人员可能遇到不同的问题,为了便于大家对WAS维护有有进一步了解。此文粗略介绍一下。本文采用问题方式介绍WAS的管理以及NC5.0维护工作。

1WAS的安装有那几种方式?

WAS的安装方式有界面模式安装和安静模式安装。安静模式安装需要配置“reponsefile”,设置安装参数安装,这种模式适合于高级用户安装,或者无法输出安装安装界面的用户使用。例如

Install.exe -options "D:\installImage\WAS\responsefile.nd.txt" –silent

界面安装模式适合大多安装场合,安装向导引导用户一步一步进行安装。界面安装一种是运行launchpad.exe,运行launchpad需要有浏览器,windows环境都有默认浏览器,unixlinux环境没有安装浏览器或没有设置默认浏览器时,需要现设置浏览器。如“export firefox=/opt/firefox”。

界面安装的另一种方式是直接到WAS目录下运行install.exe。启动安装向导进行安装。

2、安装WAS时需要注意什么?

安装WAS时,WASwindows环境默认安装路径“c:\program files\IBM\Websphere”,这个默认安装路径是不被NC应用所支持,NC应用要求安装简单,不要有空格,不要有下划线,不要有连接线等特殊路径。所以WAS不能安装到默认路径下。通常情况下下列特殊符号包括“`”“~”“!”“@”“#”“$”“%”“^”“&”“*”“(”“)”“-”“_”“+”“=”“{”“}”“[”“]”“\”“|”“;”“:”“”“”“,”“.”“/”“?”“中文”不能命名成安装路径。

安装WAS的另一个要求是网络设置。通常情况下要保证网络链接。如果服务器上有2块或更多网卡,这些网卡如果被启用了,要保证正确分配了IP地址,有正常的网络连线链接。如果某块网卡没有物理连线或正常IP地址设置。就要将该网卡设置为禁用状态。

设置合理的IP地址,一般部署NC应用的服务器需要设置成固定IP地址,固定IP地址有利于以后的管理和访问。同时正确维护hosts文件。Unix/Linux环境下,维护hosts文件由为重要。正确维护hosts文件才能保证WAS的正常启动与访问。

主机名称要简单简介。通常情况下不要特殊符号命名主机名称。特殊符号包括“`”“~”“!”“@”“#”“$”“%”“^”“&”“*”“(”“)”“-”“_”“+”“=”“{”“}”“[”“]”“\”“|”“;”“:”“”“”“,”“.”“/”“?”“中文”。

安装好WAS建立了profile了,又进行了主机名变更,会出现WAS无法正常启动问题,这个profiles已经坏掉了。用户需要重新建立一个profiles来使用。这一点在今后的维护中需要注意。

3、如何选择建立不同profile

Profiles是指WAS管理部署针对不同应用特点预置的各种模板,用户根据具体应用特点选择不同模板建立不同的ProfilesProfiles又称概要文件。WAS的预置profile模板保存在安装目录的profileTemplates下。

常用的模板有主要有两种类型,一种是dmgr管理型模板,一种是default型模板。通常情况下,将NC部署成一个独立应用时,我们选择default型模板建立profiles就可以了。

如果要将NC部署成集群环境,就需要建立dmgrprofiledefaultprofile。每个profile中都有自己独立的配置文件,执行文件,日志文件等。不同的defaultprofile可以注册到dmgrprofile中,接受dmgr管理,这就所谓WAS建立集群。

根据服务器硬件配置和操作系统情况,一般服务器CPU多于3颗以上,内存多于4G以上时我们可以考虑部署两个profiles或两个进程运行NC应用。

建立不同profile方法有3种,一种是在安装产品过程中选择不同类型profile;一种是windows或其他32位平台下,如linux环境都在WAS的安装目录bin\profilemanagement目录下提供了pmt.bat pmt.sh命令,这是一个有交互界面的建立profile工具;另一种是命令行方式的工具manageprofiles.batmanageprofiles.sh。用户在使用此命令时可以输入 –help

参数得到相关帮助。

4WAS的控制台在什么安装?

WAS的控制台是用户管理WAS的平台。新的WAS6.1安装过程有个选择参数,提示用户是否安装控制台,系统默认安装控制台。通常情况下,用户部署独立的NC应用,这时候就要选择安装控制台。

集群环境,用户需要建立一个dmgr的管理profile,这个dmgr类型profile需要安装控制台。其他default类型profile不需要安装控制台,加入到集群后,统一接受dmgr管理。

所以说WAS控制台在某些情况下不需要安装,dmgrprofile必须安装控制台。

5、如何进入WAS控制台?

WAS控制台是WAS提供的一个应用,可以通过浏览器登录到控制台。默认控制台的发布端口是9060。如:http://127.0.0.1:9060/ibm/console

6、使用什么样浏览器?

在登录控制台时,会根据系统的不同时区自动切换语言。偶然情况下管理控制台时使用IE浏览器会出现缓存刷新或版本差异问题,推荐用户使用firefox浏览器。用户可以登录到http://www.firefox.org上下载。

7WAS的补丁在什么可以找到?

IBM的补丁定期发布在IBM的官方网站上,NC推荐使用的WAS的版本是6.1。用户根据WAS的不同版本选择下载对应的新的补丁。对应链接是http://www-306.ibm.com/software/webservers/appserv/was/support/

NC应用的发版说明中有详细版本要求,并且会在提供的产品安装盘中提过经过严格测试的WAS版本和对应补丁,这些补丁是推荐用户安装的。其他版本补丁需要根据项目特殊需要,特殊问题再打到WAS应用上。

8、如何向WAS中间件打补丁?

WAS的补丁定期发布的,没有管理经验的用户不推荐安装新的补丁。

WAS补丁更新需要使用专用工具,就updateinstaller,此工具在WAStoolsupdateinstaller下有安装盘中有安装程序。

Updateinstaller安装好后,在对应目录下有update.bat命令。运行update命令通过向导安装补丁。向导的第一部分选择WAS的安装路径,接着选择WASpatch包。Patch包的扩展名都是pak结尾。

在安装过程中update会检查操作系统版本,磁盘空间大小,当前需要更新补丁的WAS是否在运行。当出向上述任何问题时,会提示对应信息。回退一步,处理问题后,可以继续安装。

补丁的卸载也是在update中执行的。卸载补丁时有先后顺序。只能先卸载最后安装的补丁。

9、在什么地方停止启动服务?

WAS的服务进程可以通过命令行方式启动或停止。如在profiles\AppSrv01\bin下运行stopServer.bat server1,即停止server1服务了。运行startServer.bat server1就启动server1服务了。具有安全控制的profiles,在停止服务器时,还会提示管理用户和密码信息。运行stopServer.bat server1 –username admin –password admin可以直接停止server1

集群环境下,服务的停止启动可以通过控制台集中管理。不需要登录到每台服务器上运行命令。命令行模式也是支持,但这时需要注意服务的名称。我们在建立集群时定义的各个服务的名称有所不同了,这时的服务名称已经不是server1了,stopServer.bat时的名称可能是nc01,nc02了。

WAS集群环境中,用户登录控制台http://127.0.0.1:9060/admin。在“服务器”菜单中找到“应用程序服务器”。在此可以选择需要停止或启动的服务器,做停止或启动操作。

10、在什么地方停止启动agent

Agent是部署WAS集群时启动的一个监控管理进程。普通型的profile中不需要,也无法启动agentAgent的停止启动方法是stopNode.batstartNode.bat。如我们进入WAS的安装目录下profiles\AppSrv01\bin。执行startNode.bat就启动agent了。

另外登录到控制中,选择“系统管理”菜单中“Node agent”节点可以停止agent。但是agent停止后就不能再启动了。推荐在控制台管理中对agent选择重新启动操作。

11、部署NC50过程如何?

NC50WAS环境中的部署过程根据单机,垂直集群或水平集群不同略有差异。下面分别介绍单机和集群部署情况。垂直集群和水平集群差异不大。

单机独立应用环境,在建立profile选择default型概要文件,这种环境部署也简单。

1. 启动服务,运行startserver.bat server1

2. 运行wasSysConfig.bat 我们在界面选择“Deployment”页签,选择读取按钮后选择修改按钮,选择wasinfomation页签,在profiles输入框中参照输入具体的profile路径。如c:\IBM\WebSphere\AppServer\profiles\AppSrv01。注意一定要指定具体的profile上。系统会提示参数发生变化,确定后会退出工具。

3. 重新启动wasSysConfig.bat。在保证服务启动的情况下,运行wasSysConfig.bat,选择“server”,点击“从was读取”按钮,工具自动从was环境中读取相关配置信息,包口地址,端口,服务名称等。如果管理中没有使用https,要求将https协议行配置删除,将读取的机器名称维护成ip地址。点保存按钮。

4. 选择“service”页签,选择读取按钮后选择修改按钮,再选择添加按钮,在此我们注册各种后台需要运行的服务。

5. 在保证was启动的状态下,我们运行wasSysConfig.bat。选择“Deployment”页签,点击读取按钮,点击生成ejb按钮,系统会提示正在生成ejb进度提示。最后提示完成。之后点击部署ejb 按钮,系统会提示正在部署ejb进度提示,最后提示部署完成。

6. 部署完成后,我们运行stopserver.bat server1;停止服务,再运行startserver.bat server1

集群环境部署较单机独立应用复杂些,需要先建立was集群再进行部署,下面介绍每部操作。

1. 假定was的管理服务器为10.10.10.1。先建立一个dmgr管理型的profile,例如命名为dmgr01。运行cmd进入到dmgr01bin目录下,如c:\IBM\WebSphere\AppServer\profiles\dmgr01\bin下,我们运行startManager.bat

2. 在第2台服务器10.10.10.2上建立defaultprofile。例如AppSrv01。运行cmd 进入c:\IBM\WebSphere\AppServer\profiles\AppSrv01\bin下。运行addnode.bat 10.10.10.1。这里的10.10.10.1是指安装dmgr01的服务器地址。执行这部操作将AppSrv01加到了dmgr01中接受管理。以便后面建立集群操作。重复上面操作将第3台服务器10.10.10.3加入到dmgr01中管理。在addnode操作过程,系统会自动启动agent了。相当于手动启动startNode.bat操作。

3. 登录dmgr01console。如http://10.10.10.1:9060/ibm/console。打开服务器菜单,选择“集群”。点击增加按钮,开始建立集群,输入集群名称“ncCluster”,点击下一步,输入成员名“master”,设置权重为“0”,这时的服务器默认选择节点是第2台服务器。点击下一步,输入节点名称“node01”,输入权重“10”,同时选择节点下拉框中选择第3台服务器。再选择添加成员按钮。最后点击下一步和确定按钮。这样就完成建立集群的过程。操作系统时钟上要有部署master的服务器的系统时钟要比其他服务器的系统时钟慢12分钟,这是做同步数据缓存的需要。但也不能差异太大,因为在建立WAS集群时要求每台服务器间时间上差异小于5分钟以内。

4. NC产品需要在dmgr01的服务器上安装,例如nchomec:\ufida50。先进入c:\ufida50\bin下,运行wasSysConfig.bat。选择Deployment页签,点击读取,再点击修改按钮,选择“wasinfomaion”页签,点击参照按钮选择路径至“c:\IBM\WebSphere\AppServer\profiles\dmgr01目录,再将“cluster”标志打上。最后做保存操作,系统会提示退出。

5. 重新启动wasSysConfig.bat,选择“server”页签,点击“从was读取”按钮,这时候配置工具会自动读出整个集群的有关配置。我们点击修改按钮,在服务器下拉框中先选择“master”,将主服务器标志打上,将https行配置去掉,将服务器名称修改成ip地址。依次我们选择“node01”,将https配置去掉,将服务器名称维护成ip地址。最后按保存。另外为了提高访问速度,将每台服务器的hosts文件也维护完整。将集群的各个服务器包括dmgr服务器和数据库服务器的地址和名称都维护进来。

6. 运行wasSysConfig.bat,选择DataSource,根据具体数据库类型,版本选择数据库驱动,配置有关信息,注意如果没有特殊需要不配置成XA数据源。NC的应用都是非XA数据源。

7. 运行wasSysConfig.bat,选择选择“service”页签,选择读取按钮后选择修改按钮,再选择添加按钮,在此注册各种后台需要运行的服务。这里注册的服务仅能部署在普通服务器上,不能部署在“master”上。

8. 退出wasSysConfig.bat,将nchome同步复制到第2台和第3台服务器上,路径和dmgr上的路径保持一致。

9. 在此先保证dmgr和各个服务器agent是启动状态,如果发现agent没有启动需要到各个服务器上手动运行startNode.bat命令启动agent。运行wasSysConfig.bat,选择“Deployment”页签,点击读取按钮,点击生成ejb按钮,系统会提示正在生成ejb进度提示。最后提示完成。之后点击部署ejb 按钮,系统会提示正在部署ejb进度提示,最后提示部署完成。之后需要等待12分钟,不要马上停止服务器或停止agent的操作,这时候was在完成部署同步操作。

10. 登录dmgr01console。如http://10.10.10.1:9060/ibm/console。打开“系统管理”菜单,选择“node agent”。在这里将全部agent都选择,点击重新启动按钮。将agent重新启动,这是因为有些配置在节点级别。必须重新启动agent。之后打开服务器菜单,选择“应用服务器”,我们先选择“master”服务器,点击启动按钮。之后选择“node01”服务器,点击启动按钮这样服务器启动完成。

12、如何生成IHS的插件?

WAS提供了专业的web服务器就是apache。在apache上又扩展了些管理功能,成为IBM HTTP Server。简称HIS。首先在HIS的服务器上同时部署了agent。在dmgr就可以实现插件同步,停止启动webserver操作。

每次部署nc应用后都需要生成部署一次插件。生成部署插件的过程如下:

1. 选择企业应用菜单,点击“nc50”企业应用。选择“虚拟主机”,选择“nc50”和“default_host”,点击确定按钮。注意在此处不要先做保存操作。

2. 选择“管理模块”,同时选择住“cluster”和“webserver1”,对下面列的模块全部选择,点击应用按钮,之后点击确定按钮。

3. 完成上述操作后,将全部变更保存。

4. 选择应用服务器菜单,选择webserver服务器。点击webserver1,点击生成插件按钮,点击传播插件操作。

5. 如果在IHS上部署了agent,在webserver服务器管理中,可以实现停止,再启动操作。如果没有部署agent,就只能手动停止,启动apache了。

13如何向NC50应用打补丁?

标志的nc5x的补丁同nc标准产品安装盘一样,需要安装才能更新的。安装过程先选择nchome目录,对应脚本和代码文件会更新到指定的地方。

如果有相关数据库的更新操作,安装完补丁后需要登录帐套管理,对相关帐套做升级操作才算打完补丁。

NC的补丁绝大部分不需要做ejb生成和ejb部署操作,但是有部分部署会需要重新生成客户端jar文件或者注册的接口发生变更等就需要重新生成ejb。对于nc中间件而言,在系统启动时会自动检查到这一点,会自动自行相关操作,并完成启动。对was而言需要用户,需要先做文件同步,运行wasSysConfig.bat,生成ejb部署ejb。最后在重新做应用和webserver的绑定,生成插件,传播插件。才算完成补丁的更新。

-------------------
A Contre Courant