字號: 小 中 大 |
推薦給好友
上一篇 |
下一篇
用JDO替代CMP的應用
發布: 2007-6-08 17:45 |
作者: 網絡轉載 |
來源:
網絡 |
查看: 45次 | 進入軟件測試論壇討論
領測軟件測試網
在大多數使用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%\jdo\conf\database.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綁定服務的源碼。
|
文章來源于領測軟件測試網 http://www.kjueaiud.com/
TAG:
cmp
應用
用
jdo
替代