在Linux上安装ORACLE已经有个把月了,自己一个人数次碰壁过后,终于先后成功安装了Oracle11g,Oracle10g。没有时间写STEP BY STEP了,那些步骤可以看ORACLE的安装指南。Fedora是RedHat的社区版本,不在Oracle for Linux的认证范围内,因此安装起来会有些挫折。我使用的版本为Fedora 9。下面提几点注意事项:
1.为了保证安装顺利进行,需要更改redhat-release文件,将其内容改为Redhat对应版本。之所以先安装11g的原因是:Oracle 11g安装检测比较完善,可以提示缺少那些安装包。
2.安装的先决条件:Oracle的安装本身很简单,困难的是需要在Fedora安装许多软件包,这些包提供了ORACLE的编译和运行环境,可以按照ORACLE BASE的Oracle Fedora安装指南来安装这些软件包,但也没那么完美,还是有很多的包在安装过程中才发现没有安装,一般情况下开启另一个终端安装完成后就可以继续进行。
3.注意安装的版本选择,区分32位和64位的机器,学会查看 make.log,在安装11g的时候,78%的时候碰到一个错误,一直安装不下,搜索后发现,自己选用的安装版本错了,根据需要重新选择了x86_64的版本进行安装才成功。
4.修改必要的环境变量,Oracle10g 出现的乱码问题可以使用 unset LANG LANGUAGE命令设置后安装。
5.安装失败的卸载:我经历了多次的安装失败,ORACLE的卸载比较简单,直接将安装目录整个干掉,重建一下目录,对于有安装成功的历史版本,还需要在/etc/目录下查找几个有关的ora*文件,删除即可重新安装。
6.Oracle 10gR2 x86_64在安装过程可能会碰到错误Error in invoking target 'collector' ins_emdb.mk,
具体原因:
http://forums.oracle.com/forums/thread.jspa?messageID=2478830
Tested installation on Fedora 8 x86_64. I've got the same error during linking of nmccollector.
In fact you don't need nmccollector as:
1) you are installing Oracle on non certified system for Oracle so it will be not probably in production
2) You can use "SQL Access" mode instead of "Memory Access" mode to check performance.
So you can ignore this error. If you apply patchset 10.2.0.3 or 10.2.0.4 then relink of nmccollector will be succesfull.
More about Memory Access Mode:
http://www.oracle.com/technology/pub/articles/10gdba/nanda_10gr2dba_part2.html
http://www.oracle.com/technology/pub/articles/10gdba/nanda_10gr2dba_part3.html
http://tonguc.wordpress.com/2007/08/20/memory-access-mode-of-oracle-enterprise-manager/
将此错误忽略继续安装可以正常完成。
2009年5月7日星期四
在 Fedora 9 安装 Oracle 10gR2, Oracle 11g 手记
2009年4月2日星期四
日期合法性校验函数
校验日期字符串,如果是合法的日期,则返回Date类型,否则返回null。
写法一:
--=========================================
--Usage:判断日期是否合法
--Param:字符串日期形式
--Return:
-- 如果日期合法,返回合法的Date型日期
-- 否则返回null值
--Auth:Jazz
--Date:2009-03-27
--=========================================
create or replace function CheckDate(date_in Varchar2) return Date is
begin
Return to_date(date_in,'yyyy-MM-DD');
exception
when others then
return (null);
end;
写法二:这种写法返回的是字符串,即传入什么返回什么,如果非法日期返回null。
create or replace function CheckDate(date_in Varchar2) return varchar2 is
chk_date varchar2(10);
begin
select to_date(date_in,'yyyy-mm-dd') Into chk_date from dual;
return(date_in);
exception
when others then
return (null);
end;
写法一:
--=========================================
--Usage:判断日期是否合法
--Param:字符串日期形式
--Return:
-- 如果日期合法,返回合法的Date型日期
-- 否则返回null值
--Auth:Jazz
--Date:2009-03-27
--=========================================
create or replace function CheckDate(date_in Varchar2) return Date is
begin
Return to_date(date_in,'yyyy-MM-DD');
exception
when others then
return (null);
end;
写法二:这种写法返回的是字符串,即传入什么返回什么,如果非法日期返回null。
create or replace function CheckDate(date_in Varchar2) return varchar2 is
chk_date varchar2(10);
begin
select to_date(date_in,'yyyy-mm-dd') Into chk_date from dual;
return(date_in);
exception
when others then
return (null);
end;
2009年4月1日星期三
海量数据库优化问题
最近处理了接近300万条的测试记录,优化前根据测试,出报表的速度很慢,使用了ORACLE的Explain Plan分析,发现建立的索引失效,ORACLE索引失效是比较常见的问题。有的是数据本身的构成(比如索引列存在大量的重复数据)问题,有的是对索引列施加了运算(比如函数运算)引起的,有的是SQL语句的写法不当造成的。从网上搜索了不少关于优化的文章,解决的问题也多种多样,够学习一段时间了!当然,SQL语句的写法关系也很大,下面从SQL语句入手以一个例子来分析下:
环境:
OS:Windows XP sp-2
CPU:Intel(R) Core2 Duo CPU 2.0GHz
物理内存:2G
ORACLE 10g
PL/SQL 7.0
优化前执行大概需要60s时间:
Select AGE,PERSON,nvl(ROUND((RATIO_TO_REPORT(Sum(Person)) OVER ())*100,2),'') pct From(
Select age ,person
From(
Select '00--16' As age,Count(*) As person From cca1 Where Round(months_between(Sysdate,birthday)/12) < 16 and district like :disCode Union All
Select '16--25' As age,Count(*) As person From cca1 Where Round(months_between(Sysdate,birthday)/12) >= 16 And Round(months_between(Sysdate,birthday)/12) < 25 and district like :disCode Union All--16-25
Select '26--35' As age,Count(*) As person From cca1 Where Round(months_between(Sysdate,birthday)/12) >= 25 And Round(months_between(Sysdate,birthday)/12) < 35 and district like :disCode Union All
Select '36--45' As age,Count(*) As person From cca1 Where Round(months_between(Sysdate,birthday)/12) >= 35 And Round(months_between(Sysdate,birthday)/12) < 45 and district like :disCode Union All
Select '46--55' As age,Count(*) As person From cca1 Where Round(months_between(Sysdate,birthday)/12) >= 45 Round(months_between(Sysdate,birthday)/12) < 55 and district like :disCode Union All
Select '55--++' As age,Count(*) As person From cca1 Where Round(months_between(Sysdate,birthday)/12) >= 55 and district like :disCode
)
)
Group By age,person
优化后大概需要1.57s时间:
Select AGE,PERSON,nvl(ROUND((RATIO_TO_REPORT(Sum(Person)) OVER ())*100,2),'') pct From(
Select age ,person
From(
Select '00--16' As age,Count(*) As person From cca1 Where birthday>add_months(Sysdate,-16*12) and district like :disCode Union All
Select '16--25' As age,Count(*) As person From cca1 Where birthday>=add_months(Sysdate,-25*12) And birthday<add_months(Sysdate,-16*12) and district like :disCode Union All--16-25
Select '26--35' As age,Count(*) As person From cca1 Where birthday>=add_months(Sysdate,-35*12) And birthday<add_months(Sysdate,-25*12) and district like :disCode Union All
Select '36--45' As age,Count(*) As person From cca1 Where birthday>=add_months(Sysdate,-45*12) And birthday<add_months(Sysdate,-35*12) and district like :disCode Union All
Select '46--55' As age,Count(*) As person From cca1 Where birthday>=add_months(Sysdate,-55*12) And birthday<add_months(Sysdate,-45*12) and district like :disCode Union All
Select '55--++' As age,Count(*) As person From cca1 Where birthday<add_months(Sysdate,-55*12) and district like :disCode
)
)
Group By age,person
因此,少对索引施加复杂运算可以利用到索引的优势。
此外,索引的like也很容易引起失效,比如 districtCode like '35________'不能利用索引失效,而使用 districtCode like '3501________'却又能使用上索引,根据推测这可能是因为在大量数据中,以第一种方式基本上实施全表搜索,优化器可能不使用索引。
环境:
OS:Windows XP sp-2
CPU:Intel(R) Core2 Duo CPU 2.0GHz
物理内存:2G
ORACLE 10g
PL/SQL 7.0
优化前执行大概需要60s时间:
Select AGE,PERSON,nvl(ROUND((RATIO_TO_REPORT(Sum(Person)) OVER ())*100,2),'') pct From(
Select age ,person
From(
Select '00--16' As age,Count(*) As person From cca1 Where Round(months_between(Sysdate,birthday)/12) < 16 and district like :disCode Union All
Select '16--25' As age,Count(*) As person From cca1 Where Round(months_between(Sysdate,birthday)/12) >= 16 And Round(months_between(Sysdate,birthday)/12) < 25 and district like :disCode Union All--16-25
Select '26--35' As age,Count(*) As person From cca1 Where Round(months_between(Sysdate,birthday)/12) >= 25 And Round(months_between(Sysdate,birthday)/12) < 35 and district like :disCode Union All
Select '36--45' As age,Count(*) As person From cca1 Where Round(months_between(Sysdate,birthday)/12) >= 35 And Round(months_between(Sysdate,birthday)/12) < 45 and district like :disCode Union All
Select '46--55' As age,Count(*) As person From cca1 Where Round(months_between(Sysdate,birthday)/12) >= 45 Round(months_between(Sysdate,birthday)/12) < 55 and district like :disCode Union All
Select '55--++' As age,Count(*) As person From cca1 Where Round(months_between(Sysdate,birthday)/12) >= 55 and district like :disCode
)
)
Group By age,person
优化后大概需要1.57s时间:
Select AGE,PERSON,nvl(ROUND((RATIO_TO_REPORT(Sum(Person)) OVER ())*100,2),'') pct From(
Select age ,person
From(
Select '00--16' As age,Count(*) As person From cca1 Where birthday>add_months(Sysdate,-16*12) and district like :disCode Union All
Select '16--25' As age,Count(*) As person From cca1 Where birthday>=add_months(Sysdate,-25*12) And birthday<add_months(Sysdate,-16*12) and district like :disCode Union All--16-25
Select '26--35' As age,Count(*) As person From cca1 Where birthday>=add_months(Sysdate,-35*12) And birthday<add_months(Sysdate,-25*12) and district like :disCode Union All
Select '36--45' As age,Count(*) As person From cca1 Where birthday>=add_months(Sysdate,-45*12) And birthday<add_months(Sysdate,-35*12) and district like :disCode Union All
Select '46--55' As age,Count(*) As person From cca1 Where birthday>=add_months(Sysdate,-55*12) And birthday<add_months(Sysdate,-45*12) and district like :disCode Union All
Select '55--++' As age,Count(*) As person From cca1 Where birthday<add_months(Sysdate,-55*12) and district like :disCode
)
)
Group By age,person
因此,少对索引施加复杂运算可以利用到索引的优势。
此外,索引的like也很容易引起失效,比如 districtCode like '35________'不能利用索引失效,而使用 districtCode like '3501________'却又能使用上索引,根据推测这可能是因为在大量数据中,以第一种方式基本上实施全表搜索,优化器可能不使用索引。
ORACLE数据文件迁移与删除方法
近日由于硬盘空间紧张,需要将ORACLE数据文件移动位置,使用的版本是ORACLE 10g,先将过程做个记录。
1. alter tablespace tablespace_name offline;[表空间脱机]
2. 将数据文件移动到新的目录;
3. alter tablespace tablespace_name rename datafile 'D:\oracle\product\10.2.0\oradata\orcl\FILE.ORA' to 'E:\DataBase\oradata\orcl\FILE.ORA';[数据文件重命名]
4. alter tablespace tablespace_name online;[表空间联机]
如果需要将不再使用的数据文件删除,可以使用如下方法:
drop tablespace tablespace_name including contents and datafiles;
需要注意的是,在设计中,一般将数据表空间和索引表空间分离,所以,迁移或删除的时候要记得指定两个表空间的名字进行操作。
1. alter tablespace tablespace_name offline;[表空间脱机]
2. 将数据文件移动到新的目录;
3. alter tablespace tablespace_name rename datafile 'D:\oracle\product\10.2.0\oradata\orcl\FILE.ORA' to 'E:\DataBase\oradata\orcl\FILE.ORA';[数据文件重命名]
4. alter tablespace tablespace_name online;[表空间联机]
如果需要将不再使用的数据文件删除,可以使用如下方法:
drop tablespace tablespace_name including contents and datafiles;
需要注意的是,在设计中,一般将数据表空间和索引表空间分离,所以,迁移或删除的时候要记得指定两个表空间的名字进行操作。
2009年2月16日星期一
MySQL 8 小时掉线问题
最近利用空闲时间写了个小站,虽然简单,却也碰到了不少的问题。网站从需求、设计、实现、布局,修修补补,总算是挂上去了。可以访问www.belitastone.com.
其中MySQL 8 小时掉线问题困扰了我几天,原理就不说了,网上有详细介绍,网上搜索资料后,大概有几种解决办法:
(1)修改My SQL服务器配置,my.ini文件,可惜我是挂在万网的虚拟主机,没办法,改不了。
(2)使用数据库URL连接串的autoReconnect=true参数来自动重新连接,这对版本Mysql 4.x有效,虽然我用的版本也是4.X,但却没有生效。据说Mysql官方还不赞成这种方式,Mysql5.x就不支持了。
(3)使用CP30数据库连接池,折腾两次,最后查了下C3P0的文档才成功。现在将方法3的配置记录下来,以备参考。
首先,需要引用c3p0包,其次,在Hibernate的hibernate.cfg.xml中做如下配置:
<property name="hibernate.connection.provider_class">
org.hibernate.connection.C3P0ConnectionProvider
</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">30</property>
<property name="hibernate.c3p0.time_out">1800</property>
<property name="hibernate.c3p0.max_statement">50</property>
<property name="hibernate.c3p0.acquire_increment">1</property>
<property name="hibernate.c3p0.idle_test_period">120</property>
<property name="hibernate.c3p0.validate">true</property>
2008年12月23日星期二
WebService中的跨系统图片查询及显示服务实现
系统A提供图片和相关文字信息查询服务,系统B需要调用系统A的服务,得到相关文字信息和二进制图片信息,并需要将图片在系统B进行显示,下面介绍具体的实现方式和思路:
1.服务端代码
服务端代码从Oracle中读出Blob数据,使用BASE64算法编码,BASE64编码将数据按6位分组,转化为2^6共64个字符(A..Z,0..9和其他字符等),关于编码的具体细节,可以查阅相关资料。这里需要注意的是当数据库查不到图片的时候,处于数据冗余考虑,我们希望用一张存放在服务器上的默认图片来代替,而不采用在每条记录插入默认BLOB数据;这张默认图片同样需要采用BASE64算法编码,并传送给服务调用端。要注意的问题是关于图片的相对路径如何定位。
这段代码将Blob数据转化为byte[]数组,并使用BASE64Encoder 编码,将编码后的字符串组合到XML中以便传送。
2.调用端代码
调用端代码其实和普通的服务调用相同,只是将服务器的图像编码解码,得到byte[],并将这些数据存储到上下文,供图片解析Servlet来处理。为什么要将图片存储到上下文?因为图片不是从本地数据库读取,它只是以字节数据的形式临时存储到本地服务器内存中,可能的做法是给它生成一个文件存储到硬盘,但这样要频繁操作IO,而且相对路径难以处理,存储到上下文也许是比较好的选择,当然,你可能需要控制图片的数据量,对于正常的业务,这种做法已经可以承受大部分的需求了。
3.图片显示
通过Servlet从上下文取出图片数据,并输出到前台
这样,就可以实现Web Services远程调用的图片传输了。
1.服务端代码
服务端代码从Oracle中读出Blob数据,使用BASE64算法编码,BASE64编码将数据按6位分组,转化为2^6共64个字符(A..Z,0..9和其他字符等),关于编码的具体细节,可以查阅相关资料。这里需要注意的是当数据库查不到图片的时候,处于数据冗余考虑,我们希望用一张存放在服务器上的默认图片来代替,而不采用在每条记录插入默认BLOB数据;这张默认图片同样需要采用BASE64算法编码,并传送给服务调用端。要注意的问题是关于图片的相对路径如何定位。
/* -----------------------*
* 处理照片数据
* -----------------------*/
BASE64Encoder encoder = new BASE64Encoder();
InputStream is = null;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
String picData = "";
Blob pic = ent.getZp0000();//
try{
//图片文件为空的时候,使用默认图片代替,在普通的Java类中访问服务器的图片,
//其相对路径要使用类装载器来定位
if(null==pic || pic.length()<2L){
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
if (classLoader == null) {
classLoader = WsLocationConfig.class.getClassLoader();
}
is = classLoader.getResourceAsStream("no_pic.jpg");
int c = 0;
while((c=is.read())!=-1){
baos.write(c);
}
byte[] buff = baos.toByteArray();
picData = encoder.encode(buff);
System.out.println(picData);
}else{
byte[] buff = pic.getBytes(1L, new Long(pic.length()).intValue());
picData = encoder.encode(buff);
System.out.println(picData);
}
}catch(SQLException e){
System.out.println(e.getMessage());
e.printStackTrace();
}catch(FileNotFoundException e){
System.out.println(e.getMessage());
e.printStackTrace();
}catch(IOException e){
System.out.println(e.getMessage());
e.printStackTrace();
}
reXML.append("<?xml version=\"1.0\" encoding=\"GBK\"?>");
reXML.append("<person>");
reXML.append("<picture>").append(picData).append("</picture>");
reXML.append("</person>");
return reXML.toString();
这段代码将Blob数据转化为byte[]数组,并使用BASE64Encoder 编码,将编码后的字符串组合到XML中以便传送。
2.调用端代码
调用端代码其实和普通的服务调用相同,只是将服务器的图像编码解码,得到byte[],并将这些数据存储到上下文,供图片解析Servlet来处理。为什么要将图片存储到上下文?因为图片不是从本地数据库读取,它只是以字节数据的形式临时存储到本地服务器内存中,可能的做法是给它生成一个文件存储到硬盘,但这样要频繁操作IO,而且相对路径难以处理,存储到上下文也许是比较好的选择,当然,你可能需要控制图片的数据量,对于正常的业务,这种做法已经可以承受大部分的需求了。
/* ----------------------------*
* 图片处理
* ----------------------------*/
String picData = foo.elementText("picture");
String key = foo.elementText("idcard");
BASE64Decoder decoder=new BASE64Decoder();
byte[] data=decoder.decodeBuffer(picData);
PictureMap pcm = new PictureMap(key,data);
String html = htmlBuffer.toString();
xml.setHtml(html);
xml.setPicutre(pcm); //PictureMap是存储了图片的key值和byte[]图片数据的HashMap名-值对
//将图片放到上下文
request.getSession().setAttribute("picture", xml.getPicutre().getPictureMap());
============================
3.图片显示
通过Servlet从上下文取出图片数据,并输出到前台
import java.io.IOException;
import java.util.HashMap;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ReadXmlPicture extends HttpServlet{
private static final long serialVersionUID = 1L;
public void init(){
}
public void doGet( HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
HashMap map = null;
byte[] pic = null;
ServletOutputStream picDataToFront = null; //要输出的图片流
String key = req.getParameter("cid");//根据身份证查询
map = (HashMap)req.getSession().getAttribute("picture");
if(null==map){
return;
}
try{
pic = (byte[]) map.get(key); //取得照片
res.setContentType("image/jpeg");
picDataToFront=res.getOutputStream(); //获取输出流
for (int i = 0; i < pic.length; i++) {
picDataToFront.write(pic[i]); //输出到页面
}
picDataToFront.close(); //关闭输出流
}catch(IOException ioe){
System.out.println(ioe.getMessage());
ioe.printStackTrace();
}
}
public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException{
doGet(req,res);
}
public void destroy(){
}
}
这样,就可以实现Web Services远程调用的图片传输了。
使用Servlet显示存储在Oracle的Blob类型图片数据
要将图片数据保存到数据库中,一般的做法是上传图片到服务器的某个目录,而在数据库中存储图片的路径。当然这种做法简单、容易实现,且在数据库处于远程的情况下可以节省带宽,只要到网上一搜,可能是大部分人的首选做法。然而这种方法有几个弊端:1.图片不好索引,2.路径迁移会带来麻烦,3.数据完整性难以保证。
因此,必要的情况下,还需要将图片数据直接存储到数据库中,比如某些需要个人身份和照片确认的场合,这样做方便检索和变更。在ORACLE中有Blob格式可以存储任何大的二进制对象(图片就是这种格式)。下面我们按照图片上传保存、检索显示的步骤来介绍具体实现:
1.图片上传和保存(Struts+Hibernate)
[待续]
2.图片检索和显示(Hiberante+Servlet)
[待续]
因此,必要的情况下,还需要将图片数据直接存储到数据库中,比如某些需要个人身份和照片确认的场合,这样做方便检索和变更。在ORACLE中有Blob格式可以存储任何大的二进制对象(图片就是这种格式)。下面我们按照图片上传保存、检索显示的步骤来介绍具体实现:
1.图片上传和保存(Struts+Hibernate)
[待续]
2.图片检索和显示(Hiberante+Servlet)
[待续]
2008年12月4日星期四
软件设计师考试大纲 (2008年)
中级:软件设计师
上下午各2个半小时。上午试卷有15道必做题,内容包括:数据结构(如树和图的定义、存储和操作),程序语言及编译知识,操作系统理论知识(如进程、资源管理方法),软件工程基础知识(含面向对象方法,软件开发工具等),数据库基础知识(含SQL的使用),多媒体基础知识,网络基础知识,计算机体系结构,存储器系统,可靠性与系统评价,计算机专业英语等。这些试题涉及的内容比较广,有一定深度,也比较注重基础理论知识,考前应注意补充有关的知识以弥补自己的缺陷。
下午试卷中共有6题。前3题为有关的分析设计图(数据流图、程序流程图、系统流程图、ER图),可选做2题,要求考生按照题意填补图中的空缺,并回答若干问题。试卷中还有1道CASL汇编语言程序题和2道C语言程序题,都是必做题。程序题中给出了算法以及不完整的程序,要求填补空缺的语句。CASL汇编语言是从许多具体机型的汇编语言中抽象出来的一种简化的、专用于考试的汇编语言。在清华大学出版社出版的考试大纲书中以及在试卷中都含有CASL汇编语言文本。如果考生并没有学过、用过任何汇编语言,则需要花费一定的时间来学习和练习。
考试内容要求
知识点的掌握程度从深到浅可分五个层次,分别要求
为熟练掌握、掌握、理解、熟悉和了解。其中包括2个熟练
掌握(常用数据结构和常用算法、软件设计的方法和技术
)、8个掌握、2个熟悉,1个正确理解,具体体现在以下12
个方面:
(1) 掌握数据表示、算术和逻辑运算;
(2) 掌握相关的应用数学、离散数学的基础知识;
(3) 掌握计算机体系结构以及各主要部件的性能和
基本工作原理;
(4) 掌握操作系统、程序设计语言的基础知识,了
解编译程序的基本知识;
(5) 熟练掌握常用数据结构和常用算法;
(6) 熟悉数据库、网络和多媒体的基础知识;
(7) 掌握C程序设计语言,以及C++、Java、Visual
Basic、Visual C++中的一种程序设计语言;
(8) 熟悉软件工程、软件过程改进和软件开发项目
管理的基础知识;
(9) 熟练掌握软件设计的方法和技术;
(10) 掌握常用信息技术标准、安全性,以及有关法
律、法规的基本知识;
(11) 了解信息化、计算机应用的基础知识;
(12) 正确阅读和理解计算机领域的英文资料。
分析:相对于2001年考试大纲,新大纲对知识面的要
求更宽,更注重软件设计开发的实践能力,这一点充分体
现在下午考试中。考试内容除了技术要求外,还增加了对
软件工程实践能力、安全性、标准化、法律法规等方面知
识的要求,毕竟软件设计师是软件产业的骨干,因此考试
要求相对较高。
二、考试范围
考试科目1:计算机与软件工程知识
本部分包含以下内容:
l 计算机科学基础
l 计算机系统知识
l 系统开发和运行知识
l 安全性知识
l 标准化知识
l 信息化基础知识
l 计算机专业英语
1.计算机科学基础
1.1 数制及其转换
• 二进制、十进制和十六进制等常用制数制及其相互
转换
1.2 数据的表示
•(原码、反码、补码、移码表示,整数和实数的机
内表示,精度和溢出)
• 非数值表示(字符和汉字表示、声音表示、图像表
示)
• 校验方法和校验码(奇偶校验码、海明校验码、循
环冗余校验码)
1.3 算术运算和逻辑运算
• 计算机中的二进制数运算方法
• 逻辑代数的基本运算和逻辑表达式的化简
【分析1.1 / 1.2 / 1.3】
本部分要求与程序员考试大纲基本一致
重点:数的表示、校验码
难点:数的四种编码:原码、反码、补码、移码及相
互之间的变换方法。浮点数的表示以及其规格化。
考试题型一般分布在:数制表示、数据表示、校验码
的长度、逻辑表达式(公式、等效变换),明确“与”、
“非”、“异或”的运算规则。
考试出现频率较高的内容:浮点数规格化、进制转换
、求反补码。
1.4 数学基础知识
• 命题逻辑、谓词逻辑、形式逻辑的基础知识
• 常用数值计算(误差、矩阵和行列式、近似求解方
程、插值、数值积分)
• 排列组合、概率论应用、应用统计(数据的统计分
析)
• 运算基本方法(预测与决策、线性规划、网络图、
模拟)
【分析1.4】
考纲要求掌握相关的应用数学、离散数学的基础知识
本部分内容作为背景知识,虽不专门考察,但在其他
题目中尤其是程序设计中出现。
1.5 常用数据结构
• 数组(静态数组、动态数组)、线性表、链表(单
向链表、双向链表、循环链表)、队列、栈、树(二叉树
、查找树、平衡树、线索树、线索树、堆)、图等的定义
、存储和操作
• Hash(存储地址计算,冲突处理)
1.6 常用算法
• 排序算法、查找算法、数值计算方法、字符串处理
方法、数据压缩算法、递归算法、图的相关算法
• 算法与数据结构的关系、算法效率、算法设计、算
法描述(流程图、伪代码、决策表)、算法的复杂性
【分析1.5/1.6】
因为数据结构是程序设计的基础,算法与数据结构密
切相关,因此本部分为考试重点内容,要求熟练掌握。
重点:顺序存储结构和链式存储结构的特点、链表中
的头结点、栈的运算与溢出、循环队列的基本操作
数组元素的存储位置、特殊矩阵的压缩存储、广义表
的表头和表尾求法
二叉树存储方法、由遍历序列确定二叉树、二叉树的
计数问题
图的遍历算法、最小生成树算法、拓朴排序和关键路
径、最短路径算法
平均查找长度、折半查找判定树、平衡二叉树的最少
结点数、插入运算及平衡化处理、哈希表的构造和查找
排序的稳定问题、快速排序的分析及改进、内部排序
的时间下界、算法时间复杂度分析
难点:二叉树节点与深度的关系、图的存储(矩阵、
邻接表)与操作、遍历、
考试出现频率较高的内容:树的遍历、数据元素存储
方式、查找树、平衡树
考试题型一般分布在:数据元素存储方式、队和栈的
性质及其对比、链表操作、二叉树的定义及其性质、二叉
树的遍历/节点计算、树的遍历、查找树、平衡树等,图的
概念及其性质。
常见的排序算法、查找算法、递归算法、算法的基本
特点、常用算法思想、算法效率的比较(时间、空间复杂
度)、算法描述、算法复杂性比较
2.计算机系统知识
2.1 硬件知识
2.1.1 计算机系统的组成、体系结构分类及特性
• CPU和存储器的组成、性能和基本工作原理
• 常用I/O设备、通信设备的性能,以及基本工作
原理
• I/O接口的功能、类型和特性
•(中断系统、DMA、I/O处理机方式)
• CISC/RISC,流水线操作,多处理机,并行处理
2.1.2 存储系统
• 主存-Cache存储系统的工作原理
• 虚拟存储器基本工作原理,多级存储体系的性能
价格
• RAID类型和特性
【分析2.1.1/2.1.2】
分析:磁盘存储器的容量计算、地址映射、流水线、
系统结构分类
重点:Cache替换算法、内存与接口的编址方式、流水
线操作
难点:I/O控制方式、地址计算、并行处理的概念和层
次
考试出现频率较高的内容:指令的寻址方式以及指令
的执行过程;存储容量的计算、
流水线处理机的主要指标、CISC/RISC比较等
2.1.3 安全性、可靠性与系统性能评测基础知识
• 诊断与容错
• 系统可靠性分析评价
• 计算机系统性能评测方式
【分析2.1.3】本部分内容多为记忆型内容
重点:数据加密/解密知识、计算机安全等级、认证技
术、数字签名等
平均无故障时间、平均修复时间定义、计算机可靠性
模型、性能评价
难点:数据加密/解密知识、密钥体制
考试出现频率较高的内容:可靠性能评价、数据安全
知识、计算机可靠性及性能评价
2.2 软件知识
2.2.1 操作系统知识
• 操作系统的内核(中断控制)、进程、线程概念
• 处理机管理(状态转换、共享与互斥、分时轮转、
抢占、死锁)
• 存储管理(主存保护、动态连接分配、分段、分页
、虚存)
• 设备管理(I/O控制、假脱机)
• 文件管理(文件目录、文件组织、存取方法、存
取控制、恢复处理)
• 作业管理(作业调度、作业控制语言(JCL)、
多道程序设计)
• 汉字处理,多媒体处理,人机界面
• 网络操作系统和嵌入式操作系统基础知识
• 操作系统的配置
【分析2.2.1】
重点:操作系统的五大管理功能,其中如处理机管理
、存储管理、作业调度、进程调度、页面调度等尤为重要
、状态转换、共享与互斥、分时轮转、抢占、死锁
难点:作业调度、进程调度、页面调度算法、PV操作
考试题型一般分布在:操作系统的概述、处理机管理
、存储、文件管理、作业、进程调度、进程状态变化
考试出现频率较高的内容:PV操作、进程死锁/同步、
内存分配、并发执行程序、进程间状态转换、PV实现进程
间的同步与互斥、死锁及其避免、地址变换、页面置换、
工作集
2.2.2 程序设计语言和语言处理程序的知识
• 汇编、编译、解释系统的基础知识和基本工作原
理
• 程序设计语言的基本成分:数据、运算、控制和
传输,过程(函数)调用
• 各类程序设计语言主要特点和适用情况
【分析2.2.2】
分析:文法考查、自动机、正则式
重点:编译程序的基本组成、正则表达式和有限自动
机、文法及语言的形式描述、中间代码、自动机原理、文
法和语言的定义
考试出现频率较高的内容:正则表达式和正则集、有
限自动机和正则表达式的转换
2.3 计算机网络知识
• 网络体系结构(网络拓扑、OSI/RM、基本的网络协
议)
• 传输介质、传输技术、传输方法、传输控制
• 常用网络设备和各类通信设备
• Client/Server结构、Browser/Server结构
• LAN拓扑,存取控制,LAN的组网,LAN间连接,
LAN-WAN连接
• 因特网基础知识以及应用
• 网络软件
• 网络管理
• 网络性能分析
【分析2.3】
计算机网络中对OSI/RM七层的划分,及各种协议的功
能。传输理论、互联设备、Internet知识,除参考模型理
论外,其他的比较比较琐碎,需要知识积累。
重点:网络分类、拓扑结构、OSI参考模型层次划分及
对应的协议、带宽计算、子网划分、防火墙技术
难点:IP子网划分;传输控制、各层协议的功能
考试题型一般分布在:这部分知识除了上面的难点部
分外,基本属于了解记忆性的知识点,知识点比较散乱,
但考试中考点均落在大纲中列出的知识点中。
考试出现频率较高的内容:TCP/IP协议、参考模型7层
协议、IP地址的分类、各种网络设备的比较;
2.4 数据库知识
• 数据库管理系统的功能和特征
• 数据库模型(概念模式、外模式、内模式)
• 数据模型,ER图,第一范式、第二范式、第三范式
• 数据操作(集合运算和关系运算)
• 数据库语言(SQL)
• 数据库的控制功能(并发控制、恢复、安全性、完
整性)
• 数据仓库和分布式数据库基础知识
【分析2.4】
无论对上午题目还是下午题目,本部分都很重要,这
是学习和复习的一个重点。
重点:用E-R模型表示现实问题,扩充的E-R模型、ER
图向关系模式的转换、数据库语言(SQL)、对SELECT查询
语句的应用、关系代数表达式、关系模型的完整性约束、
函数依赖
难点:五种基本的关系运算方法、组合的关系运算方
法、规则化理论()、函数依赖、分解的保持函数依赖、
无损连接又保持函数依赖的分解、判断一个分解的无损连
接性和保持函数
考试出现频率较高的内容:数据模型、关系运算与SQL
语句的转换、函数依赖
2.5 多媒体知识
• 多媒体系统基础知识,多媒体设备的性能特性,常
用多媒体文件格式
• 简单图形的绘制,图像文件的处理方法
• 音频和视频信息的应用
• 多媒体应用开发过程
【分析2.5】
基本属于了解记忆性的知识点。
重点:多媒体的基本概念、声音数字化的过程、图像
压缩编码、视频文件的国际标准、流媒体概念、多媒体计
算机系统、虚拟现实技术
难点:多媒体信息的容量计算、数据压缩、常用多媒
体文件格式、音频和视频的物理特征等
考试出现频率较高的内容:基本知识、信息的容量计
算
2.6 系统性能知识
• 性能指标(响应时间、吞吐量、周转时间)和性能
设计
• 性能测试和性能评估
• 可靠性指标及计算、可靠性设计
• 可靠性测试和可靠性评估
【分析2.6】
重点:可靠性评估
考试出现频率较高的内容:系统可靠性的计算、设备
周转时间
2.7 计算机应用基础知识
• 信息管理、数据处理、辅助设计、自动控制、科学
计算、人工智能等基础知识
• 远程通信服务基础知识
• 常用应用系统
【分析2.7】
本部分内容不是考试重点,做一般了解即可。
3.系统开发和运行知识
本部分内容涉及上午考试和下午考试,是软件设计师
工作能力的考查重点。
3.1 软件工程、软件过程改进和软件开发项目管理知
识
• 软件工程知识
• 软件开发生命周期各阶段的目标和任务
• 软件开发项目管理基础知识(时间管理、成本管理
、质量管理、人力资源管理、风险管理等)及其常用管理
工具
• 主要的软件开发方法(生命周期法、原型法、面向
对象法、CASE)
• 软件开发工具与环境知识
• 软件过程改进知识
• 软件质量管理知识
• 软件开发过程评估、软件能力成熟评估基础知识
【分析3.1】
重点:软件开发方法、CMM、成本估算、风险分析、进
度管理、人员管理、软件开发环境
3.2 系统分析基础知识
• 系统分析的目的和任务
• 结构化分析方法(数据流图(DFD)、数据字典
(DD)、实体关系图(ERD)、描述加工处理的结构化语言
)
• 统一建模语言(UML)
• 系统规格说明书
【分析3.2】
高度重视UML在系统分析中的应用
重点:数据流图(DFD)、数据字典(DD)、实体关系
图(ERD)
考点:UML的各类图
3.3 系统设计知识
• 系统设计的目的和任务
• 结构化设计方法和工具(系统流程图、HIPO图、控
制流程图)
• 系统总体结构设计(总体布局、设计原则、模块结
构设计、数据存储设计、系统配置方案)
• 系统详细设计(代码设计、数据库设计、用户界面
设计、处理过程设计)
• 系统设计说明书
【分析3.3】
重点:系统流程图、HIPO图、控制流程图
3.4 系统实施知识
• 系统实施的主要任务
• 结构化程序设计、面向对象程序设计、可视化程序
设计
• 程序设计风格
• 程序设计语言的选择
• 系统测试的目的、类型,系统测试方法(黑盒测试
、白盒测试、灰盒测试)
• 测试设计和管理(错误曲线、错误排除、收敛、注
入故障、测试用例设计、系统测试报告)
• 系统转换基础知识
3.5 系统运行和维护知识
• 系统运行管理基础知识
• 系统维护基础知识
• 系统评价基础知识
【分析3.4/3.5】
重点:结构化设计中信息流、变换分析、系统结构设
计原则、系统划分、模块设计、数据存储设计、面向对象
程序设计、测试方法、系统维护的分类
难点:系统测试方法、测试分类、系统可维护性评价
指标
3.6 面向对象开发方法
• 面向对象开发概念(类、对象、属性、封装性、继
承性、多态性、对象之间的引用)
• 面向对象开发方法的优越性以及有效领域
• 面向对象设计方法(体系结构、类的设计、用户接
口设计)
• 面向对象实现方法(选择程序设计语言、类的实现
、方法的实现、用户接口的实现、准备测试数据)
• 面向对象程序设计语言(如C++、Java、Visual、
Bsasic、Visual C++)的基本机制
• 面向对象数据库、分布式对象的概念
【分析3.6】
重点:面向对象开发:类、对象、属性、封装性、继
承性、多态性、OMT方法
难点:建议在数据流图、结构化分析方法上多加掌握
。
【分析3】
考试题型一般分布在:DFD、软件的生存周期;数据流
图;模块间的关系;软件测试的分类、软件质量管理(标
准)软件的特性、主要的软件开发方法、系统测试、软件
能力成熟评估
考试出现频率较高的内容:数据流图、黑盒/白盒测试
、面向对象技术的概念
4.安全性知识
• 安全性基本概念
• 防治计算机病毒、防范计算机犯罪
• 存取控制、防闯入、安全管理措施
• 加密与解密机制
• 风险分析、风险类型、抗风险措施和内部控制
【分析4】
系统安全问题是目前社会关注的问题,也是应用价值
较高的知识,可结合现实中的相关问题来加深理解。
考试出现频率较高的内容:加密与解密算法、
5.标准化知识
• 标准化意识、标准化的发展、标准制订过程
• 国际标准、国家标准、行业标准、企业标准基本知
识
• 代码标准、文件格式标准、安全标准、软件开发规
范和文档标准知识
• 标准化机构
6.信息化基础知识
• 信息化意识
• 全球信息化趋势、国家信息化战略、企业信息化战
略和策略
• 有关的法律、法规
• 远程教育、电子商务、电子政务等基础知识
• 企业信息资源管理基础知识
【分析5/6】
信息化、标准化知识是新增考点。标准化方面有标准
标识,标准修订等是对基本素质的考查,也要重视。
考试出现频率较高的内容
7.计算机专业英语
• 掌握计算机技术的基本词汇
• 能正确阅读和理解计算机领域的英文资料
【分析7】
专业英语,是对专业知识和英语水平的考查,考前需
有意识阅读点英文专业资料。
考试题型一般分布在:软件行业标准,计算机安全基
础知识,信息化基础知识。
考试出现频率较高的内容:行业标准的类别;计算机
安全,CMM分类,计算机软件著作权问题。
考试科目2:软件设计
本部分具体内容如下:
l 外部设计
l 内部设计
l 程序设计
l 系统实施
l 软件工程
本部分所涉及内容为软件设计的日常工作,这些内容
同样出现在上午考试试题中。
1.外部设计
1.1 理解系统需求说明
1.2 系统开发的准备
• 选择开发方法、准备开发环境、制订开发计划
1.3 设计系统功能
• 选择系统结构,设计各子系统的功能和接口,设计
安全性策略、需求和实现方法,制订详细的工作流和数据
流
1.4 设计数据模型
• 设计ER模型、数据模型
1.5 编写外部设计文档
• 系统配置图、各子系统关系图、系统流程图、系统
功能说明书、输入输出规格说明、数据规格说明、用户手
册框架
• 设计系统测试要求
1.6 设计评审
应能由考试说明内容,来阅读
2.内部设计
2.1 设计软件结构
• 按构件分解,确定构件功能规格以及构件之间的接
口
• 采用中间件和工具
2.2 设计输入输出
• 屏幕界面设计、设计输入输出检查方法和检查信息
2.3 设计物理数据
• 分析数据特性,确定逻辑数据组织方式、存储介质
,设计记录格式和处理方式
• 将逻辑数据结构换成物理数据结构,计算容量,进
行优化
2.4 构件的创建和重用
• 创建、重用构件的概念
• 使用子程序库或类库
2.5 编写内部设计文档
• 构件划分图、构件间的接口、构件处理说明、屏幕
设计文档、报表设计文档、文件设计文档、数据库设计文
档
2.6 设计评审
3.程序设计
3.1 模块划分(原则、方法、标准)
3.2 编写程序设计文档
• 模块规格说明书(功能和接口说明、程序处理逻辑
的描述、输入输出数据格式的描述)
• 测试要求说明书(测试类型和目标、测试用例、测
试方法)
3.3 程序设计评审
4.系统实施
4.1 配置计算机系统及其环境
4.2 选择合适的程序设计语言
4.3 掌握C程序设计语言,以及C++、Java、Visual
Basic、Visual C++中任一种程序设计语言,以便能指导程
序员进行编程和测试,并进行必要的优化
4.4 系统测试
• 指导程序员进行模块测试,并进行验收
• 准备系统集成测试环境和测试工具
• 准备测试数据
• 写出测试报告
5.软件工程
• 软件生存期模型(瀑布模型、螺旋模型、喷泉模型
)和软件成本模型
• 定义软件需求(系统化的目标、配置、功能、性能
和约束)
• 描述软件需求的方法(功能层次模型、数据流模型
、控制流模型、面向数据的模型、面向对象的模型等)
• 定义软件需求的方法(结构化分析方法、面向对象
分析方法)
• 软件设计(分析与集成、逐步求精、抽象、信息隐
蔽)
• 软件设计方法(结构化设计方法、Jackson方法、
Warnier方法、面向对象设计方法)
• 程序设计(结构化程序设计、面向对象程序设计)
• 软件测试的原则与方法
• 软件质量(软件质量特性、软件质量控制)
• 软件过程评估基本方法、软件能力成熟度评估基本
方法
• 软件开发环境和开发工具(分析工具、设计工具、
编程工具、测试工具、维护工具、CASE)
• 软件工程发展趋势(面向构件,统一建模语言
(UML))
• 软件过程改进模型和方法
本部分综合分析:
软件设计师,关键是设计软件的能力。考纲要求:要
熟悉软件工程、软件过程改进和软件开发项目管理的基础
知识;熟练掌握软件设计的方法和技术;掌握C程序设计语
言及指定的四种面向对象语言中的一种。这部分专业能力
严重依赖工作实践,要求有一定经验的积累,是具有工程
师的实际工作能力和业务水平的体现。如无实践经验,要
学会借鉴,以取人之长,补已之短。
这部分主要体现在下午考试中,现就如何应对下午考
试进行分析:
近几次考试中下午试题分五个题目,一个数据库,一
个程序填空题、一个面向对象的语言题,另两个题目分别
为数据流图、UML、或流程图等。
数据库题目,要求补全SQL语言,这要求考生熟悉SQL
的语言,无论对上午题目还是下午题目都很重要。这是学
习和复习的一个重点。
数据流图,DFD是一种分析系统数据流程的图形,意在
让用户理解系统的功能、输入、输出和数据存储等。请认
真弄清其应用,在画出数据流图的情况下,系统的功能也
就确定了,再经过细化,逐步向物理结构迈进。考核时,
试题多从父图和子图的平衡来分析。这部分内容,一个解
题的关键是高度重视题目说明,务必正确、深入理解其内
容,必要时要读几遍,同时对于给出的图表,也要务必看
懂。这样答题就轻松了,答案实际就蕴含在说明中。
流程图类题目,是大家再熟悉不过的了,它就一个具
体问题的解题思路进行描述,是面向过程的。但所求问题
是千差万别的,因此应理解思路,细心作答。
答题形式最简单也是难度最大的是程序填空。为便于
阅卷,这类题目以程序填空形式出现,这不仅要求理解问
题本质,同时也要弄清作者解题思路,这一点比自己独立
完成程序设计要难得的多。针对问题,首先设计自己的思
路,如何解决问题,先后顺序怎样;然后试读程序,如何
思路大体一致,很好,这题容易解决了。如思路不一致,
设法弄清每一段代码的功能,其逻辑结构怎样,进而弄清
命题人的解题思路,再顺势解决问题。人们常讲,答案就
在题目中,这是对的。在分析问题过程中,找到所求答案
。不过前提条件是考生要熟悉这种语言,又要明白解题思
路,这样才能正确作答。这个题目比较难,要么不得分,
要么得全分。
近年对于统一建模语言UML考查较多,已引起了考生的
注意。它代表了软件工程的发展趋势,目前是可视化建模
的事实上的工业标准。人们对于图的理解相对其他形式更
容易一些,图能更清晰地描述和说明问题的本质,因此,
UML体现了这一特点。这类题目难度与数据流图相似,自然
解题思想也相同。从形式上看,数据流图更朴实一些,UML
类的题目则透出一种新颖、现代的气息。
最后的题目面向对象语言是一个选做题,给考生以自
由,可以发挥个人的优势。命题已注意到不同语言的考查
难度一致性,要求考生就同一问题回答,实现了形式上的
公平,自然是一个进步。
上下午各2个半小时。上午试卷有15道必做题,内容包括:数据结构(如树和图的定义、存储和操作),程序语言及编译知识,操作系统理论知识(如进程、资源管理方法),软件工程基础知识(含面向对象方法,软件开发工具等),数据库基础知识(含SQL的使用),多媒体基础知识,网络基础知识,计算机体系结构,存储器系统,可靠性与系统评价,计算机专业英语等。这些试题涉及的内容比较广,有一定深度,也比较注重基础理论知识,考前应注意补充有关的知识以弥补自己的缺陷。
下午试卷中共有6题。前3题为有关的分析设计图(数据流图、程序流程图、系统流程图、ER图),可选做2题,要求考生按照题意填补图中的空缺,并回答若干问题。试卷中还有1道CASL汇编语言程序题和2道C语言程序题,都是必做题。程序题中给出了算法以及不完整的程序,要求填补空缺的语句。CASL汇编语言是从许多具体机型的汇编语言中抽象出来的一种简化的、专用于考试的汇编语言。在清华大学出版社出版的考试大纲书中以及在试卷中都含有CASL汇编语言文本。如果考生并没有学过、用过任何汇编语言,则需要花费一定的时间来学习和练习。
考试内容要求
知识点的掌握程度从深到浅可分五个层次,分别要求
为熟练掌握、掌握、理解、熟悉和了解。其中包括2个熟练
掌握(常用数据结构和常用算法、软件设计的方法和技术
)、8个掌握、2个熟悉,1个正确理解,具体体现在以下12
个方面:
(1) 掌握数据表示、算术和逻辑运算;
(2) 掌握相关的应用数学、离散数学的基础知识;
(3) 掌握计算机体系结构以及各主要部件的性能和
基本工作原理;
(4) 掌握操作系统、程序设计语言的基础知识,了
解编译程序的基本知识;
(5) 熟练掌握常用数据结构和常用算法;
(6) 熟悉数据库、网络和多媒体的基础知识;
(7) 掌握C程序设计语言,以及C++、Java、Visual
Basic、Visual C++中的一种程序设计语言;
(8) 熟悉软件工程、软件过程改进和软件开发项目
管理的基础知识;
(9) 熟练掌握软件设计的方法和技术;
(10) 掌握常用信息技术标准、安全性,以及有关法
律、法规的基本知识;
(11) 了解信息化、计算机应用的基础知识;
(12) 正确阅读和理解计算机领域的英文资料。
分析:相对于2001年考试大纲,新大纲对知识面的要
求更宽,更注重软件设计开发的实践能力,这一点充分体
现在下午考试中。考试内容除了技术要求外,还增加了对
软件工程实践能力、安全性、标准化、法律法规等方面知
识的要求,毕竟软件设计师是软件产业的骨干,因此考试
要求相对较高。
二、考试范围
考试科目1:计算机与软件工程知识
本部分包含以下内容:
l 计算机科学基础
l 计算机系统知识
l 系统开发和运行知识
l 安全性知识
l 标准化知识
l 信息化基础知识
l 计算机专业英语
1.计算机科学基础
1.1 数制及其转换
• 二进制、十进制和十六进制等常用制数制及其相互
转换
1.2 数据的表示
•(原码、反码、补码、移码表示,整数和实数的机
内表示,精度和溢出)
• 非数值表示(字符和汉字表示、声音表示、图像表
示)
• 校验方法和校验码(奇偶校验码、海明校验码、循
环冗余校验码)
1.3 算术运算和逻辑运算
• 计算机中的二进制数运算方法
• 逻辑代数的基本运算和逻辑表达式的化简
【分析1.1 / 1.2 / 1.3】
本部分要求与程序员考试大纲基本一致
重点:数的表示、校验码
难点:数的四种编码:原码、反码、补码、移码及相
互之间的变换方法。浮点数的表示以及其规格化。
考试题型一般分布在:数制表示、数据表示、校验码
的长度、逻辑表达式(公式、等效变换),明确“与”、
“非”、“异或”的运算规则。
考试出现频率较高的内容:浮点数规格化、进制转换
、求反补码。
1.4 数学基础知识
• 命题逻辑、谓词逻辑、形式逻辑的基础知识
• 常用数值计算(误差、矩阵和行列式、近似求解方
程、插值、数值积分)
• 排列组合、概率论应用、应用统计(数据的统计分
析)
• 运算基本方法(预测与决策、线性规划、网络图、
模拟)
【分析1.4】
考纲要求掌握相关的应用数学、离散数学的基础知识
本部分内容作为背景知识,虽不专门考察,但在其他
题目中尤其是程序设计中出现。
1.5 常用数据结构
• 数组(静态数组、动态数组)、线性表、链表(单
向链表、双向链表、循环链表)、队列、栈、树(二叉树
、查找树、平衡树、线索树、线索树、堆)、图等的定义
、存储和操作
• Hash(存储地址计算,冲突处理)
1.6 常用算法
• 排序算法、查找算法、数值计算方法、字符串处理
方法、数据压缩算法、递归算法、图的相关算法
• 算法与数据结构的关系、算法效率、算法设计、算
法描述(流程图、伪代码、决策表)、算法的复杂性
【分析1.5/1.6】
因为数据结构是程序设计的基础,算法与数据结构密
切相关,因此本部分为考试重点内容,要求熟练掌握。
重点:顺序存储结构和链式存储结构的特点、链表中
的头结点、栈的运算与溢出、循环队列的基本操作
数组元素的存储位置、特殊矩阵的压缩存储、广义表
的表头和表尾求法
二叉树存储方法、由遍历序列确定二叉树、二叉树的
计数问题
图的遍历算法、最小生成树算法、拓朴排序和关键路
径、最短路径算法
平均查找长度、折半查找判定树、平衡二叉树的最少
结点数、插入运算及平衡化处理、哈希表的构造和查找
排序的稳定问题、快速排序的分析及改进、内部排序
的时间下界、算法时间复杂度分析
难点:二叉树节点与深度的关系、图的存储(矩阵、
邻接表)与操作、遍历、
考试出现频率较高的内容:树的遍历、数据元素存储
方式、查找树、平衡树
考试题型一般分布在:数据元素存储方式、队和栈的
性质及其对比、链表操作、二叉树的定义及其性质、二叉
树的遍历/节点计算、树的遍历、查找树、平衡树等,图的
概念及其性质。
常见的排序算法、查找算法、递归算法、算法的基本
特点、常用算法思想、算法效率的比较(时间、空间复杂
度)、算法描述、算法复杂性比较
2.计算机系统知识
2.1 硬件知识
2.1.1 计算机系统的组成、体系结构分类及特性
• CPU和存储器的组成、性能和基本工作原理
• 常用I/O设备、通信设备的性能,以及基本工作
原理
• I/O接口的功能、类型和特性
•(中断系统、DMA、I/O处理机方式)
• CISC/RISC,流水线操作,多处理机,并行处理
2.1.2 存储系统
• 主存-Cache存储系统的工作原理
• 虚拟存储器基本工作原理,多级存储体系的性能
价格
• RAID类型和特性
【分析2.1.1/2.1.2】
分析:磁盘存储器的容量计算、地址映射、流水线、
系统结构分类
重点:Cache替换算法、内存与接口的编址方式、流水
线操作
难点:I/O控制方式、地址计算、并行处理的概念和层
次
考试出现频率较高的内容:指令的寻址方式以及指令
的执行过程;存储容量的计算、
流水线处理机的主要指标、CISC/RISC比较等
2.1.3 安全性、可靠性与系统性能评测基础知识
• 诊断与容错
• 系统可靠性分析评价
• 计算机系统性能评测方式
【分析2.1.3】本部分内容多为记忆型内容
重点:数据加密/解密知识、计算机安全等级、认证技
术、数字签名等
平均无故障时间、平均修复时间定义、计算机可靠性
模型、性能评价
难点:数据加密/解密知识、密钥体制
考试出现频率较高的内容:可靠性能评价、数据安全
知识、计算机可靠性及性能评价
2.2 软件知识
2.2.1 操作系统知识
• 操作系统的内核(中断控制)、进程、线程概念
• 处理机管理(状态转换、共享与互斥、分时轮转、
抢占、死锁)
• 存储管理(主存保护、动态连接分配、分段、分页
、虚存)
• 设备管理(I/O控制、假脱机)
• 文件管理(文件目录、文件组织、存取方法、存
取控制、恢复处理)
• 作业管理(作业调度、作业控制语言(JCL)、
多道程序设计)
• 汉字处理,多媒体处理,人机界面
• 网络操作系统和嵌入式操作系统基础知识
• 操作系统的配置
【分析2.2.1】
重点:操作系统的五大管理功能,其中如处理机管理
、存储管理、作业调度、进程调度、页面调度等尤为重要
、状态转换、共享与互斥、分时轮转、抢占、死锁
难点:作业调度、进程调度、页面调度算法、PV操作
考试题型一般分布在:操作系统的概述、处理机管理
、存储、文件管理、作业、进程调度、进程状态变化
考试出现频率较高的内容:PV操作、进程死锁/同步、
内存分配、并发执行程序、进程间状态转换、PV实现进程
间的同步与互斥、死锁及其避免、地址变换、页面置换、
工作集
2.2.2 程序设计语言和语言处理程序的知识
• 汇编、编译、解释系统的基础知识和基本工作原
理
• 程序设计语言的基本成分:数据、运算、控制和
传输,过程(函数)调用
• 各类程序设计语言主要特点和适用情况
【分析2.2.2】
分析:文法考查、自动机、正则式
重点:编译程序的基本组成、正则表达式和有限自动
机、文法及语言的形式描述、中间代码、自动机原理、文
法和语言的定义
考试出现频率较高的内容:正则表达式和正则集、有
限自动机和正则表达式的转换
2.3 计算机网络知识
• 网络体系结构(网络拓扑、OSI/RM、基本的网络协
议)
• 传输介质、传输技术、传输方法、传输控制
• 常用网络设备和各类通信设备
• Client/Server结构、Browser/Server结构
• LAN拓扑,存取控制,LAN的组网,LAN间连接,
LAN-WAN连接
• 因特网基础知识以及应用
• 网络软件
• 网络管理
• 网络性能分析
【分析2.3】
计算机网络中对OSI/RM七层的划分,及各种协议的功
能。传输理论、互联设备、Internet知识,除参考模型理
论外,其他的比较比较琐碎,需要知识积累。
重点:网络分类、拓扑结构、OSI参考模型层次划分及
对应的协议、带宽计算、子网划分、防火墙技术
难点:IP子网划分;传输控制、各层协议的功能
考试题型一般分布在:这部分知识除了上面的难点部
分外,基本属于了解记忆性的知识点,知识点比较散乱,
但考试中考点均落在大纲中列出的知识点中。
考试出现频率较高的内容:TCP/IP协议、参考模型7层
协议、IP地址的分类、各种网络设备的比较;
2.4 数据库知识
• 数据库管理系统的功能和特征
• 数据库模型(概念模式、外模式、内模式)
• 数据模型,ER图,第一范式、第二范式、第三范式
• 数据操作(集合运算和关系运算)
• 数据库语言(SQL)
• 数据库的控制功能(并发控制、恢复、安全性、完
整性)
• 数据仓库和分布式数据库基础知识
【分析2.4】
无论对上午题目还是下午题目,本部分都很重要,这
是学习和复习的一个重点。
重点:用E-R模型表示现实问题,扩充的E-R模型、ER
图向关系模式的转换、数据库语言(SQL)、对SELECT查询
语句的应用、关系代数表达式、关系模型的完整性约束、
函数依赖
难点:五种基本的关系运算方法、组合的关系运算方
法、规则化理论()、函数依赖、分解的保持函数依赖、
无损连接又保持函数依赖的分解、判断一个分解的无损连
接性和保持函数
考试出现频率较高的内容:数据模型、关系运算与SQL
语句的转换、函数依赖
2.5 多媒体知识
• 多媒体系统基础知识,多媒体设备的性能特性,常
用多媒体文件格式
• 简单图形的绘制,图像文件的处理方法
• 音频和视频信息的应用
• 多媒体应用开发过程
【分析2.5】
基本属于了解记忆性的知识点。
重点:多媒体的基本概念、声音数字化的过程、图像
压缩编码、视频文件的国际标准、流媒体概念、多媒体计
算机系统、虚拟现实技术
难点:多媒体信息的容量计算、数据压缩、常用多媒
体文件格式、音频和视频的物理特征等
考试出现频率较高的内容:基本知识、信息的容量计
算
2.6 系统性能知识
• 性能指标(响应时间、吞吐量、周转时间)和性能
设计
• 性能测试和性能评估
• 可靠性指标及计算、可靠性设计
• 可靠性测试和可靠性评估
【分析2.6】
重点:可靠性评估
考试出现频率较高的内容:系统可靠性的计算、设备
周转时间
2.7 计算机应用基础知识
• 信息管理、数据处理、辅助设计、自动控制、科学
计算、人工智能等基础知识
• 远程通信服务基础知识
• 常用应用系统
【分析2.7】
本部分内容不是考试重点,做一般了解即可。
3.系统开发和运行知识
本部分内容涉及上午考试和下午考试,是软件设计师
工作能力的考查重点。
3.1 软件工程、软件过程改进和软件开发项目管理知
识
• 软件工程知识
• 软件开发生命周期各阶段的目标和任务
• 软件开发项目管理基础知识(时间管理、成本管理
、质量管理、人力资源管理、风险管理等)及其常用管理
工具
• 主要的软件开发方法(生命周期法、原型法、面向
对象法、CASE)
• 软件开发工具与环境知识
• 软件过程改进知识
• 软件质量管理知识
• 软件开发过程评估、软件能力成熟评估基础知识
【分析3.1】
重点:软件开发方法、CMM、成本估算、风险分析、进
度管理、人员管理、软件开发环境
3.2 系统分析基础知识
• 系统分析的目的和任务
• 结构化分析方法(数据流图(DFD)、数据字典
(DD)、实体关系图(ERD)、描述加工处理的结构化语言
)
• 统一建模语言(UML)
• 系统规格说明书
【分析3.2】
高度重视UML在系统分析中的应用
重点:数据流图(DFD)、数据字典(DD)、实体关系
图(ERD)
考点:UML的各类图
3.3 系统设计知识
• 系统设计的目的和任务
• 结构化设计方法和工具(系统流程图、HIPO图、控
制流程图)
• 系统总体结构设计(总体布局、设计原则、模块结
构设计、数据存储设计、系统配置方案)
• 系统详细设计(代码设计、数据库设计、用户界面
设计、处理过程设计)
• 系统设计说明书
【分析3.3】
重点:系统流程图、HIPO图、控制流程图
3.4 系统实施知识
• 系统实施的主要任务
• 结构化程序设计、面向对象程序设计、可视化程序
设计
• 程序设计风格
• 程序设计语言的选择
• 系统测试的目的、类型,系统测试方法(黑盒测试
、白盒测试、灰盒测试)
• 测试设计和管理(错误曲线、错误排除、收敛、注
入故障、测试用例设计、系统测试报告)
• 系统转换基础知识
3.5 系统运行和维护知识
• 系统运行管理基础知识
• 系统维护基础知识
• 系统评价基础知识
【分析3.4/3.5】
重点:结构化设计中信息流、变换分析、系统结构设
计原则、系统划分、模块设计、数据存储设计、面向对象
程序设计、测试方法、系统维护的分类
难点:系统测试方法、测试分类、系统可维护性评价
指标
3.6 面向对象开发方法
• 面向对象开发概念(类、对象、属性、封装性、继
承性、多态性、对象之间的引用)
• 面向对象开发方法的优越性以及有效领域
• 面向对象设计方法(体系结构、类的设计、用户接
口设计)
• 面向对象实现方法(选择程序设计语言、类的实现
、方法的实现、用户接口的实现、准备测试数据)
• 面向对象程序设计语言(如C++、Java、Visual、
Bsasic、Visual C++)的基本机制
• 面向对象数据库、分布式对象的概念
【分析3.6】
重点:面向对象开发:类、对象、属性、封装性、继
承性、多态性、OMT方法
难点:建议在数据流图、结构化分析方法上多加掌握
。
【分析3】
考试题型一般分布在:DFD、软件的生存周期;数据流
图;模块间的关系;软件测试的分类、软件质量管理(标
准)软件的特性、主要的软件开发方法、系统测试、软件
能力成熟评估
考试出现频率较高的内容:数据流图、黑盒/白盒测试
、面向对象技术的概念
4.安全性知识
• 安全性基本概念
• 防治计算机病毒、防范计算机犯罪
• 存取控制、防闯入、安全管理措施
• 加密与解密机制
• 风险分析、风险类型、抗风险措施和内部控制
【分析4】
系统安全问题是目前社会关注的问题,也是应用价值
较高的知识,可结合现实中的相关问题来加深理解。
考试出现频率较高的内容:加密与解密算法、
5.标准化知识
• 标准化意识、标准化的发展、标准制订过程
• 国际标准、国家标准、行业标准、企业标准基本知
识
• 代码标准、文件格式标准、安全标准、软件开发规
范和文档标准知识
• 标准化机构
6.信息化基础知识
• 信息化意识
• 全球信息化趋势、国家信息化战略、企业信息化战
略和策略
• 有关的法律、法规
• 远程教育、电子商务、电子政务等基础知识
• 企业信息资源管理基础知识
【分析5/6】
信息化、标准化知识是新增考点。标准化方面有标准
标识,标准修订等是对基本素质的考查,也要重视。
考试出现频率较高的内容
7.计算机专业英语
• 掌握计算机技术的基本词汇
• 能正确阅读和理解计算机领域的英文资料
【分析7】
专业英语,是对专业知识和英语水平的考查,考前需
有意识阅读点英文专业资料。
考试题型一般分布在:软件行业标准,计算机安全基
础知识,信息化基础知识。
考试出现频率较高的内容:行业标准的类别;计算机
安全,CMM分类,计算机软件著作权问题。
考试科目2:软件设计
本部分具体内容如下:
l 外部设计
l 内部设计
l 程序设计
l 系统实施
l 软件工程
本部分所涉及内容为软件设计的日常工作,这些内容
同样出现在上午考试试题中。
1.外部设计
1.1 理解系统需求说明
1.2 系统开发的准备
• 选择开发方法、准备开发环境、制订开发计划
1.3 设计系统功能
• 选择系统结构,设计各子系统的功能和接口,设计
安全性策略、需求和实现方法,制订详细的工作流和数据
流
1.4 设计数据模型
• 设计ER模型、数据模型
1.5 编写外部设计文档
• 系统配置图、各子系统关系图、系统流程图、系统
功能说明书、输入输出规格说明、数据规格说明、用户手
册框架
• 设计系统测试要求
1.6 设计评审
应能由考试说明内容,来阅读
2.内部设计
2.1 设计软件结构
• 按构件分解,确定构件功能规格以及构件之间的接
口
• 采用中间件和工具
2.2 设计输入输出
• 屏幕界面设计、设计输入输出检查方法和检查信息
2.3 设计物理数据
• 分析数据特性,确定逻辑数据组织方式、存储介质
,设计记录格式和处理方式
• 将逻辑数据结构换成物理数据结构,计算容量,进
行优化
2.4 构件的创建和重用
• 创建、重用构件的概念
• 使用子程序库或类库
2.5 编写内部设计文档
• 构件划分图、构件间的接口、构件处理说明、屏幕
设计文档、报表设计文档、文件设计文档、数据库设计文
档
2.6 设计评审
3.程序设计
3.1 模块划分(原则、方法、标准)
3.2 编写程序设计文档
• 模块规格说明书(功能和接口说明、程序处理逻辑
的描述、输入输出数据格式的描述)
• 测试要求说明书(测试类型和目标、测试用例、测
试方法)
3.3 程序设计评审
4.系统实施
4.1 配置计算机系统及其环境
4.2 选择合适的程序设计语言
4.3 掌握C程序设计语言,以及C++、Java、Visual
Basic、Visual C++中任一种程序设计语言,以便能指导程
序员进行编程和测试,并进行必要的优化
4.4 系统测试
• 指导程序员进行模块测试,并进行验收
• 准备系统集成测试环境和测试工具
• 准备测试数据
• 写出测试报告
5.软件工程
• 软件生存期模型(瀑布模型、螺旋模型、喷泉模型
)和软件成本模型
• 定义软件需求(系统化的目标、配置、功能、性能
和约束)
• 描述软件需求的方法(功能层次模型、数据流模型
、控制流模型、面向数据的模型、面向对象的模型等)
• 定义软件需求的方法(结构化分析方法、面向对象
分析方法)
• 软件设计(分析与集成、逐步求精、抽象、信息隐
蔽)
• 软件设计方法(结构化设计方法、Jackson方法、
Warnier方法、面向对象设计方法)
• 程序设计(结构化程序设计、面向对象程序设计)
• 软件测试的原则与方法
• 软件质量(软件质量特性、软件质量控制)
• 软件过程评估基本方法、软件能力成熟度评估基本
方法
• 软件开发环境和开发工具(分析工具、设计工具、
编程工具、测试工具、维护工具、CASE)
• 软件工程发展趋势(面向构件,统一建模语言
(UML))
• 软件过程改进模型和方法
本部分综合分析:
软件设计师,关键是设计软件的能力。考纲要求:要
熟悉软件工程、软件过程改进和软件开发项目管理的基础
知识;熟练掌握软件设计的方法和技术;掌握C程序设计语
言及指定的四种面向对象语言中的一种。这部分专业能力
严重依赖工作实践,要求有一定经验的积累,是具有工程
师的实际工作能力和业务水平的体现。如无实践经验,要
学会借鉴,以取人之长,补已之短。
这部分主要体现在下午考试中,现就如何应对下午考
试进行分析:
近几次考试中下午试题分五个题目,一个数据库,一
个程序填空题、一个面向对象的语言题,另两个题目分别
为数据流图、UML、或流程图等。
数据库题目,要求补全SQL语言,这要求考生熟悉SQL
的语言,无论对上午题目还是下午题目都很重要。这是学
习和复习的一个重点。
数据流图,DFD是一种分析系统数据流程的图形,意在
让用户理解系统的功能、输入、输出和数据存储等。请认
真弄清其应用,在画出数据流图的情况下,系统的功能也
就确定了,再经过细化,逐步向物理结构迈进。考核时,
试题多从父图和子图的平衡来分析。这部分内容,一个解
题的关键是高度重视题目说明,务必正确、深入理解其内
容,必要时要读几遍,同时对于给出的图表,也要务必看
懂。这样答题就轻松了,答案实际就蕴含在说明中。
流程图类题目,是大家再熟悉不过的了,它就一个具
体问题的解题思路进行描述,是面向过程的。但所求问题
是千差万别的,因此应理解思路,细心作答。
答题形式最简单也是难度最大的是程序填空。为便于
阅卷,这类题目以程序填空形式出现,这不仅要求理解问
题本质,同时也要弄清作者解题思路,这一点比自己独立
完成程序设计要难得的多。针对问题,首先设计自己的思
路,如何解决问题,先后顺序怎样;然后试读程序,如何
思路大体一致,很好,这题容易解决了。如思路不一致,
设法弄清每一段代码的功能,其逻辑结构怎样,进而弄清
命题人的解题思路,再顺势解决问题。人们常讲,答案就
在题目中,这是对的。在分析问题过程中,找到所求答案
。不过前提条件是考生要熟悉这种语言,又要明白解题思
路,这样才能正确作答。这个题目比较难,要么不得分,
要么得全分。
近年对于统一建模语言UML考查较多,已引起了考生的
注意。它代表了软件工程的发展趋势,目前是可视化建模
的事实上的工业标准。人们对于图的理解相对其他形式更
容易一些,图能更清晰地描述和说明问题的本质,因此,
UML体现了这一特点。这类题目难度与数据流图相似,自然
解题思想也相同。从形式上看,数据流图更朴实一些,UML
类的题目则透出一种新颖、现代的气息。
最后的题目面向对象语言是一个选做题,给考生以自
由,可以发挥个人的优势。命题已注意到不同语言的考查
难度一致性,要求考生就同一问题回答,实现了形式上的
公平,自然是一个进步。
2008年11月5日星期三
jBPM用户指南-CH07
第七章 持久化 Persistence
在大多数场合,jBPM用来在一段很长的时间内维持流程的执行。在这个上下文中,“一段很长的时间”意思是跨越很多个事务。持久化的主要意图是在等待状态下存储流程执行。因此我们把流程执行想像成一个状态机。在一个事务中,我们要把流程执行状态机从一个状态移动到下一个状态。
一个流程定义可以被表述成3种形式:作为XML,作为一个java对象和作为jBPM数据库中的一条记录。可执行(运行时)的信息和日志信息可以被表述成两种形式:作为一个java对象和作为jBPM数据库的一条记录。
图 7.1. The transformations and different forms
更多关于流程定义和流程归档的XML表示形式,请看第16章jBPM Process Definition Language (JPDL)。
更多关于如何部署一个流程归档到一个数据库的信息,请看16.1.1节,“部署一个流程归档”。
7.1. 持久化 API
7.1.1. 配置框架的相互关系
持久化API是和配置框架暴露在JbpmContext之外的一些简单易用的方法的一个集成。因此持久化API操作能够在一个jBPM上下文块内被调用,如下:
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
try {
// Invoke persistence operations here
} finally {
jbpmContext.close();
}
在下文中,我们假设配置包含一个和这个例子(配置文件src/config.files/jbpm.cfg.xml)相似的持久化服务。
<jbpm-configuration>
<jbpm-context>
<service name='persistence' factory='org.jbpm.persistence.db.DbPersistenceServiceFactory' />
...
</jbpm-context>
...
</jbpm-configuration>
7.1.2. JbpmContext的易用的方法
3中最为常见的持久化操作是:
部署一个流程
启动一个流程的执行
继续一个执行
首先部署一个流程定义。典型地,这一步将在一个流程图形设计器或用部署流程的ant任务直接完成。但这里你可以看到如何用编程的方式完成:
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
try {
ProcessDefinition processDefinition = ...;
jbpmContext.deployProcessDefinition(processDefinition);
} finally {
jbpmContext.close();
}
为了创建一个流程执行,我们需要指定这个被实例化的执行是属于哪个流程定义。指定这个最为通用的方法是引用流程的名字且让jBPM在数据库中找到流程的最新版本:
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
try {
String processName = ...;
ProcessInstance processInstance =
jbpmContext.newProcessInstance(processName);
} finally {
jbpmContext.close();
}
为了继续一个流程执行,我们需要从数据库获取流程实例、令牌或任务实例,在POJO jBPM对象调用一些方法,然后再次保存对流程实例所作的更新到数据库中。
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
try {
long processInstanceId = ...;
ProcessInstance processInstance =
jbpmContext.loadProcessInstance(processInstanceId);
processInstance.signal();
jbpmContext.save(processInstance);
} finally {
jbpmContext.close();
}
注意,如果你在JbpmContext使用xxxForUpdate方法,明确的jbpmContext.save方式将不再需要,因为在关闭jbpmContext期间这一步将自动发生。例如:假设我们想要告知jBPM我们已经完成一个任务实例。需要注意的是,任务实例完成将触发执行继续,因此关联到任务实例的流程实例必须保存。要完成这种需求的最为方便的做法是使用loadTaskInstanceForUpdate方法:
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
try {
long taskInstanceId = ...;
TaskInstance taskInstance =
jbpmContext.loadTaskInstanceForUpdate(taskInstanceId);
taskInstance.end();
} finally {
jbpmContext.close();
}
下面一部分是关于jBPM如何管理持久化和使用Hibernate的一个说明,只作为一个背景知识。
JbpmConfiguration维护了一个ServiceFactorys的集合。服务工厂在前面说说的jbpm.cfg.xml配置,并以lazy的方式实例化。
DbPersistenceServiceFactory只有在第一次需要的时候实例化。实例化以后,服务工厂在JbpmConfiguration维护。DbPersistenceServiceFactory管理一个hibernate SessionFactory。但同样的,hibernate session factory当在第一次请求的时候以lazy的方式创建。
Figure 7.2. The persistence related classes
在调用jbpmConfiguration.createJbpmContext()的过程中,只有JbpmContext被创建。那时没有更多持久化相关的初始化操作。JbpmContext管理一个DbPersistenceService,DbPersistenceService是在第一次请求时实例化的。DbPersistenceService管理一个hibernate会话。同样的,一个DbPersistenceService之内的hibernate会话以lazy方式创建。因而,一个hibernate会话将只有在第一个请求持久化的操作被调用的时候打开。
7.1.3. 高级 API 用法
DbPersistenceService维护一个lazy初始化的hibernate会话。所有的数据库访问通过这个hibernate会话来完成。所有由jBPM完成的查询和更新是通过XxxSession形式的类来表现,比如GraphSession,SchedulerSession,LoggingSession,...这些会话类与hibernate查询有关,且底层全部使用相同的hibernate会话。
XxxSession类也是通过JbpmContext才可以访问的。
7.2. 配置持久化服务
7.2.1. Hibernate 会话工厂
默认情况下,DbPersistenceServiceFactory将使用ClassPath根目录下的hibernate.cfg.xml资源文件来创建hibernate会话工厂。需要注意的是hibernate配置文件资源和'jbom.hibernate.cfg.xml'属性相映射,且可以在jbpm.cfg.xml中被定制。以下是默认的配置:
<jbpm-configuration>
...
<!-- configuration resource files pointing to default configuration files in jbpm-{version}.jar -->
<string name='resource.hibernate.cfg.xml'
value='hibernate.cfg.xml' />
<!-- <string name='resource.hibernate.properties'
value='hibernate.properties' /> -->
...
</jbpm-configuration>
当resouce.hibernate.properties属性被指定,这些在那个资源文件中的properties将覆盖在hibernate.cfg.xml文件中的所有properties。hibernate.properties可以被用来处理jbpm方便升级:(hibernate.cfg.xml可以被拷贝而不必重新应用改变),而不是使用修改hibernate.cfg.xml的方式来指向你的数据库。
7.2.2. DbPersistenceServiceFactory
DbPersistenceServiceFactory本身有另外三个配置properties:isTransactionEnabled,sessionFactoryJndiName,dataSourceJndiName。想要在jbpm.cfg.xml中指定这些properties,你需要在factory元素中将服务工厂指定为一个bean。就如:
<jbpm-context>
<service name="persistence">
<factory>
<bean factory="org.jbpm.persistence.db.DbPersistenceServiceFactory">
<field name="isTransactionEnabled"><false /></field>
<field name="sessionFactoryJndiName">
<string value="java:/myHibSessFactJndiName" />
</field>
<field name="dataSourceJndiName">
<string value="java:/myDataSourceJndiName" />
</field>
</bean>
</factory>
</service>
...
</jbpm-context>
isTransactionEnabled: 默认情况下,jBPM将会开始和结束hibernate事务。为了禁用事务和阻止jPBM用hibernate管理事务,可以在上述的例子中将isTransactionEnabled配置为false。更多关于事务的信息,请看7.3节,“Hibernate事务”。
sessionFactoryJndiName: 默认情况下,这个值为null,意为会话工厂不是从JNDI获取的。如果这个值被设置,且需要会话工厂来创建一个hibernate会话,那么会话工厂将会使用提供的JNDI名称来被获取。
dataSourceJndiName: 默认情况下,这个值为null,且创建JDBC连接的工作将委托给hibernate。通过制定一个数据源,jBPM将从数据源获取一个JDBC连接,并会在打开一个新的会话时将连接提供给hibernate。要了解用户提供的JDBC连接,请看7.5节,“User provided stuff”。
7.3. Hibernate事务
默认情况下,jBPM将事务委托给hiberante,并在每个事务模式使用会话。当一个hibernate会话打开的时候,jPBM将开始一个hibernate事务。这将在JbpmContext之上的一个持久化操作初次调用的时候发生。事务将在hibernate会话关闭之前正确提交。提交操作在jbpmContext.close()方法内部完成。
使用jbpmContext.setRollbackOnly()来标记一个要回滚的事务。在那种情况下,事务将在jbpmContext.close()方法内执行会话关闭之前被正确回滚。
想要禁止jBPM调用hibernate API之上的任何事务方法,可以如7.2.2节“The DbPersistenceServiceFactory”所讲的将isTransactionEnabled属性设置为false。
7.4. 管理事务
管理事务最为常见的场景是当你在一个诸如JBoss的JEE应用服务器使用jBPM的时候。最为常见的场景有如下几种:
在你的应用服务器配置数据源
配置hibernate来使用数据源的连接
使用容器管理的事务
在jBPM中禁用事务
7.5. User provided stuff
你可以用编程的方式提供JDBC连接,Hiberante会话和Hiberante会话工厂给JBPM.
当这样的一个资源提供给jBPM,它将使用提供的资源而不是使用原先配置的那一个。
JbpmContext类包含了一些便利的方法来以编程的方式注入资源。比如,提供一个JDBC连接给jBPM可以使用如下代码:
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
try {
Connection connection = ...;
jbpmContext.setConnection(connection);
// invoke one or more persistence operations
} finally {
jbpmContext.close();
}
JbpmContext 类有以下几个便利的方法来以编程的方式提供资源:
JbpmContext.setConnection(Connection);
JbpmContext.setSession(Session);
JbpmContext.setSessionFactory(SessionFactory);
7.6.定制查询
所有jBPM使用的HQL查询都集中在一个配置文件中。那个资源文件在hibernate.cfg.xml配置文件被引用:
<hibernate-configuration>
...
<!-- hql queries and type defs -->
<mapping resource="org/jbpm/db/hibernate.queries.hbm.xml" />
...
</hibernate-configuration>
为了定义一个或多个那样的查询,可以拷贝一份原始文件并将你的新版本防止到CLASSPATH的某个地方,然后在hibernate.cfg.xml更新引用'org/jbpm/db/hibernate.queries.hbm.xml'来指向你的定制版本。
7.7. 数据库兼容性
jBPM运行于任何被hibernate支持的数据库之上。
jBPM的实例配置文件(src/config.files)指定了hypersonic内存数据库。那个数据库在开发期间和测试都相当理想。hypersonic内存数据库将它的所有数据库保存在内存,不放到磁盘上。
7.7.1. 改变jBPM数据库
下面的指示列表是在当你想改变jBPM以使用另一个数据库时要做的相关事情:
把jdbc驱动程序jar包放到CLASSPATH中
更新jBPM使用的hibernate配置
在新的数据库创建数据库表
7.7.2. jBPM 数据库方案表(Schema)
jbpm.db子项目,包含了一些驱动、指示和脚本来帮助你对你选择的数据库有个入门。请参考jbpm.db项目根目录下的readme.html来了解更多信息。
尽管jBPM能够为所有的数据库产生DDL脚本,但这些表并不总是经过优化的。所以你可能需要你的数据库管理员检查生成的DDL,以优化字段类型和使用索引。
在开发中你可能插入如下的hibernate配置:如果你把hibernate配置属性‘hibernate.hbm2ddl.auto’设置为‘create-drop’(比如在hibernate.cfg.xml),那么这些数据库表将在第一次在应用中使用到的时候自动创建到数据库中。当应用关闭,数据库表将被删除。
Schema的产生也可以通过jbpmConfiguration.createSchema()和jbpmConfiguration.dropSchema()方法用编程的方式调用。
7.8. 结合你的Hibernate类
在你的项目中,你可能会用Hibernate来做持久化。将你的持久化类和jBPM持久化类组合是可选的。将你的Hibernate持久化类和jBPM的Hibernate持久化结合有两个主要的好处:
首先,会话、连接和事务管理变得更加容易。通过结合jBPM和你的持久化到一个Hibernate会话工厂,将有【一个】hibernate会话,【一个】JDBC连接来处理你的和jBPM的持久化。所以自动地,当jBPM更新操作和在你自己的域模型的更新操作是在同一个事务当中。这可以排除使用一个事务管理的需求。
其次,这将允许你删除你的持久化对象到流程变量中而不用更多的处理。
集成你的持久化类和jBPM持久化类最简单的方式是通过创建一个中心的hibernate.cfg.xml.你可以把jBPM src/config.flies/hibernate.cfg.xml作为一个出发点并在那里添加引用到你自己的hibernate映射文件。
7.9. 定制jBPM hibernate映射文件
要定制任何jBPM的hibernate映射文件,你可以做如下处理:
从源代码src/java.jbpm/...或从jbpm.jar文件内部拷贝你想要拷贝的jBPM hibernate映射文件,并将这些拷贝放在CLASSPATH中你想要的任何地方。在配置文件hibernate.cfg.xml中更新引用到定制的映射文件。
7.10. 第二层缓存
jBPM使用hibernate的第二层缓存以便一旦流程定义装载后在内存中保存流程定义。流程定义类和集合在 jBPM Hibernate映射文件配置,cache元素的配置如:
<cache usage="nonstrict-read-write"/>
尽管流程定义(可能)不会变动,保存在第二层缓存也是可以的。详见第16章:“Changing deployed process definitions”
第二层缓存是JBoss jBPM实现的一个很重要的方面。如果没有缓存,JBoss jBPM和其他技术实现的BPM引擎相比可能有一系列的不足。
缓存策略被设置为:nonstrict-read-write。在运行时,缓存策略可能被设置为只读。但在那种情况下,你可能需要一组独立的hibernate映射文件来部署一个流程。这也是为什么我们选择nonstrict-read-write的原因。
订阅:
博文 (Atom)



