用JDO替代CMP的应用

来源:互联网 发布:福建广电网络客服 编辑:程序博客网 时间:2024/05/12 10:43
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>

  用JDO替代CMP的应用

  在大多数使用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等。

  CastorJDO和EJBCMP

  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-->

  JDO.castor.CastorJDOImpl"

  name="DefaultDomain:service=CastorJDO,name=castortestnews">

  file:../JDO/conf/database.xml

  JDO/castortestnews

  10000

  true

  false

  false

  JDO新版本中提供连接池-->

  true

 

  2.修改conf/default/standardjaws.xml文件

  java:/NewsDS

  Oracle8

  true

  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">

 

 

 

 

  JDO/conf/mapping.xml"/>

 

  安装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绑定服务的源码。

<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
原创粉丝点击