| |
用jdo替代cmp的应用
在大多数使用ejb的项目中,o/r mapping一直是java开发者关注的问题。自从有了cmp(container managed persistence),数据库映射需要做的工作轻松多了。然而,cmp仍然有不完善的地方??针对不同的应用服务器,cmp的映射描述文件不同,这在一定程度上阻碍了ejb的移植;cmp/cmr与数据表的映射关系比较复杂。经笔者测试,使用castor jdo(java数据对象)比使用cmp性能有很大的提高,而且能满足大多数应用的需求。
关于castor jdo
castor jdo是一个以rdbms为中心的开放源码项目,虽然它与sun的jdo有很多相似之处,但没有完全遵循jsr规范。一些主要技术上的差异使它与sun的jdo规范并不十分相符。每一个持久对象在castor中都有一个被观察的数据锁,这意味着事物的超时和死锁可以不被视为数据锁定。而sun的jdo规范却隐藏了锁的细节。
内部的castor jdo对每个事物活动的持久对象都提供一个数据锁的拷贝(包括缓存)维护。sun的jdo未明确要求每一个事物的每一个对象用缓存,但它含蓄地要求具有字节码修饰者,而castor却不需要。
castor还提供一些sun的jsr规范中没有提到的其它特性,比如键值生成器(常用于id自动生成)、长时事务支持和oql等。
castor jdo和ejb cmp
jdo和ejb bean之间的关系很难用谁比谁更好来形容。实体bean可以管理自身的持久性(ejb规范称为bean管理的持久性或bmp),也可以依赖ejb容器来管理它(称为容器管理的持久性或cmp)。
对于bmp,实体bean可以用castor jdo作为持久性机制,或者使用其它的办法,比如直接使用jdbc作为持久性机制。对于cmp,ejb容器供应商可以在castor jdo之上实施cmp,这样castor jdo就被用来作为实体bean的持久机制。
如果开发者需要ejb的管理生存周期、安全性、“一次开发随意部署”的承诺和分布式商业应用等特性,那么ejb是正确的选择。然而事实上,castor的简洁、开放性、更多设计上的自由度和与castor xml整合等特性,让人有充分的理由选择castor jdo。庆幸的是,我们可结合ejb和castor jdo的长处来弥补它们各自的短处,这就是本文的目的。
castor jdo结合sessionbean使用
选择应用服务器
目前只有jboss有支持castor jdo的包。castor会在将来的版中提供对j2ee的支持。笔者使用jboss-2.4.9作为测试。如果选择castor jdo完全替代cmp,可以不考虑使用支持最新cmp版本的应用服务器。
选择castor jdo
为了获得最新版本的支持,可以选择最新的castor jdo包。笔者测试时使用的版本是0.9.4。
配置jboss
1.修改conf/default/jboss.jcml文件
<!-增加jdbc驱动-->
<mbean code="org.jboss.jdbc.jdbcprovider" name="defaultdomain:service=jdbcprovider">
<attribute name="drivers">oracle.jdbc.
driver.oracledriver,org.hsqldb.jdbcdriver</attribute>
</mbean>
...
<!--配置jdbc数据源-->
<mbean code="org.jboss.jdbc.xadatasourceloader"
name="defaultdomain:service=xadatasource,name=newsds">
<attribute name="poolname">newsds</attribute>
<attribute name="datasourceclass">org.jboss.pool.j
dbc.xa.wrapper.xadatasourceimpl</attribute>
<attribute name="properties"></attribute>
<attribute name="url">jdbc:oracle:thin:@192.168.1.7:1521:news</attribute>
<attribute name="gcminidletime">1200000</attribute>
<attribute name="jdbcuser">scott</attribute>
<attribute name="maxsize">10</attribute>
<attribute name="password">tiger</attribute>
...
</mbean>
...
<!-在文件最后配置castorjdo-->
<mbean code="org.jboss.jdo.castor.castorjdoimpl"
name="defaultdomain:service=castorjdo,name=castortestnews">
<attribute name="configuration">file:../jdo/conf/database.xml</attribute>
<attribute name="jndiname">jdo/castortestnews</attribute>
<attribute name="locktimeout">10000</attribute>
<attribute name="loggingenabled">true</attribute>
<attribute name="commonclasspath">false</attribute>
<attribute name="autostore">false</attribute>
<!-castor jdo新版本中提供连接池-->
<attribute name="databasepooling">true</attribute>
</mbean>
2.修改conf/default/standardjaws.xml文件
<datasource>java:/newsds</datasource>
<type-mapping>oracle8</type-mapping>
<debug>true</debug>
3.拷贝必要的jar包到lib/ext目录下
这些包包括:castor jdo包castor-0.9.4.jar、jboss2.4.x的castor jdo补丁包castorjdoplugin.jar、jdbc驱动(笔者使用的是oracle 8.1.7)classes12.zip、xml解析包xerces-j_1.4.0.jar(笔者使用的是castor推荐的xerces版本)。
配置castor jdo
增加%jboss_home%jdoconfdatabase.xml文件,文件代码如下:
<!doctype databases public "-//exolab/castor jdo configuration dtd version 1.0//en"
"http://castor.exolab.org/jdo-conf.dtd">
<database name="news" engine="oracle">
<!-下面的jndi name与standardjaws.xml中的datasource对应-->
<jndi name="java:/newsds" />
<!--路径可以由读者指定,但父目录必须是%jboss_home%-->
<mapping href="../jdo/conf/mapping.xml" />
</database>
安装ant
使用ant编译部署ejb应用,可以下载安装ant的最新版本(笔者使用的是ant-1.5.1)。
在sessionbean中封装jdo的方法,可以参考castor的文档。注意,作为参数传递的jdo bean,需要实现java串行化接口。封装jdo的代码如下:
//ejbcreate方法中查询jdo
ctx = new initialcontext();
jdo = (dataobjects) ctx.lookup("java:comp/env/jdo/castortestnewsjdo");
//创建新对象,增加数据表中的一行
/**每一个查询或更新的方法打开新的db连接,使用后关闭,不关闭的连接会导致transactionnotinprog
ress异常*/
db = jdo.getdatabase();
auxtype.setauxdesc(auxdesc);
db.create(auxtype);
db.close();
在其它应用服务器上使用castor jdo
针对不同的应用服务器,需要增加一个castor jdo jndi绑定的服务,为castor jdo配置参数。例如,jboss增加了一个jmx mbean的服务,提供了jboss 实现castor jdo mbean绑定服务的源码。
|
|