用JDO替代CMP的应用
来源:互联网 发布:福建广电网络客服 编辑:程序博客网 时间:2024/05/12 10:43
在大多数使用EJB的项目中,O/RMapping一直是Java开发者关注的问题。自从有了CMP(ContainerManagedPersistence),数据库映射需要做的工作轻松多了。然而,CMP仍然有不完善的地方??针对不同的应用服务器,CMP的映射描述文件不同,这在一定程度上阻碍了EJB的移植;CMP/CMR与数据表的映射关系比较复杂。经笔者测试,使用CastorJDO(Java数据对象)比使用CMP性能有很大的提高,而且能满足大多数应用的需求。
关于CastorJDO
CastorJDO是一个以RDBMS为中心的开放源码项目,虽然它与Sun的JDO有很多相似之处,但没有完全遵循JSR规范。一些主要技术上的差异使它与Sun的JDO规范并不十分相符。每一个持久对象在Castor中都有一个被观察的数据锁,这意味着事物的超时和死锁可以不被视为数据锁定。而Sun的JDO规范却隐藏了锁的细节。
内部的CastorJDO对每个事物活动的持久对象都提供一个数据锁的拷贝(包括缓存)维护。Sun的JDO未明确要求每一个事物的每一个对象用缓存,但它含蓄地要求具有字节码修饰者,而Castor却不需要。
Castor还提供一些Sun的JSR规范中没有提到的其它特性,比如键值生成器(常用于ID自动生成)、长时事务支持和OQL等。
JDO和EJBBean之间的关系很难用谁比谁更好来形容。实体Bean可以管理自身的持久性(EJB规范称为Bean管理的持久性或BMP),也可以依赖EJB容器来管理它(称为容器管理的持久性或CMP)。
对于BMP,实体Bean可以用CastorJDO作为持久性机制,或者使用其它的办法,比如直接使用JDBC作为持久性机制。对于CMP,EJB容器供应商可以在CastorJDO之上实施CMP,这样CastorJDO就被用来作为实体Bean的持久机制。
如果开发者需要EJB的管理生存周期、安全性、“一次开发随意部署”的承诺和分布式商业应用等特性,那么EJB是正确的选择。然而事实上,Castor的简洁、开放性、更多设计上的自由度和与CastorXML整合等特性,让人有充分的理由选择CastorJDO。庆幸的是,我们可结合EJB和CastorJDO的长处来弥补它们各自的短处,这就是本文的目的。
CastorJDO结合SessionBean使用
选择应用服务器
目前只有JBoss有支持CastorJDO的包。Castor会在将来的版中提供对J2EE的支持。笔者使用JBoss-2.4.9作为测试。如果选择CastorJDO完全替代CMP,可以不考虑使用支持最新CMP版本的应用服务器。
选择CastorJDO
为了获得最新版本的支持,可以选择最新的CastorJDO包。笔者测试时使用的版本是0.9.4。
配置JBoss
1.修改conf/default/jboss.jcml文件
oracle.jdbc.
driver.OracleDriver,org.hsqldb.jdbcDriver
...
name="DefaultDomain:service=XADataSource,name=NewsDS"> NewsDS org.jboss.pool.j dbc.xa.wrapper.XADataSourceImpl jdbcracle:thin:@192.168.1.7:1521:NEWS 1200000 scott 10 tiger ... ... JDO--> name="DefaultDomain:service=CastorJDO,name=castortestnews"> file:../JDO/conf/database.xml JDO/castortestnews 10000 true false false JDO新版本中提供连接池--> true 2.修改conf/default/standardjaws.xml文件 3.拷贝必要的jar包到lib/ext目录下 这些包包括:CastorJDO包castor-0.9.4.jar、JBoss2.4.x的CastorJDO补丁包castorJDOplugin.jar、JDBC驱动(笔者使用的是Oracle8.1.7)classes12.zip、XML解析包xerces-J_1.4.0.jar(笔者使用的是Castor推荐的xerces版本)。 配置CastorJDO 增加%JBOSS_HOME%/JDO/conf/database.xml文件,文件代码如下: JDOConfigurationDTDVersion1.0//EN" "http://castor.exolab.org/JDO-conf.dtd"> 安装Ant 使用Ant编译部署EJB应用,可以下载安装Ant的最新版本(笔者使用的是Ant-1.5.1)。 在SessionBean中封装JDO的方法,可以参考Castor的文档。注意,作为参数传递的JDOBean,需要实现Java串行化接口。封装JDO的代码如下: //ejbCreate方法中查询JDO ctx=newInitialContext(); JDO=(DataObjects)ctx.lookup("java:comp/env/JDO/CastortestnewsJDO"); //创建新对象,增加数据表中的一行 /**每一个查询或更新的方法打开新的db连接,使用后关闭,不关闭的连接会导致TransactionNotInProg ress异常*/ db=JDO.getDatabase(); auxType.setAuxDesc(auxDesc); db.create(auxType); db.close(); 在其它应用服务器上使用CastorJDO 针对不同的应用服务器,需要增加一个CastorJDOJNDI绑定的服务,为CastorJDO配置参数。例如,JBoss增加了一个JMXMBean的服务,提供了JBoss实现CastorJDOMBean绑定服务的源码。