??xml version="1.0" encoding="utf-8" standalone="yes"?> 下面以一个具体的实例来学习如何用FineReport调用Oracle存储q程的?
W一步,Oracel定义存储q程
StScroe是Oracele数据库中的张表,其中记录了学生的成W信息Q表l构如下Q?
定义q回列表的存储过E?#8212;—׃oracle存储q程没有q回|它的所有返回值都是通过out参数来替代的Q列表同样也不例外,但由于是集合Q所以不能用一般的参数Q必要用pagkage了,所以定义存储过E要分两部分Q?
1.建立一个程序包Q如下:
CREATE or REPLACE PACKAGE TESTPACKAGE AS 2.建立存储q程Q存储过EؓQ? CREATE or REPLACE PROCEDURE p_STSCORE(Class in varchar2,p_CURSOR out TESTPACKAGE.Test_CURSOR) IS W二步,调用存储q程
1.启动FineReport设计器,叛_数据源面板,选择U有数据源,弹出U有数据源对话框?
2.点击增加按钮Q新Z个私有数据源Q名为ds1Q数据库选择为Oracle数据源,查询cd为存储过E,在sql文本框中写如下语句调用存储过E:
3.点击预览按钮Q可以预览查询到的数据,如下所C:
xQFineReport设计器成功调用Oracle存储q程Q您可以Ҏ报表需求随心所Ʋ地设计报表样式了?
Web Service 现如今已l成?SOA 实现标准之一。很多公司已l或者正在参与到 Web Service 目的实现和部v中。Web Service 的优点在于松散的处理异构pȝ之间的通信和数据交换,可以随机应变的处理企业各个系l之间的整合问题。但是同ӞWeb Service 采用 XML 标准q行pȝ间的数据传输Q加大了传输的数据量Q尤其是在传输一些具有比较严格结构的数据Ӟ会得传输效率有所下降。所以,如何提高 Web Service 传输效率成ؓ很多公司q行目部v旉常关心的问题?/p>
本文介绍了在 Web Service 实施和开发过E中Q提高系l效率的一些方法,实践证明Q这些方法都是非常有效且易于实现的。不同的Ҏ都有其应用领域和优缺点,我们会分别进行讨论。文章的主要目的在于Q提供给读者多U方式的基本解决ҎQ得读者在 Web Service 目部vӞ拥有更多的思\?/p>
Web Service 是采?XML 标准q行数据传输的。XML 在传输过E中Q会附带很多数据的相关信息,q以标签的Ş式表现出来。在传输q程中,一些情况下Q这些标{会占用一半以上甚x多的数据传输量,例如Q要传输一个表g息,如下Q表g的h名ؓ虚构的): ?1 中的数据在传输过E中Q有可能会生成下面的 XML 文g:
TYPE Test_CURSOR IS REF CURSOR;
END TESTPACKAGE;
BEGIN
OPEN p_CURSOR FOR select * FROM FR.STSCORE where STSCORE.ClassNo=Class;
END p_STSCORE;
]]>
J2EE常用工具cZValue Object工具c?/a>
J2EE常用工具cZJson工具
J2EE常用工具cZJdbc操作
J2EE常用工具cZHibernate操作
J2EE常用工具cZCookie操作
J2EE常用工具cZ数l操?/a>
J2EE常用工具cZ时间处理工L
J2EE常用工具cZ文件打包解包处理类
J2EE常用工具cZ—文件操作类
J2EE常用工具cZ—邮件处理类(javaMail发送邮?
J2EE常用工具cZ—字W串工具c?/a>
jar文g和apiQ?
J2EE常用工具cjar及API
]]>
?1. 要q行传输的表格示?/strong>
Name
City
Apartment
Air Wang
Beijing
Some Place
清单 1. 对应于表 1 数据所传输?XML 文gCZ
<Heading>
<column> Name</column>
<column>City</column>
<column>Apartment</column>
</Heading>
<Data Grid>
<row>
<column>Air Wang</column>
<column>Beijing</column>
<column>IBM CDL</column>
</row>
</Data Grid>
如果上面的表gq带有格式的信息Q比如字体,背景颜色{等Q的话,那么相应?XML ׃更加复杂了。从上述 XML 中我们可以看出,除了数据之外QXML 会附加很多标{信息,q就使得传输的数据量增大Q当所需要传输的数据比较多的时候,XML的标{ְ会带来比较大的效率问题?
Web Service 在网l中传输的是?XML 为基的消息的h和响应。大量的数据传输会ɾ|络成ؓ瓉。一个最直接的解x案就是对传输的消息进行压~。对于不同规模的数据量,压羃应该有不同的解决ҎQ下面分别介l如?
1. 对于整个 XML 传输文gq行压羃
数据压羃已经发展了很多年Q有很多成熟的技术,法以及工具包。经常用于对数据压羃?API ?gzip {方式。对文gq行压羃的做法非常简单,是在发?XML 之前?XML q行压羃Q经q压~以后,再在 XML 接收端对已经压羃的文件进行解压羃?br />
优点:
该方法的优点在于Q用了成熟的压~和解压~技术,当数据量比较大的时候,可以大大提高传输效率。对于纯文本?XMLQ压~可以减其80%以上的体U?br />
~点Q?br />
压羃和解压羃虽然可以使得 XML 的体U大大减,但是其过E却是十分耗费pȝ资源的。压~和解压~往往会具有很大的 CPU 占有率以及内存占有率。对于配|不高的客户端甚x服务器端Q都会造成不小的压力?br />
应用场景:
该技术应用于|络瓉非常严重的情冉|是主机配|比较高的情c?br />
举例:
正如本小节最开始已l介l的Q现在已l有很多成熟的压~与解压~的 API 提供l开发h员进行用,我们选取其中最常用?gzip 方式举例说明。一般来Ԍpȝh XML 的体U相对较,没有必要使用压羃和解压羃的方法处理请?XML。而对于系l响?XML 来讲Q一般都包含大量的数据,D其体U庞大,需要进行压~处理。对响应 XML q行压羃的流E如?
服务器端数据模型-->序列化操?->利用 gzip 方式对序列化后的 XML q行压羃-->q回到客L-->?gzip 方式q行解压~?->对解压羃后的 XML q行反序列化操作-->客户端数据模?br />
q里需要说明的一ҎQ客L以及服务器端的数据模型需要实?Serializable 接口?
清单 2. gzip 方式压羃部分实现代码CZQjava 实现Q?/strong>
import java.io.*; import java.util.zip.*; public class Compress { public String gzip(OutputStream pStream) { … try { GZIPOutputStream stream = new GZIPOutputStream(pStream); return stream.toString(); }catch(IOException e){…} … return null; } … } |
在程序将对象模型序列化成 XML 之前Q可以用上面的压羃ҎQ对数据进行压~。部分代码如?
清单 3. 对象模型序列化后再进行压~的实现代码CZ
public class XMLSerializerHelper { … public static String saveOBJtoString(Object inputOBJ) throws ConverException { …… ByteArrayOutputStream outputStream = null; try{ outputStream = new java.io.ByteArrayOutputStream(); m_serializer.save((IXMLSerializable) inputObject, outputStream); return Compress.gzip(outputStream); }catch(Exception e){…} …… } … } |
解压~的q程也类g上述代码。测试表明,采用 gzip 压羃可以减少60%以上的网l所带来的消耗?/p>
2. 对于特定的数据进行特D的处理
在企业日常的数据传输中,往往大量的数据具有很多共同的特点。数据和数据之间往往h很多相同的地方,或者说Q具有很多重复的地方。例如,在一个以 Web Service 为构架的报表处理pȝ中,报表往往会含有很多的I数据,或者相同属性和值域的数据,对于q样的情况,可以在代码中对特D情况进行特D的处理。我们同样以传输一个表gZ子,如下:
Software sold | Hardware sold | System sold | Others |
---|---|---|---|
120 | - | - | - |
- | - | 90 | - |
- | 110 | - | - |
可以看到Q上q表格具有很多的I|那么?XML 中完全可以把I值的部分l一处理Q这样就能大大减网l传输的数量Q其对应的部?XML 如下Q?
清单 4. 对空D行处理后的简?XML CZ
…… <NULL Value>(1,2),(1,3),(1,4),(2,1),(2,2),(2,4)(3,1),(3,3),(3,4)</NULL Value> …… |
优点:
对于重复性的数据来说Q该Ҏ可以几十倍甚至上癑ր的减少传输的数据量Q这取决于数据重复的数量大小Q,相对于第一U压~方式,׃只是对固定Ş式的数据q行处理Q所以不会占用很大的 CPU 以及内存?br />
~点:
数据的特点不Ҏ把握Q能够处理的情况比较单和单一。对于空值或者某些值重复较多的情况Q可以采用本Ҏ?/p>
解决Ҏ? 减少多次调用Q尽量用一ơ性的调用方式?/span>
传统?RPC 调用Q在多次使用的时候会产生很大的效率问题。用户在q行每次q程调用的时候都要等待网l传输所耗费的时间。而对?Web Service 来讲Q很多用户仍然将其作Zl的 RPC 来进行调用。每ơ都调用 Web Service Provider 所提供的函敎ͼ造成了效率的极大费。Web Service 的一大特点在于,可以在本地进行一ơ性的讄Q再把生成的 XML l一的发送给服务的另外一端。对于用hԌ所有的讄工作都是在本地进行的Q用户完全感觉不到网l所带来的瓶颈,而在最后的数据传输q程中,多消耗一些时间也是值得的?br />
应用场景:
对于同用户交互的情况Q尽可能使用q样的处理,卛_多ơ的q程调用Q尽量得程序仅需完成一ơ调用。D一个简单的例子来说明问题:在一个用L面上QUser InterfaceQ,需要进行很多的讄Q而这些设|的每一步都是需要进行远E调用的Q这样对于用h_׃在每一ơ的讄q程中都{待|络传输所耗费的时间。而对?Web Service 而言Q客L所有的工作是生成h XMLQ所有的讄工作都可以统一生成一?XML 文gQ然后将其传送给服务器端Q这样一来,用户只用{待一ơ的数据传输旉Q可能相Ҏ间较长,但是用户只用{待一ơ,q是值得的)Q而其他的工作都在服务器端q行处理?br />
优点:
所有数据操作在本地q行Q用户在处理数据时不会感到网l所带来的停ѝ最l所有操作请求统一发送给服务器端Q得原本多ơ等待的q程操作只需要一ơ数据传输就能完成?br />
举例:
下面的两q图Q图 1 和图 2Q是某数据导入向g的两个步骤,用户通过界面讄数据库以及数据表的信息,从而得到目的数据?/p>
?1. 数据导入讄向导CZ一
?2. 数据导入讄向导CZ?/strong>
很多初学者容易进入的一个误区是在数据库选择以后Q在E序中直接连接数据库Q通过用户提供的用户密码徏立数据库q接Q然后在后箋的每一个步骤中Q如图中的设定数据表条gQ都q行q程函数调用Q以至于用户每一ơ点dg?#8220;下一?#8221;按钮旉会感觉到|络带来的瓶颈,例如停顿感,或者更严重的程序一D|间的没有响应{等。事实上Q对?Web Service 来讲Q每一步都可以对请?XML q行讄Q这U设|是在本地进行的Q,当所有步骤都完成以后Q再?XML l一发送给服务器端q行处理。这样一来,用户在每一步之间的操作都是在本地进行的Q不会带来多余的|络响应{待旉Q得整个向导的讄工作能够很快的进行。而最后一步完成以后,用户对于|络的一ơ性等待是相对值得的。在q个例子中,hXML的部分结构如?
清单 5. 客户端进行数据导入设|的 XML CZ
…… <Data Retrieving> <Database> <Type>Toolbox</Type> <Pattern>TCP/IP</Pattern> <UserName>Wang Yun</UserName> </Password> </Database> <Table> <Condition method=’more than’ value=’table’ >2500</Condition> <Condition method=’equal to’ value=’table’>Wang Yun</Condition> <Condition method=’less than’ value=’table’>10 days</Condition> </Table> <Data Retrieving> …… |
pȝ客户端对 XML q行讄的部分示例代码如下(对象模型序列化的过E,仅列?Database 节点Q?
清单 6. 对象模型序列化成 XML CZ
public class DataBaseLoginOBJ { … public Element persistToXML(DataObject pOBJ) { … Element dbElement = pOBJ.createElement(“Database”); Element typeElement = pOBJ.createElement(“Type”); Element patternElement = pOBJ.createElement(“Pattern”); Element userElement = pOBJ.createElement(“UserName”); Element pwdElement = pOBJ.createElement(“Password”); dbElement.appendChild(typeElement); dbElement.appendChild(patternElement); dbElement.appendChild(userElement); dbElement.appendChild(pwdElement); … } … } |
现在软g领域有很多种cȝ XML 解析器,最基本的方式有两种QDOM ?SAX。对于不同别的XML文gQ应该用不同的解析器。有?XML 解析器的介绍Q请参考其他相x档。下面列Z们用的场景以及优缺?
U类 | 优点 | ~点 | 使用场景 |
---|---|---|---|
DOM | 1.XML树在内存中完整存储,因此可以直接修改其数据和l构?2.可以通过该解析器随时讉KXML树中的Q何一个节炏V?3.DOM解析器的API在用上也相Ҏ较简单?/td> | 如果XML文档体积比较大时Q将文档d内存是非常消耗系l资源的?/td> | DOM 是用与^台和语言无关的方式表C?XML 文档的官?W3C 标准。DOM 是以层次l构l织的节点的集合。这个层ơ结构允许开发h员在树中L特定信息。分析该l构通常需要加载整个文档和构造层ơ结构,然后才能q行M工作。DOM是基于对象层ơ结构的?/td> |
SAX | SAX 对内存的要求比较低,因ؓ它让开发h员自己来军_所要处理的标签。特别是当开发h员只需要处理文档中所包含的部分数据时QSAX q种扩展能力得到了更好的体现?/td> | 用SAX方式q行XML解析Ӟ需要顺序执行,所以很难访问到同一文档中的不同数据。此外,在基于该方式的解析编码过E也相对复杂?/td> | 对于含有数据量十分巨大,而又不用Ҏ档的所有数据进行遍历或者分析的时候,使用该方法十分有效。该Ҏ不用整个文档读入内存,而只需d到程序所需的文档标{֤卛_?/td> |
正确的选择XML解析器的U类Q对于Web Servicepȝ的效率会有很大的帮助。现在有很多厂家提供了基于这两种cd的很多XML解析器,在选择的时候,应该仔细阅读说明文档Q慎重进行选择。另外,往往在一个系l中可以同时使用q两U方式,以达到解析的最高效率。一般来Ԍ对于hXML可以采用DOM的解析方式进行解析,而对于响应XML可以使用SAX的方式进行解析?/p>
我们知道QWeb Service 解决Ҏ在网l中传输 XML h比较复杂的结构。在传输q程中,不仅仅必要的数据被发送和接收Q同时也会由?XML 的结构过于冗杂而附加了更多的信息进行传输。D例如?
pȝ客户端从服务器端得到的返回数据的响应 XML l构如下:
清单 7. 在网l中传输的表格数据对应的 XML
<Cells> <Heading Cells> <Column> <Row> Data </Row> </Column> <Column> <Row/> </Column> … </Heading Cells> <DataGrid Cells> … </DataGrid Cells> </Cells> |
׃面的 XML 我们可以看出Q每一个返回数|都至有 <Column>, </Column>, <Row>, </Row> 来标识它Q也是_如果我们要传输一个表|那么表格中每一个数据都要伴随传输相应的q四个标{。假设表g的每一个数据的字节Cؓ8Q那么标{所带来的附加字节就近为数据的4倍。如果要传输的数据量十分巨大的话Q效率自然会降低许多。所以我们可以采用一U十分简单的方式Q有效的减少XML所带来的附加字节数Q即化XML标签。可以将上面所说的XML改写成下面的格式:
清单 8. 对应于清?7 的简化后?XML
<Cells> <Heading Cells> <C> <R> Data </R> </C> <C> <R/> </C> … </Heading Cells> <DataGrid Cells> … </DataGrid Cells> </Cells> |
优点:
试证明Q采用这L改进方式Q可以得整个系l的效率提高q一倍甚x多。而且q样的处理方式简单易行,只是修改标签可以了?br />
~点:
使XML自n代表的意义变得不那么ҎLQI补的方式是一般会有一个对照表Q来说明具体化后?XML 文g的含义?br />
举例:
该方法比较简单直观,q里列出对照表的一个例子如?
化前标签 | 化后标签 | 含义 |
---|---|---|
Row | R | 表示表格中的?/td> |
Column | C | 表示表格中的?/td> |
... | ... | ... |
cM上面q样的声明表格应该作为文档提供给用户?/p>
应用场景:
q里需要说明一点,XML 能够清晰的表C出整个数据l构Q而很多Y件开发h员往往希望利用 XML 来观察数据的情况Q而标{ְ是协助他们更好的完成q样的工作。所以,一般来Ԍ标签需要尽可能的有意义Q由?C ?R 可以比较明确的表C?Column ?RowQƈ且他们在数据传输q程中是重复的最多的Q占传输标签L?0%Q,所以我们进行了上述的改动。但是对于像 Cells q样的标{,׃光复率不是很高Q而且我们需要这个标{օ有字面上的意义,所以,cM于这L情况Q我们给予保留?/p>
前面介绍的四U提高效率的Ҏ都是Z XML 传输的,也就是说Q都是在如何提高 XML 传输效率上进行介l的。而第五种机制对于M的Y件解x案都适用Q而对?Web Service 解决Ҏ来讲Q更是具有锦上添q作用。缓存机制最通用的一个思想是,用次数比较多的数据缓存v来,如果再有相同hӞ将~存中的数据q回。这样会减少数据逻辑处理所带来的时间。我们以用户的一ơ刷新数据的操作ZQ介l一U比较通用的缓存方式,如图:
由图中可知,当用戯行刷新操作时Q服务器端先查请?XMLQ取h数据源的 CUID。根据该 CUIDQ系l检查在~存中是否存在该 CUID 对应的数据对象,如果有,则取出其h状态,q与对应?CUID 的数据源的刷新状态进行比较。如果比较一_则直接返回数据给客户端,如果比较不一_则需要打开数据源进行重新刷斎ͼq将h以后的结果集的对象保存在~存中。如果缓存已l满了,则利用最q最用原则,清除~存中的一部分数据对象。另外,~存的大设|是可以通过属性文件进行设|的Q在E序中,对缓存进行初始化Ӟ首先d了属性文件来q行~存大小的设定。缓存数据的好处在于Q在Ҏ据进行多ơ重复刷新时Q系l不需要重新打开数据源(有时候连接ƈ打开数据源是非常消耗时间的Q,从而提高了pȝ的效率?br />
优点:
对于多次的相同方式的数据操作Q数据直接从~存q回Q可以很大程度的提高pȝ效率?br />
~点:
~程的工作量比较大,需要测试的部分比较多?br />
应用场景:
一般的 Web Service 部vE序都可以采用缓存机制的处理?/p>
对于 Web Service 服务器,各个厂商都提供了很多服务器设|,以提?Web Service 的性能和效率。具体请参考相x务器的文档?/p>
对于提高 Web Service 的效率,本文l出了一些解x案,从各个不同方面对 Web Service 效率的提高进行了讨论。对于不同的应用pȝQ应该酌情分析系l徏立的环境以及pȝ的用h和范围Q以最l决定采用何U解x案?/p>
4. HibernateQ?/strong> 5. EhcacheQ?/strong> 6. JCrontabQ?/strong> 8. JSF / MyFaces: 9. Log4jQ?br />
Log4j是Apache的一个开放源代码目Q通过使用Log4jQ我们可以控制日志信息输送的目的地是控制台、文件、GUIlg、甚x套接口服务器、NT的事件记录器、UNIX Syslog守护q程{;我们也可以控制每一条日志的输出格式Q通过定义每一条日志信息的U别Q我们能够更加细致地控制日志的生成过E。最令h感兴的是Q这些可以通过一个配|文件来灉|地进行配|,而不需要修改应用的代码?br />
q是一个可选包Q如果不使用Log4j的话Qcommons-logging会自动用SUN J2SDK的日志包Q不q我们还是推荐用Log4jQ它的功能非常强大?/p>
10. LuceneQ?br />
Lucene是一个开放源E序的搜d引擎Q利用它可以LCؓJava软g加入全文搜寻功能。Lucene的最主要工作是替文g的每一个字作烦引,索引让搜ȝ效率比传l的逐字比较大大提高QLucen提供一l解读,qoQ分析文Ӟ~排和用烦引的APIQ它的强大之处除了高效和单外Q是最重要的是使用者可以随时应自已需要自订其功能?br />
我们使用Lucene建立索引Qƈ在这基础上实C全文搜烦功能?/p>
11. AntQ?/strong> 12. AxisQ?br />
Axis是一个SOAP引擎Q提供创建服务器端、客L和网关SOAP操作的基本框架。SOAP是被q泛作ؓC代跨q_、跨语言分布计算Web Services的重要部分?br />
|客通^C用Axis提供WebService支持Q广泛应用于通用数据接口Q对外系l提供服务等功能?br />
如: 13. JavaMailQ?/strong> 14. XDocletQ?/strong> 15. JSTLQ?br />
JSP 标准标记库(JSP Standard Tag LibraryQJSTLQ是一个实?Web 应用E序中常见的通用功能的定制标记库集,q些功能包括q代和条件判断、数据管理格式化、XML 操作以及数据库访问?br />
我们使用JSTL装各种业务逻辑?/p>
16. Jakarta OROQ?/strong> 17. SwarmCache / JGroupsQ?/strong> 18. JUnitQ?/strong>
Hibernate是一个开放源代码的对象关pL框Ӟ它对JDBCq行了非常轻量的对象封装,使得JavaE序员可以随心所Ʋ的使用对象~程思维来操U|据库。Hibernate可以应用在Q何用JDBC的场合,既可以在Java的客LE序实用Q也可以在Servlet/JSP的Web应用中用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMPQ完成数据持久化的重仅R?br />
在^CQ我们采用Hibernateq行数据库操作,只有在一些对数据库性能有特别要求的模块Q才直接使用jdbcq行q接?/p>
EhcacheHibernateQ在Hibernate中用它作ؓ数据~存的解x案。这是Hibernate必须的包?/p>
它是由Java语言~写的日E处理程序,它目的是提供强大的定时处理功能,让我们的应用E序可以按照提供的时间表来执行不同的应用?br />
我们主要用Jcrontab理以下一些定时Q务:
1) q排行榜后台更新q程Q自动计年排行榜?br />
2) 月排行榜后台更新q程Q自动计月排行榜?br />
3) 周排行榜后台更新q程Q自动计周排行榜?br />
4) 日排行榜后台更新q程Q自动计日排行榜?br />
5) 更新对象~存Q实现对象缓存的更新Q处理那些长期没被再一ơ访问的对象~存?br />
6) 清页面缓存:当管理员使用的手工刷新页面缓存的功能Ӟpȝ会将q些需要刷新的~存加到一个队列中Q由本进E负责刷新?br />
7) 相关产品自动实现间隔Q相关品的计算对系l消耗比较大Q所以系l不会对所有几十万个商品进行计,只有在用h看单个商品时出q个商品的相关品ƈq行~存。那么当用户下一ơ访问这个商品的相关产品时就直接从缓存中d出来。而这个进E就是ؓ了定时更新这个缓存?br />
8) 自动推荐后台更新q程Q进E根据商品推荐规则进行自动推荐?
9) 新闻推荐后台更新q程Q进E根据新L荐规则进行自动推荐?br />
10) 关键字后台进E:当用户在前台搜烦栏中输入一个查询值时Q系lƈ不马上将其统计到关键字,而是攑ֈ内存中,由此q程定时l计?br />
11) 保存讉K量信息进E:用户每访问一ơ系l,pȝq不马上l计Q而是攑ֈ内存中,由此q程定时保存到数据库Q供l计q程q行l计?br />
12) q访问量排行计算Q计年讉K量排行榜?br />
13) 月访问量排行计算Q计月讉K量排行榜?br />
14) 周访问量排行计算Q计周讉K量排行榜?br />
15) 日访问量排行计算Q计日讉K量排行榜?br />
16) q降h行计:计算q降h行榜?br />
17) 月降h行计:计算月降h行榜?br />
18) 周降h行计:计算周降h行榜?br />
19) 日降h行计:计算日降h行榜?br />
20) l计计算Q每天对讉K量进行统计?br />
21) 生成订阅邮g列表q程Q根据用L订阅讄Q生成需要发送的邮g队列?br />
22) 发送订阅邮件进E:Ҏ要发送的邮g队列发送邮件?br />
23) 拍卖自动Zhq程Q实现拍卖模块中的自动出价功能?br />
7. JCSQ?/strong>
JCS是Jakarta的项目Turbine的子目。它是一个复合式的缓冲工兗可以将对象~冲到内存、硬盘。具有缓冲对象时间过期设定。还可以通过JCS构徏h~冲的分布式构架Q以实现高性能的应用?br />
对于一些需要频J访问而每讉K一ơ都非常消耗资源的对象Q可以时存攑֜~冲ZQ这样可以提高服务的性能。而JCS正是一个很好的~冲工具。缓冲工具对于读操作q远多于写操作的应用性能提高非常显著?br />
|客通^C使用jCS提供~存功能Q主要是面~存和对象缓存,通过JCSQ系l将用户讉Kq的面和对象缓存到内存中,对于讉K量巨大,内存~存已经不能负荷的情况下Q我们还可以缓存设|到盘中保存?br />
使用~存的话Q能系l可负蝲和性能大幅度的提升。当没有使用集群环境的情况下Q缓存是一U必不可的技术?/p>
JavaServer Faces (JSF) 是一U用于构?Web 应用E序的新标准 Java 框架。它提供了一U以lgZ心来开?Java Web 用户界面的方法,从而简化了开发?br />
JSF 的主要优势之一是它既?Java Web 用户界面标准又是严格遵@模型Q视图-控制?(MVC) 设计模式的框架。用L面代码(视图Q与应用E序数据和逻辑Q模型)的清晰分M JSF 应用E序更易于管理。ؓ了准备提供页面对应用E序数据讉K?JSF 上下文和防止寚w面未授权或不正确的访问,所有与应用E序的用户交互均׃个前?#8220;Faces”servletQ控制器Q来处理?br />
MyFaces是JavaServer FacesQJSFQ?Web框架 QJSR 127Q的一个实现。提供了很多常用控g?br />
我们q_中采用一些基于JSF框架的MyFaces控g。这样ɽE序l构十分清晰?/p>
Ant是一个基于Java的自动化脚本引擎Q脚本格式ؓXML?br />
我们除了用Ant做Java~译相关d外,q通过插g实现很多应用的调用。包括程序编译、打包、Hibernate配置文g自动生成、部|Ӏ以及单元测试等操作?br />
当一个代码项目大了以后,每次重新~译Q打包,试{都会变得非常复杂而且重复Q因此c语言中有make脚本来帮助这些工作的扚w完成。在Java中应用是q_无关性的Q当然不会用q_相关的make脚本来完成这些批处理d了,Ant本n是q样一个流E脚本引擎,用于自动化调用程序完成项目的~译Q打包,试{。除了基于JAVA是^台无关的外,脚本的格式是ZXML的,比make脚本来说q要好维护一些?/p>
1) 商品查询服务Q提供接口让外接pȝ可以查到q_中的商品信息?br />
2) 新闻发布服务Q提供接口让外接pȝ可以取到各类新闻?br />
3) 订单服务Q提供接口让外接pȝ可以在^C生成订单Qƈ获取各种订单信息?br />
注:上述服务都有严格的权限控制?/p>
JavaMail是Sun发布的用来处理email的API。它可以方便地执行一些常用的邮g传输?br />
我们使用JavaMail实现了^C邮g发送、群发等相关功能Q供业务pȝ使用?/p>
XDoclet是一个开源项目,可以通过在java源代码中的一些特D的注释信息Q自动生成配|文件、源代码{等。例如web、ejb的部|描q文件等?br />
我们用XDoclet来生成Hibernate的hbm配置文g?/p>
Jakarta ORO Java cL一套文本处理Javac,提供了与Perl5 兼容的规则表辑ּQ类AWK规则表达式,glob 表达式,以及用于执行替换、分剌Ӏ过滤文件名{的工具。这个包是OROMatcher, AwkTools, PerlTools, and TextTools libraries originally from ORO, Inc的后l品?br />
|客通^C用ORO处理正则表达式,q泛应用于各U文本处理中?/p>
SwarmCache是一个简单且有效的分布式~存Q它使用IP multicast与同一个局域网的其他主行通讯Q是特别为集和数据驱动web应用E序而设计的。SwarmCache能够让典型的L作大大超q写操作的这cd用提供更好的性能支持。SwarmCache使用JavaGroups来管理从属关pd分布式缓存的通讯?br />
JGroups是一个开源的Ujava~写的可靠的组通讯工具。其工作模式ZIP多播Q但可以在可靠性和组成员理上进行扩展。其l构上设计灵z,提供了一U灵zd容多U协议的协议栈,对于每个产品都有不同的可靠性需求。这U协议栈可以让用户定义的自己可靠性指标和性能指标?br />
当用集环境时Q系l存在着~存同步的问题,需要对集群中每一台服务器的缓存进行同步,q样必要有一个缓存同步的机制QSwarmCache和JGroups是Z解决q个问题而被加到|客通中?/p>
JUnit是由 Erich Gamma ?Kent Beck ~写的一个回归测试框Ӟregression testing frameworkQ。Junit试是程序员试Q即所谓白盒测试,因ؓE序员知道被试的Y件如何(HowQ完成功能和完成什么样QWhatQ的功能?br />
我们主要用JUnit来进行单元测试?/p>
]]>