引言
Spring Framework(通常稱為 Spring)是一個(gè)開放源代碼項(xiàng)目,,目的是為了使 J2EE™ 環(huán)境更具可訪問性,。Spring 為簡(jiǎn)單 Java™ 對(duì)象提供框架,使這些對(duì)象可以通過包裝類和 XML 配置使用 J2EE 容器,。Spring 的目標(biāo)是為這些項(xiàng)目提供顯著的好處,,提高這些項(xiàng)目的開發(fā)效率和運(yùn)行時(shí)性能,同時(shí)改進(jìn)測(cè)試覆蓋率和應(yīng)用程序質(zhì)量,。
Hibernate 是開放源代碼持久性和查詢框架,,提供傳統(tǒng) Java 對(duì)象(Plain Old Java Object,POJO)到關(guān)系數(shù)據(jù)庫(kù)表的對(duì)象-關(guān)系映射,,以及數(shù)據(jù)查詢和檢索功能,。
盡管許多組織感興趣的是了解使用這些框架能夠獲得什么好處,但 IBM 希望讓使用這些框架的客戶知道,,他們可以通過 WebSphere Application Server 以穩(wěn)健和可靠的方式做到這一點(diǎn),。本文介紹這些框架如何與 WebSphere Application Server 一起使用,,并介紹針對(duì)各種用例的最佳實(shí)踐,以幫助您盡快開始使用 Spring 或 Hibernate,。
使用 Spring
通常將 Spring 描述為輕量級(jí)容器環(huán)境,,但是將其描述為用于簡(jiǎn)化開發(fā)的框架可能更適當(dāng)。Spring Framework 由 Interface21 根據(jù) Rod Johnson 發(fā)表的關(guān)于依賴項(xiàng)注入設(shè)計(jì)模式的出版物開發(fā)而成,。Spring 可以在獨(dú)立應(yīng)用程序中使用,,或與應(yīng)用程序服務(wù)器一起使用。其主要概念是使用依賴項(xiàng)注入和面向方面的編程來簡(jiǎn)化和平穩(wěn)地進(jìn)行從開發(fā)到測(cè)試再到生產(chǎn)的轉(zhuǎn)換,。
涉及 Spring 的最常用場(chǎng)景之一是使用簡(jiǎn)單的 Java Bean 類配置并驅(qū)動(dòng)業(yè)務(wù)邏輯,。Spring 文檔應(yīng)該提供了使用 Spring Bean 構(gòu)建應(yīng)用程序的足夠信息,其中沒有提供任何特定于 WebSphere 的內(nèi)容,。以下部分將描述在 WebSphere Application Server 上使用 Spring 的一些使用場(chǎng)景,。根據(jù)本文的建議開發(fā)的 Spring 應(yīng)用程序應(yīng)該能夠毫無問題地在 WebSphere Application Server 或 WebSphere Application Server Network Deployment 環(huán)境中執(zhí)行。
除明確指出以外,,本文提供的信息適用于所有平臺(tái)上的 WebSphere Application Server 版本 6.0.2.x,、6.1.x 和 7.0.x。
表示層注意事項(xiàng)
本部分介紹與在基于 Web 的表示層中使用 Spring 相關(guān)的注意事項(xiàng),。
-
Web MVC 框架
Spring 的 Web MVC 框架很長(zhǎng)時(shí)間以來一直是其他框架的替代框架,。直接由 WebSphere Application Server 交付、使用和支持的 Web MVC 框架包括 JavaServer Faces (JSF) 和 Struts,。Spring 文檔描述了如何將 Spring 與這些 Web 框架集成,。盡管 WebSphere Application Server 支持使用上面的任何 MVC,但 IBM 僅為 WebSphere Application Server 附帶的框架提供產(chǎn)品支持,。
-
Portlet MVC 框架
Spring 還提供了一個(gè) Portlet MVC 框架(該框架鏡像 Spring Web MVC 框架),,而且在 WebSphere Portal V6.0 和 WebSphere Application Server V6.1 Portlet 容器中運(yùn)行。(有關(guān) Spring Portlet 的示例集,,請(qǐng)參見 Spring Portlet MVC,。)在 WebSphere Application Server V6.1 Portlet 容器中運(yùn)行 Portlet 需要?jiǎng)?chuàng)建附加的 Web 應(yīng)用程序,以定義 Portlet 的布局和聚合,。從 WebSphere Application Server 信息中心和文章 Portlet 容器介紹中可以獲得關(guān)于如何使用 Portlet 聚合器標(biāo)記庫(kù)的信息,。通常的做法是結(jié)合使用 JSF 和 Portlet 進(jìn)行呈現(xiàn)。關(guān)于如何將 Spring,、Hibernate,、JSF 和 WebSphere Portal 組合起來的信息,請(qǐng)參見使用 IBM WebSphere Portal 配置 Hibernate,、Spring,、Portlets 和 OpenInSessionViewFilter。
數(shù)據(jù)訪問注意事項(xiàng)
本部分介紹與訪問事務(wù)中的數(shù)據(jù)的 Spring Bean 配置相關(guān)的注意事項(xiàng),。
Spring Framework 實(shí)際上使用一個(gè)容器管理層(在 J2EE 環(huán)境中委托給基礎(chǔ) J2EE 運(yùn)行時(shí))包裝 Spring Bean,。下面將介紹應(yīng)如何配置 Spring Bean,,以便 Spring Framework 可以正確地向 WebSphere Application Server 運(yùn)行時(shí)做出委托并與之集成。
-
訪問 WebSphere Application Server 中配置的數(shù)據(jù)源
WebSphere Application Server 管理在應(yīng)用程序服務(wù)器執(zhí)行環(huán)境中使用的資源,。需要訪問諸如 JDBC 數(shù)據(jù)源等資源的 Spring 應(yīng)用程序應(yīng)該利用 WebSphere 管理的資源,。為此,請(qǐng)執(zhí)行以下步驟:
-
在開發(fā)過程中,,應(yīng)該使用資源引用配置 WAR 模塊,。例如:
<resource-ref>
<res-ref-name>jdbc/springdb</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
|
-
對(duì)于 EJB JAR 文件,應(yīng)該在需要訪問數(shù)據(jù)源的每個(gè) EJB 中聲明同一資源引用,。
-
然后在 Spring 應(yīng)用程序配置中聲明數(shù)據(jù)源代理 Bean,,代理 Bean 引用 WebSphere 管理的資源提供者:
<bean id="wasDataSource"
class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName"
value="java:comp/env/jdbc/springdb"/>
<property name="lookupOnStartup"
value="false"/>
<property name="cache"
value="true"/>
<property name="proxyInterface"
value="javax.sql.DataSource"/>
</bean>
|
通過此代理 Bean 訪問數(shù)據(jù)源將會(huì)導(dǎo)致使用模塊配置的引用查找數(shù)據(jù)源,從而能夠由 WebSphere Application Server 正確管理,。請(qǐng)注意,,jndiName 屬性值與使用資源引用中聲明的資源引用名稱連接的模式 java:comp/env/ 匹配。
或者,,在 Spring 2.5 以后的版本中,可以使用 <j2ee:jndi-lookup/> 方法完成此匹配,。請(qǐng)注意 jndiName 屬性如何匹配資源引用中聲明的資源引用名稱與 resource-ref="true" 屬性相結(jié)合的實(shí)際值:
<jee:jndi-lookup id=" wasDataSource "
jndi-name="jdbc/springdb"
cache="true"
resource-ref="true"
lookup-on-startup="false"
proxy-interface="javax.sql.DataSource"/>
|
-
然后,,Spring 應(yīng)用程序可以在適當(dāng)情況下使用數(shù)據(jù)源代理 Bean。
-
將應(yīng)用程序部署到 WebSphere Application Server 時(shí),,必須以常規(guī)方式配置資源提供者和資源數(shù)據(jù)源,,以便由 Spring 應(yīng)用程序資源引用使用。在部署過程中,,在模塊的部署描述符中聲明的資源引用將綁定到應(yīng)用程序服務(wù)器配置的數(shù)據(jù)源,。
-
使用 JDBC 本機(jī)連接
當(dāng)各種 JDBC 操作需要與本機(jī) JDBC 資源交互時(shí),Spring 可提供訪問本機(jī)連接的機(jī)制,。當(dāng)在 JdbcTemplate 類上設(shè)置了 NativeJdbcExtractor 類時(shí),,Spring JdbcTemplate 類才可以利用此功能。設(shè)置 NativeJdbcExtractor 類后,,當(dāng)與 WebSphere Application Server 一起使用時(shí),,Spring 總是向下找到本機(jī) JDBC 連接。這將忽略以下 WebSphere 服務(wù)質(zhì)量功能和優(yōu)點(diǎn):
- 連接處理跟蹤和再關(guān)聯(lián)
- 連接共享
- 參與事務(wù)
- 連接池管理
這帶來的另一個(gè)問題是 WebSphereNativeJdbcExtractor 類將依賴于內(nèi)部 WebSphere 適配器類,。這些內(nèi)部類可能因 WebSphere Application Server 的版本而異,,并且以后可能更改,從而破壞依賴于此功能的應(yīng)用程序,。
在 WebSphere Application Server 上不支持使用 NativeJdbcExtractor 類實(shí)現(xiàn)(例如 WebSphereNativeJdbcExtractor),,您應(yīng)避免需要使用該類的場(chǎng)景。替代方案是使用 WebSphere Application Server WSCallHelper 類來訪問非標(biāo)準(zhǔn)供應(yīng)商的數(shù)據(jù)源擴(kuò)展,。
-
使用 Spring 處理事務(wù)
WebSphere Application Server 為事務(wù)處理和管理與資源提供者的連接提供了一個(gè)穩(wěn)健和可伸縮的環(huán)境,。無論是否在使用全局事務(wù),,與 JDBC、JMS 和 Java Connector 資源適配器的連接均由 WebSphere Application Server 管理,;甚至在缺少全局事務(wù)時(shí),,始終存在一個(gè)運(yùn)行時(shí)上下文,在該上下文中可以訪問所有資源提供者連接,。WebSphere Application Server 將此運(yùn)行時(shí)上下文稱為本地事務(wù)容器 (LTC) 作用域,;在缺少全局事務(wù)時(shí)始終存在一個(gè) LTC,并且無論是存在全局事務(wù)還是 LTC,,資源訪問始終由運(yùn)行時(shí)管理,。為確保事務(wù)上下文管理的完整性,以便可以正確管理事務(wù)資源,,WebSphere Application Server 不向 WebSphere Application Server 中部署的應(yīng)用程序或應(yīng)用程序框架公開 javax.transaction.TransactionManager 接口,。
在 Spring 中,有許多方法可以驅(qū)動(dòng)事務(wù)控制下的資源更新,,這包括編程形式和聲明形式,。聲明形式包括 Java Annotation 和 XML 描述符形式。如果將 Spring 2.5 與 WebSphere Application Server V6.0.2.19 或 V6.1.0.9 或者更高版本一起使用,,則可以利用對(duì) Spring 的聲明式事務(wù)模型的完全支持,。Spring 2.5 有一個(gè)新的用于 WebSphere Application Server 的 PlatformTransactionManager 類,名為 WebSphereUowTransactionManager,。該類利用 WebSphere Application Server 的受支持 UOWManager 接口進(jìn)行事務(wù)上下文管理,。通過 WebSphere Application Server 的 UOWManager 類管理事務(wù)劃分可以確保在訪問資源提供者時(shí)始終可以使用適當(dāng)?shù)娜质聞?wù)或 LTC 上下文。不過,,早期版本的 Spring 使用了內(nèi)部 WebSphere 接口,,以犧牲 Web 和 EJB 容器功能為代價(jià)來管理資源,并且不支持由應(yīng)用程序使用,。這會(huì)使容器處于未知狀態(tài),,從而有可能導(dǎo)致數(shù)據(jù)損壞。
Spring 2.5 或更高版本中的聲明式事務(wù)劃分在 WebSphere Application Server 中受支持,,它使用下面的聲明提供對(duì) WebSphere 事務(wù)的支持:
<bean id="transactionManager"
class="org.springframework.transaction.jta.WebSphereUowTransactionManager"/>
|
引用此聲明的 Spring Bean 然后將使用標(biāo)準(zhǔn) Spring 依賴項(xiàng)注入來使用事務(wù)支持,,例如:
<bean id="someBean" class="some.class">
<property name="transactionManager" >
<ref bean="transactionManager"/>
</property>
...
</bean>
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
|
或者,在 Spring 2.5 以后的版本中,,可以利用 Spring 的 AspectJ 支持,。在下面的示例中,可以將 <tx:advice/> 應(yīng)用于應(yīng)用程序的各個(gè)部分,。這指示所有以“get”開頭的方法都是 PROPAGATION_REQUIRED,,并且所有以“set”開頭的方法都是 PROPAGATION_REQUIRES_NEW。所有其他方法使用缺省事務(wù)設(shè)置。
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="get*" propagation="REQUIRED" read-only="true" />
<tx:method name="set*" propagation="REQUIRES_NEW" />
<tx:method name="*" />
</tx:attributes>
</tx:advice>
|
<aop:config/> 標(biāo)記將那些設(shè)置應(yīng)用于類 MyService 中定義的任何已執(zhí)行操作,。
<aop:config>
<aop:pointcut id="myServiceOperation"
expression="execution(* sample.service.MyService.*(..))"/>
<aop:advisor advice-ref="txAdvice"
pointcut-ref="myServiceOperation"/>
</aop:config>
|
用于聲明事務(wù)設(shè)置的另一種替代機(jī)制是使用基于 Spring 注釋的事務(wù)支持,。這要求使用 Java 5+,因此無法與 WebSphere Application Server V6.0.2.x 一起使用,。
將以下內(nèi)容添加到 Spring.xml 配置:
<tx:annotation-driven/>
然后應(yīng)該使用 @Transactional 注釋對(duì)需要事務(wù)屬性的任何方法進(jìn)行標(biāo)記:
@Transactional(readOnly = true)
public String getUserName()
{ ...
|
請(qǐng)注意,,只能將 @Transactional 注釋用于注釋公共方法。
WebSphereUowTransactionManager 支持每個(gè) Spring 事務(wù)屬性:
- PROPAGATION_REQUIRED
- PROPAGATION_SUPPORTS
- PROPAGATION_MANDATORY
- PROPAGATION_REQUIRES_NEW
- PROPAGATION_NOT_SUPPORTED
- PROPAGATION_NEVER
對(duì)于沒有提供 org.springframework.transaction.jta.WebSphereUowTransactionManager 的早期 Spring 版本以及沒有提供 com.ibm.wsspi.uow.UOWManager 的 WebSphere Application Server V6.0.2.19 或 V6.1.0.9 之前的版本,,WebSphere Application Server 中的事務(wù)支持通過以下 Spring 配置實(shí)現(xiàn):
<bean id="transactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="autodetectTransactionManager"value="false" />
</bean>
|
此配置支持一組受限制的事務(wù)屬性,,其中不包括 PROPAGATION_NOT_SUPPORTED 和 PROPAGATION_REQUIRES_NEW。Spring 類 org.springframework.transaction.jta.WebSphereTransactionManagerFactoryBean 也宣稱提供 PROPAGATION_NOT_SUPPORTED 和 PROPAGATION_REQUIRES_NEW 功能,,它使用不受支持的內(nèi)部 WebSphere Application Server 接口,,不應(yīng)將其與 WebSphere Application Server 一起使用。
-
使用 Spring JMS
與訪問 JDBC 數(shù)據(jù)源類似,,打算訪問 JMS 目的地的 Spring 應(yīng)用程序必須確保它們使用了 WebSphere 管理的 JMS 資源提供者,。使用 Spring JndiObjectFactoryBean 作為 ConnectionFactory 代理的相同模式將確保可以正確地管理 JMS 資源,。
對(duì)于 JMS 消息發(fā)送或同步 JMS 消息接收,,可以使用 JMSTemplates。這包括通過 JNDI 和真正的動(dòng)態(tài)解析使用 Spring 的動(dòng)態(tài)目的地解析功能,。
下面的示例演示了 ConnectionFactory 的資源引用配置,。此引用在應(yīng)用程序部署過程中映射為指向應(yīng)用程序服務(wù)器的 JNDI 命名空間中存儲(chǔ)的已配置托管 ConnectionFactory。ConnectionFactory 是執(zhí)行消息處理所必需的,,并且應(yīng)該將其注入 Spring JMSTemplate。
<resource-ref>
<res-ref-name>jms/myCF</res-ref-name>
<res-type>javax.jms.ConnectionFactory</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
|
現(xiàn)在應(yīng)用程序中的 ConnectionFactory 有了已定義的 JNDI 名稱,,可以對(duì)其進(jìn)行查找并將其注入 JMSTemplate:
<jee:jndi-lookup id="jmsConnectionFactory" jndi-name=" jms/myCF "/>
<bean id="jmsQueueTemplate"
class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory">
<ref bean="jmsConnectionFactory"/>
</property>
<property name="destinationResolver">
<ref bean="jmsDestResolver"/>
</property>
...
</bean>
<!-- A dynamic resolver -->
<bean id="jmsDestResolver" class="
org.springframework.jms.support.destination.DynamicDestinationResolver"/>
<!-- A JNDI resolver -->
<bean id="jmsDestResolver"
class=" org.springframework.jms.support.destination.JndiDestinationResolver"/>
|
在運(yùn)行時(shí),,JMSTemplate 可以基于目的地的 JNDI 名稱(在應(yīng)用程序資源引用中配置)或通過“動(dòng)態(tài)解析”來基于 WebSphere Application Server 中配置的目的地的管理名稱定位目的地;例如,,對(duì)于綁定到 jms/myQueue 的 JNDI 引用的 JMS myQueue 隊(duì)列:
JNDI 解析:
jmsTemplate.send("java:comp/env/jms/myQueue", messageCreator);
動(dòng)態(tài)解析:
jmsTemplate.send("myQueue", messageCreator);
作為對(duì) J2EE 消息驅(qū)動(dòng) Bean (MDB) 的替代,,Spring 提供了用于異步地處理入站 JMS 消息的消息驅(qū)動(dòng) POJO 模型。僅有一個(gè) DefaultMessageListenerContainer 類將管理從 JMS 隊(duì)列到已配置的 POJO 的消息,,該 POJO 必須是 javax.jms.MessageListener 實(shí)現(xiàn),。
在 WebSphere Application Server 環(huán)境中,您還必須指定一個(gè) WorkManagerTaskExecutor 類,,這意味著 DefaultMessageListenerContainer 類將向服務(wù)器管理的線程池作出委托,。正如上面描述過的,還應(yīng)該通過 WebSphereUowTransactionManager 使用服務(wù)器的事務(wù)管理來配置 DefaultMessageListenerContainer,。
<bean id="messageListener" class="sample.ExampleMessageListener" />
<bean id="msgListenerContainer"
class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="jmsConnectionFactory" />
<property name="destination" ref="jmsQueue" />
<property name="messageListener" ref="messageListener" />
<property name="transactionManager" ref="transactionManager" />
<property name="taskExecutor" ref="myTaskExecutor" />
</bean>
<bean id="myTaskExecutor"
class="org.springframework.scheduling.commonj.WorkManagerTaskExecutor">
<property name="workManagerName" value="wm/default" />
</bean>
<bean id="transactionManager"
class="org.springframework.transaction.jta.WebSphereUowTransactionManager" />
<jee:jndi-lookup id="jmsConnectionFactory" jndi-name="jms/CF1" />
<jee:jndi-lookup id="jmsQueue" jndi-name="jms/jmsQueue" />
|
雖然可以使用此消息驅(qū)動(dòng) POJO 模型,,但是在需要工作負(fù)載管理和/或高可用性的 WebSphere Application Server 配置中,建議直接使用 J2EE 消息驅(qū)動(dòng) Bean (MDB)。請(qǐng)注意,,不支持任何其他 Spring JMS MessageListenerContainer 類型,,因?yàn)樗鼈兛梢詥?dòng)非托管線程,而且還可能使用不應(yīng)由 Java EE 環(huán)境中的應(yīng)用程序調(diào)用的 JMS API,。
-
將 JPA 與 Spring 一起使用
EJB 3.0 規(guī)范將 Java Persistence API (JPA) 定義為提供可移植持久 Java 實(shí)體的方法,。WebSphere Application Server V7 和 WebSphere Application Server V6.1 EJB 3 功能包都提供了 EJB 3 和 JPA 的實(shí)現(xiàn);還可以將 JPA 的 Apache OpenJPA 實(shí)現(xiàn)與 WebSphere Application Server V6.1 一起使用(請(qǐng)參見參考資料),。將 Spring 與 JPA 實(shí)現(xiàn)結(jié)合使用時(shí),,您應(yīng)該直接使用 JPA,而不是使用 Spring 的 JPA Helper 類(在 org.springframework.orm.jpa 包中),。
WebSphere Application Server V6.1 及更高版本支持 JPA 應(yīng)用程序托管的實(shí)體管理器,,該管理器可能是 JTA 或本地資源事務(wù)類型。JTA 實(shí)體管理器使用應(yīng)用程序服務(wù)器的基礎(chǔ) JTA 事務(wù)支持,,其事務(wù)劃分可以使用上面描述的標(biāo)準(zhǔn) J2EE 技術(shù)或 Spring 的聲明式事務(wù)模型進(jìn)行定義,。
使用 JPA 的數(shù)據(jù)訪問對(duì)象 (DAO) 與 persistence.xml 打包在一起,后者為應(yīng)用程序使用的 JPA EntityManager 定義持久性上下文,。例如,,可以按下面的方式設(shè)置用于 JTA 實(shí)體管理器(使用的數(shù)據(jù)源的 JNDI 名稱為“java:comp/env/jdbc/springdb”)的 persistence.xml:
<persistence
xmlns="http://java./xml/ns/persistence"
xmlns:xsi="http://www./2001/XMLSchema-instance"
xsi:schemaLocation="http://java./xml/ns/persistence
http://java./xml/ns/persistence/persistence_1_0.xsd" version="1.0">
<persistence-unit name="default" transaction-type="JTA">
<provider> org.apache.openjpa.persistence.PersistenceProviderImpl </provider>
<jta-data-source> java:comp/env/jdbc/springdb </jta-data-source>
<properties>
<property name="openjpa.TransactionMode" value="managed" />
<property name="openjpa.ConnectionFactoryMode"value="managed" />
<property name="openjpa.jdbc.DBDictionary" value="db2" />
</properties>
</persistence-unit>
</persistence>
|
通過將 openjpa.TransactionMode 和 openjpa.ConnectionFactoryMode 屬性設(shè)置為“managed”,JPA 實(shí)體管理器將事務(wù)和連接管理委托給 WebSphere Application Server,。DAO 可以使用上面描述的 Spring 聲明式事務(wù)劃分,。
還可以使用注釋風(fēng)格的 JPA EntityManager 注入。這與標(biāo)準(zhǔn) JPA 完全相同:
@PersistenceContext
private EntityManager em;
|
您需要以下 XML 代碼將在 Spring XML 配置中啟用 EntityManager 注入:
<!-- bean post-processor for JPA annotations -->
<bean class=
"org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>
|
Spring 將在此 XML 文件中定義的 EntityManagerFactory 的基礎(chǔ)上創(chuàng)建 EntityManager ,。如果存在多個(gè) EntityManagerFactory,,則 Spring 將失敗。使用以下方法中的一種(且僅一種)方法創(chuàng)建 EntityManagerFactory:
- 使用 Spring 的基本配置
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
<property name="persistenceUnitName" value="default"/>
</bean>
|
- 使用 Spring 的高級(jí)配置
<bean id="myEmf" class=
"org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="ds"/>
</bean>
<jee:jndi-lookup
id="ds"
jndi-name="jdbc/ds"
cache="true"
expected-type="javax.sql.DataSource"
/>
|
當(dāng)然,,通過使用 WebSphere Application Server V7 和 WebSphere Application Server V6.1 EJB 3 Feature Pack 中的純粹 EJB 3 支持也可以獲得注釋和 JPA 的優(yōu)點(diǎn),。在任一種情況下,您都可以使用 JPA API 創(chuàng)建 EntityManagerFactory,,如下所示,。建議不要將此方法用于非 EJB 3 環(huán)境,因?yàn)榭赡軣o法正確管理所創(chuàng)建的任何 EntityManager,。但是,,當(dāng)您擁有 EJB 3 環(huán)境時(shí),可以使用此方法分離 Spring 和 JPA 配置,。
<bean id="myEmf"
class="javax.persistence.Persistence"
factory-method="createEntityManagerFactory" >
<constructor-arg type="java.lang.String" value="default"/>
</bean>
|
-
IBM JDK 6
WebSphere Application Server V7 在 IBM JDK 6 上運(yùn)行,,由于已在此 JIRA 中作文檔說明的 Spring 問題,無法將 IBM JDK 6 與 V2.5.5 以前的 Spring 框架一起使用,。
集成和管理注意事項(xiàng)
-
JMX 和 MBean
僅當(dāng) Spring JMX MBean 向 WebSphere Application Server 的容器管理器 MbeanServer 注冊(cè)后,,WebSphere Application Server V6.1 和更高版本才支持它,。如果不指定任何服務(wù)器屬性,則 MBeanExporter 將嘗試自動(dòng)檢測(cè)運(yùn)行的 MbeanServer,。因此,,在 WebSphere Application Server 上運(yùn)行應(yīng)用程序時(shí),Spring 框架將找到容器的 MbeanServer,。
您不應(yīng)使用 MBeanServerFactory 實(shí)例化 MbeanServer,,然后將其注入 MbeanExporter。而且,,WebSphere Application Server 不支持使用 Spring 的 ConnectorServerFactoryMBean 或 JMXConnectorServer 通過打開入站 JMX 端口將本地 MBeanServer 公開給客戶端,。
WebSphere Application Server Version 6.1 以前的版本不支持 Spring JMX Mbean。
-
在 WebSphere Application Server 中注冊(cè) Spring MBean
當(dāng)按下面的方式注冊(cè)時(shí),,WebSphere Application Server MBean 將由 javax.management.ObjectName 標(biāo)識(shí):
WebSphere:cell=99T73GDNode01Cell,name=JmxTestBean,node=99T73GDNode01, process=server1,type=JmxTestBeanImpl
這意味著,,如果它們被取消注冊(cè),則需要使用相同的“完全限定”名稱(而不是 MBean 的簡(jiǎn)單名稱屬性)查找它們,。最好的方法是實(shí)現(xiàn) org.springframework.jmx.export.naming.ObjectNamingStrategy,,它是封裝 ObjectName 實(shí)例創(chuàng)建的接口,并且在注冊(cè) Bean 時(shí),,MBeanExporter 可以使用它獲得 ObjectName,。Spring Framework 論壇上提供了一個(gè)示例??梢詫?ObjectNamingStrategy 實(shí)例添加到您注冊(cè)的 Bean,。這可以確保在卸載應(yīng)用程序時(shí)正確地取消注冊(cè) MBean。
<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter"
lazy-init="false">
<property name="beans">
<map> <entry key="JmxTestBean" value-ref="testBean" /> </map>
</property>
<property name="namingStrategy" ref="websphereNamingStrategy" />
...
</bean>
|
-
MBean ObjectName 和通知
由于在 WebSphere Application Server 中使用的是 MBean 的完全限定 ObjectName,,因此建議您完整定義該 ObjectName 以使用通知,。此 JIRA 支持改為使用 Spring Bean 名稱,,,但是僅當(dāng)您在使用相應(yīng)版本的 Spring 的時(shí)候,,才應(yīng)該提供修復(fù)程序。
<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter"
lazy-init="false">
<property name="beans">
<map>
<entry key="JmxTestBean" value-ref="testBean" />
</map>
</property>
<property name="namingStrategy" ref="websphereNamingStrategy" />
<property name="notificationListenerMappings">
<map>
<entry key="WebSphere:cell=99T73GDNode01Cell, name=JmxTestBean,
node=99T73GDNode01, process=server1, type=JmxTestBeanImpl">
<bean class="client.MBeanListener" />
</entry>
</map>
</property>
</bean>
|
-
System z 多調(diào)用/單調(diào)用限制
由于 Spring 不允許在 MBean 描述符中指定特定于平臺(tái)的字段,,因此 Spring JMX 將在 WebSphere Application Server V6.1 中的多 SR 服務(wù)器上運(yùn)行,,但在部署選項(xiàng)中受限,。WebSphere Application Server 缺省使用單調(diào)用策略,,這樣僅要求一個(gè) MBean 實(shí)例(在一個(gè)不確定的 SR 中)就可以執(zhí)行某個(gè)請(qǐng)求。在某些場(chǎng)景中這已足夠,,但是應(yīng)用程序更可能需要能夠聲明多調(diào)用和單調(diào)用方法的組合,,并且可能產(chǎn)生聚合邏輯。
-
調(diào)度和線程池
Spring 提供了許多可用于調(diào)度工作的 TaskExecutor 類,。只有 WebSphere Application Server 支持用于異步執(zhí)行工作的 Spring TaskExecutor 才是 Spring WorkManagerTaskExecutor 類,,該類可正確地利用 WebSphere Application Server 托管的線程池,并向已配置的 WorkManager 作出委托。其他 TaskExecutor 實(shí)現(xiàn)可以啟動(dòng)非托管線程,。
在 WebSphere Application Server 管理控制臺(tái)中,,可以通過導(dǎo)航到 Resources => Asynchronous beans => Work managers 對(duì) WorkManager 進(jìn)行設(shè)置。然后可以在 Spring 配置文件中作為 workManagerName 屬性使用資源的 JNDI 名稱來定義 WorkManagerTaskExecutor,。下面的示例使用 WebSphere Application Server 的 DefaultWorkManager JNDI 名稱或 wm/default:
<bean id="myTaskExecutor"
class="org.springframework.scheduling.commonj.WorkManagerTaskExecutor">
<property name="workManagerName" value="wm/default" />
</bean>
|
-
類加載器
Spring 和 WebSphere Application Server 都使用多個(gè)開放源代碼項(xiàng)目,,遺憾的是,它們共有的項(xiàng)目版本并不總是匹配,。應(yīng)該將 Spring 依賴項(xiàng)包裝為應(yīng)用程序的一部分,,并且應(yīng)該按照下面的描述設(shè)置服務(wù)器以避免沖突。否則,,類加載器可能無法為運(yùn)行時(shí)或應(yīng)用程序加載適當(dāng)?shù)陌姹?。通常,這將導(dǎo)致異常,,在日志中顯示類,、ClassCastExceptions 或 java.lang.VerifyErrors 的版本不匹配。
其中一個(gè)示例是使用 Jakarta Commons Logging,。要配置供應(yīng)用程序使用的 Jakarta Commons Logging (JCL),,或者使用不是由應(yīng)用程序服務(wù)器提供的其他版本的 JCL(例如,使用應(yīng)用程序代碼嵌入的 JCL),,將需要在 WebSphere Application Server 上進(jìn)行專門的配置,。有關(guān)如何配置已部署的應(yīng)用程序,以使用嵌入版本的常用技術(shù)的策略,,請(qǐng)參見集成 Jakarta Commons Logging,。請(qǐng)密切關(guān)注支持網(wǎng)站,了解是否提供了有關(guān)如何在 WebSphere Application Server V6.x 產(chǎn)品上配置嵌入式 JCL 的更新,。這僅僅是沖突的一個(gè)示例,。其他示例可能包括應(yīng)用程序使用 JDOM 或特定版本的 JavaMail。不支持將 WebSphere Application Server 的 JAR 文件替換為這些或具有更高版本或不同版本的其他包,。
在 WebSphere Application Server 上困擾 Spring 用戶的另一個(gè)類加載器問題是 Spring 加載資源的方法,。資源可以包括消息綁定之類的內(nèi)容,通過類加載器層次結(jié)構(gòu)和在層次結(jié)構(gòu)中查找資源的各種策略,,可以在非預(yù)期的位置找到使用公共名稱的資源,。可以使用 WebSphere Application Server 類加載器查看器來幫助解決此問題,。資源與其他版本的公共庫(kù)的組合可能要求應(yīng)用程序?qū)①Y源重命名為唯一的名稱,。
James Estes 在 Spring 論壇上闡述的示例包含打包為 EAR 文件的 EJB 項(xiàng)目和 Web 項(xiàng)目。所描述的解決方案是將 spring.jar 文件同時(shí)添加到 WEB-INF/lib 和頂級(jí) EAR 中,,然后將 WEB 項(xiàng)目的類加載器策略設(shè)置為 PARENT LAST,,以便先找到 WEB-INF/lib 中的版本,。EJB 項(xiàng)目使用 EAR 中的版本。
設(shè)計(jì)注意事項(xiàng)
Spring Framework 提供的某些基礎(chǔ)結(jié)構(gòu)服務(wù)將復(fù)制由基于標(biāo)準(zhǔn)的應(yīng)用程序服務(wù)器運(yùn)行時(shí)提供的服務(wù),。而且,,從基礎(chǔ) J2EE 應(yīng)用程序服務(wù)器抽象出 Spring 框架基礎(chǔ)結(jié)構(gòu)必然要削弱與應(yīng)用程序服務(wù)器運(yùn)行時(shí)服務(wù)質(zhì)量的集成,如安全性,、工作負(fù)載管理和高可用性,。因此,在應(yīng)用程序設(shè)計(jì)過程中,,必須認(rèn)真考慮部署到 WebSphere Application Server 中的應(yīng)用程序中的 Spring Framework 使用,,以避免降低 WebSphere Application Server 提供的任何服務(wù)質(zhì)量。如果沒有任何其他建議,,首選的方法是直接使用 WebSphere Application Server 提供的服務(wù),,以便基于開放標(biāo)準(zhǔn)開發(fā)應(yīng)用程序,并確保未來部署的靈活性,。
-
非托管線程
某些 Spring 場(chǎng)景可能導(dǎo)致創(chuàng)建非托管的線程,。非托管線程對(duì) WebSphere Application Server 是未知的,并且不能訪問 Java EE 上下文信息,。此外,,它們可以在 WebSphere Application Server 不知道的情況下利用資源,在管理員無法控制其數(shù)量和資源使用的情況下存在,,在發(fā)生故障時(shí),,它們還阻止應(yīng)用程序服務(wù)器正常關(guān)閉或恢復(fù)資源。應(yīng)用程序應(yīng)該避免導(dǎo)致啟動(dòng)非托管線程的任何場(chǎng)景,,如:
-
registerShutdownHook
避免使用 Spring AbstractApplicationContext 或其子類之一,。registerShutdownHook 是一個(gè)公共方法,它可以創(chuàng)建線程并將其注冊(cè)到 Java 虛擬機(jī),,以便在關(guān)機(jī)時(shí)運(yùn)行以關(guān)閉 ApplicationContext,。應(yīng)用程序可以避免這一點(diǎn),方法是利用從 WebSphere 容器接收的常規(guī)生命周期通知來顯式調(diào)用 ApplicationContext 上的關(guān)閉,。
-
WeakReferenceMonitor
Spring 為簡(jiǎn)化開發(fā) EJB 組件提供了方便的類,,但是請(qǐng)注意,這些方便的類會(huì)生成由 WeakReferenceMonitor 用來執(zhí)行清除操作的非托管線程,。
-
調(diào)度
Spring 提供(或集成)了大量的調(diào)度包,,但是,只有與 WebSphere Application Server 托管的線程一起使用的 Spring 調(diào)度包才是 CommonJ WorkManager,。其他包(如 quartz 和 JDK Timer)會(huì)啟動(dòng)非托管線程,,應(yīng)該避免使用,。
使用 Hibernate
Hibernate 是用于 POJO 的開放源代碼持久性框架,,它通過 XML 配置文件提供 POJO 到關(guān)系數(shù)據(jù)庫(kù)表的對(duì)象-關(guān)系映射,。Hibernate 框架是應(yīng)用程序調(diào)用來實(shí)現(xiàn)數(shù)據(jù)持久性的數(shù)據(jù)訪問抽象層。此外,,Hibernate 還提供了從 Java 類到數(shù)據(jù)庫(kù)表(以及從 Java 數(shù)據(jù)類型到 SQL 數(shù)據(jù)類型)的映射,,以及數(shù)據(jù)查詢和檢索功能。Hibernate 生成必需的 SQL 調(diào)用,,還負(fù)責(zé)結(jié)果集處理和對(duì)象轉(zhuǎn)換,。
Hibernate(如 OpenJPA)實(shí)現(xiàn)了 Java Persistence API (JPA) 規(guī)范,此規(guī)范是 Java EE 5 的必備組成部分,。(有關(guān)如何使用 Hibernate 的 developerWorks 文章,,請(qǐng)參見參考資料。)
使用場(chǎng)景
以下場(chǎng)景描述了有關(guān)如何將 Hibernate 與 WebSphere Application Server 和 WebSphere 產(chǎn)品堆棧結(jié)合使用的一些可能場(chǎng)景,。這些僅是示例場(chǎng)景,,不應(yīng)認(rèn)為是推薦的場(chǎng)景。
-
使用 WebSphere Application Server 數(shù)據(jù)源
為了讓 Hibernate 從 WebSphere Application Server 獲取數(shù)據(jù)庫(kù)連接,,必須使用 Java EE(以前稱為 J2EE)規(guī)范中強(qiáng)制規(guī)定的資源引用,。這可以確保 WebSphere Application Server 能夠?yàn)檫B接池、事務(wù)語(yǔ)義和隔離級(jí)別提供正確的行為,。通過將 hibernate.connection.datasource 屬性(在 Hibernate 配置文件中進(jìn)行了定義)設(shè)置為引用在模塊的部署描述符中定義的資源引用(例如 java:comp/env/jdbc/myDSRef ),,將 Hibernate 配置為從 WebSphere Application Server 檢索數(shù)據(jù)源。例如:
<property name="hibernate.connection.datasource">
java:/comp/env/jdbc/myDSRef
</property>
|
Web 應(yīng)用程序的 Java EE 資源引用在 WAR 文件級(jí)別定義,,這意味著容器中的所有 Servlet 和 Java 類均共享資源引用,。在 EJB 模塊內(nèi)部,資源引用在各個(gè) EJB 組件上定義,。這意味著,,如果許多 EJB 組件都使用相同的 Hibernate 配置,則每個(gè) EJB 必須在每個(gè) EJB 組件上定義相同的引用名稱,。這會(huì)導(dǎo)致復(fù)雜化,,稍后我們將對(duì)此做進(jìn)一步討論。
配置了數(shù)據(jù)源之后,,確保 Hibernate 正常工作的下一個(gè)步驟是正確配置事務(wù)支持,。
-
事務(wù)策略配置
為了正確地運(yùn)行事務(wù),Hibernate 需要兩個(gè)重要部分的配置,。第一個(gè)部分是 hibernate.transaction.factory_class,,它定義事務(wù)控制,第二個(gè)部分是 hibernate.transaction.manager_lookup_class,,它定義注冊(cè)事務(wù)同步的機(jī)制,,這樣,當(dāng)持久性管理器需要與數(shù)據(jù)庫(kù)同步更改時(shí),,將會(huì)在事務(wù)端得到通知,。對(duì)于事務(wù)控制,,同時(shí)支持容器管理的配置和 Bean 管理的配置。將 Hibernate 和 WebSphere Application Server 結(jié)合使用時(shí),,必須在 Hibernate.cfg.xml 中設(shè)置以下屬性:
-
對(duì)于容器管理的事務(wù):
<property name="hibernate.transaction.factory_class">
org.hibernate.transaction.CMTTransactionFactory
</property>
<property name="hibernate.transaction.manager_lookup_class">
org.hibernate.transaction.WebSphereExtendedJTATransactionLookup
</property>
|
-
對(duì)于 Bean 管理的事務(wù):
<property name="hibernate.transaction.factory_class">
org.hibernate.transaction.JTATransactionFactory
</property>
<property name="hibernate.transaction.manager_lookup_class">
org.hibernate.transaction.WebSphereExtendedJTATransactionLookup
</property>
<property name="jta.UserTransaction">
java:comp/UserTransaction
</property >
|
jta.UserTransaction 屬性將工廠類配置為從 WebSphere 容器獲取 UserTransaction 對(duì)象實(shí)例的實(shí)例,。
WebSphere Application Server V6.x 和更高版本在 WebSphere 平臺(tái)上支持 hibernate.transaction.manager_lookup_class 屬性,WebSphere Business Integration Server Foundation V5.1 和更高版本也支持此屬性,。此屬性將 Hibernate 配置為使用在 WebSphere Business Integration Server Foundation V5.1 和 WebSphere Application Server V6.0 中引入的 ExtendedJTATransaction 接口,。WebSphere ExtendedJTATransaction 接口建立了一種在 Java EE 5 中通過 JTA 1.1 規(guī)范正式確立的模式。
-
不支持的事務(wù)配置
Hibernate 文檔描述了用于在 WebSphere Application Server 版本 4 和 5 產(chǎn)品上運(yùn)行的事務(wù)策略配置,,但是這些配置使用內(nèi)部 WebSphere 接口,,在早期版本上不受支持。上面僅描述了受支持的 Hibernate 事務(wù)配置,,如前面所述,,這意味著僅在 WebSphere Business Integration Server Foundation V5.1 和 WebSphere Application Server Version 6.x 以及更高版本上支持使用 Hibernate。
-
WebSphere Application Server 環(huán)境中的 Hibernate 使用模式
當(dāng)結(jié)合使用 Hibernate 和 WebSphere Application Server 時(shí),,Hibernate 的“按請(qǐng)求會(huì)話”和“長(zhǎng)時(shí)間對(duì)話”模式均可使用,。客戶必須選擇適用于其應(yīng)用程序的模式,,不過我們主張使用“按請(qǐng)求會(huì)話”模式,,因?yàn)樗梢蕴峁└玫目蓴U(kuò)展性。
-
多個(gè)隔離級(jí)別
可共享的連接通過讓多個(gè)資源用戶能夠共享現(xiàn)有的連接,,在 WebSphere Application Server 中提供了性能改進(jìn),。不過,如果可共享的連接和多個(gè)隔離級(jí)別都是必需的,,則為每個(gè)連接配置定義單獨(dú)的資源引用和 Hibernate 會(huì)話工廠,。不能夠更改共享連接的隔離級(jí)別。因此,,也不可能使用 hibernate.connection.isolation 屬性在可共享的連接上設(shè)置隔離級(jí)別,。有關(guān)連接共享的策略和約束的詳細(xì)信息,請(qǐng)參見在 WebSphere Application Server V5 中共享連接,。(盡管本文一般適合于在 WebSphere Application Server V5 上使用的所有共享連接,,但是連接共享建議仍適用于在 V6.x 上運(yùn)行的 Hibernate。)
-
Web 應(yīng)用程序
可以在 HttpSession 對(duì)象中使用和存儲(chǔ) Hibernate 的“長(zhǎng)時(shí)間對(duì)話”會(huì)話,;不過,,Hibernate 會(huì)話持有活動(dòng)實(shí)例,由于可能需要將會(huì)話序列化或?qū)⑵鋸?fù)制到其他集群成員,,因此將其存儲(chǔ)在 HttpSession 中不是可擴(kuò)展的模式,。最好使用 HttpSession 來存儲(chǔ)斷開連接的對(duì)象(只要它們非常小,即 10KB 到 50KB),并且在需要更新時(shí),,重新將它們與新的 Hibernate 會(huì)話關(guān)聯(lián)起來,。這是因?yàn)?HttpSession 最適用于書簽,而不適用于緩存,。在使用智能序列化改進(jìn) HttpSession 性能中討論了如何使 HttpSession 的內(nèi)存使用率降至最低。與將 HttpSession 用作緩存不同,,應(yīng)該考慮使用 ObjectGrid 或 DistributedObjectCache 之類的 WebSphere 數(shù)據(jù)緩存技術(shù),,這在下一部分進(jìn)行介紹。
有關(guān)高性能,、可擴(kuò)展應(yīng)用程序的最佳實(shí)踐,,強(qiáng)烈建議您閱讀 Performance Analysis for Java Websites 一書。
|
在本文發(fā)表之際,,Hibernate 的識(shí)別集群的緩存與 WebSphere Application Server 相結(jié)合的行為還沒有確定,,因此,還不能確定是否支持使用該緩存,,我們對(duì)此不做進(jìn)一步的討論,。因此,需要分布式緩存的客戶應(yīng)當(dāng)考慮創(chuàng)建使用屬性 hibernate.cache.provider_class 實(shí)現(xiàn) org.hibernate.cache.CacheProvider 的類,該屬性將采用 WebSphere 中的兩個(gè)分布式緩存實(shí)現(xiàn)中的一個(gè),。 |
|
-
集成二級(jí)緩存
Hibernate 會(huì)話表示工作單元的范圍,。在 Hibernate 會(huì)話的生命周期中,Session 接口管理持久性,。通常,,它通過保留對(duì)單個(gè)線程有效的一級(jí)緩存實(shí)例,維護(hù)它負(fù)責(zé)的映射實(shí)體類實(shí)例的可識(shí)別性或狀態(tài),,從而做到這一點(diǎn),。該緩存在工作單元(會(huì)話)完成時(shí)消失。還可以將二級(jí)緩存配置為在 SessionFactory 的所有會(huì)話之間共享(包括在集群之間共享),。請(qǐng)注意,,在 Hibernate 中進(jìn)行緩存會(huì)導(dǎo)致一些需要解決的問題。第一,,對(duì)于數(shù)據(jù)庫(kù)的外部更改或跨集群更改,,無法確保緩存的一致性(除非使用識(shí)別集群的緩存)。第二,,其他層(如數(shù)據(jù)庫(kù))可能已經(jīng)緩存,,從而使 Hibernate 緩存的價(jià)值降至最低。在進(jìn)行應(yīng)用程序設(shè)計(jì)時(shí),,必須認(rèn)真考慮這些問題,,但是這些問題超出了本文的討論范圍。
Hibernate 附帶了幾個(gè)預(yù)配置的緩存,。在 Hibernate 緩存文檔頁(yè)中可以找到關(guān)于這些緩存的信息,。對(duì)于只讀數(shù)據(jù),,一個(gè)內(nèi)存緩存可能就足夠了。不過,,當(dāng)對(duì)應(yīng)用程序進(jìn)行集群并需要識(shí)別集群的緩存時(shí),,本地只讀緩存是不夠的。如果需要分布式緩存,,我們建議使用 WebSphere 提供的分布式緩存實(shí)現(xiàn)之一,。可以將它們用作 Hibernate 的二級(jí)緩存:
-
在 WebSphere Enterprise Service Bus 和 WebSphere Process Server 中使用 Hibernate
WebSphere Process Server 和 WebSphere Enterprise Service Bus (ESB) 將 Service Component Architecture (SCA) 和 Service Data Objects (SDO) 用作 SOA 的組裝和編程模型,。(請(qǐng)參見參考資料,,了解關(guān)于 SCA 和 SDO 的更多信息。)SCA 組件不是 Java EE 組件,,因此它們沒有資源引用,,而是依靠服務(wù)和適配器來連接系統(tǒng)。在構(gòu)建 Java SCA 組件時(shí),,不能使用資源引用,;因此,SCA 組件不能直接使用 Hibernate,。
在這種情況下,,應(yīng)將 Hibernate 持久性隱藏在某種 Facade 后面。有兩個(gè)替代方案:
-
創(chuàng)建本地 EJB 會(huì)話 Facade 以包裝 Hibernate 持久性,。會(huì)話 Facade 提供適配器邏輯,,以便將 Hibernate 實(shí)體 POJO 映射到服務(wù)數(shù)據(jù)對(duì)象,以及進(jìn)行反向映射,。然后集成開發(fā)人員可以使用 EJB 導(dǎo)入來調(diào)用會(huì)話 Facade,,并以緊密耦合方式使用對(duì)應(yīng)的服務(wù)質(zhì)量 (QoS) 調(diào)用它。
-
創(chuàng)建 EJB Web 服務(wù)會(huì)話 Facade 以包裝 Hibernate 持久性,。然后集成開發(fā)人員可以使用 Web 服務(wù)導(dǎo)入調(diào)用實(shí)現(xiàn)持久性的 Web 服務(wù),。這不需要構(gòu)建 POJO 到 SDO 的轉(zhuǎn)換程序,因?yàn)槟壳?SCA 對(duì)數(shù)據(jù)類型只使用 SDO,。圖 1 說明了使用兩種模式的業(yè)務(wù)流程,,但該流程的詳細(xì)信息不在本文的討論范圍之內(nèi)。
圖 1. 示例業(yè)務(wù)流程
-
WebSphere Application Server V6.1 上的 Hibernate JPA API
Hibernate 的 JPA 支持提供 JPA 標(biāo)準(zhǔn)持久性,并且是專有 Hibernate API 的較好替代方案,。Hibernate 的 JPA 實(shí)現(xiàn)需要基于 Java SE 5 的運(yùn)行時(shí),,因此僅在 WebSphere Application Server V6.1 或更高版本上運(yùn)行。在本文發(fā)表之際,,Hibernate 的 JPA 支持不能在 WebSphere System z 和 iSeries 平臺(tái)上運(yùn)行,。Hibernate 文檔描述了如何使用 Hibernate 的 JPA 實(shí)現(xiàn)包裝和部署應(yīng)用程序。
-
不可交互操作/不可移植的功能
JPA 規(guī)范中的 3.2.4.2 部分描述了可能導(dǎo)致互操作性和潛在的可移植性問題的情況,。這與結(jié)合使用延遲加載(即 @Basic(fetch=LAZY) )和分離對(duì)象有關(guān),。將分離對(duì)象合并回會(huì)話時(shí),JPA 將檢查該對(duì)象,,并使用任何更改值來更新數(shù)據(jù)存儲(chǔ)區(qū),。不過,,數(shù)據(jù)對(duì)象是簡(jiǎn)單的 POJO,。在分離時(shí),如果部分 POJO 狀態(tài)沒有加載,,則在合并回去時(shí)可能顯示為已更改,。要使它正常工作,供應(yīng)商必須實(shí)現(xiàn)特定于其運(yùn)行時(shí)的序列化技術(shù),。這不是可互操作的,,語(yǔ)義也可能不是可移植的。
Spring Framework 正在迅速普及,。開發(fā)人員喜歡使用易用的接口和基于 XML 的配置加速 J2EE 開發(fā)和輕松地進(jìn)行單元測(cè)試,。框架本身也正在迅速發(fā)展,,現(xiàn)在,,網(wǎng)站上列出了許多子項(xiàng)目。與使用所有軟件一樣,,確定在應(yīng)用程序中使用它可以提供什么好處,,以及是否具有實(shí)現(xiàn)相同結(jié)果的更好替代方法是非常重要的。當(dāng)然,,Spring 中的一些功能復(fù)制了已嵌入 WebSphere Application Server 的功能,,所以將署到該服務(wù)器中的應(yīng)用程序使用此額外的框架代碼層是不可取的。但是,,如果使用得當(dāng),,您可以將 Spring 的許多易用的開發(fā)功能與 WebSphere Application Server 可靠的集成企業(yè)支持功能結(jié)合使用,以快速開發(fā)企業(yè)應(yīng)用程序,,并將其部署到 IBM 中行業(yè)領(lǐng)先的 J2EE 應(yīng)用程序服務(wù)器,。
Hibernate 是可以與 WebSphere Application Server 一起成功使用的多個(gè)持久性框架之一,可以提供到關(guān)系數(shù)據(jù)庫(kù)中存儲(chǔ)的實(shí)體數(shù)據(jù)的對(duì)象-關(guān)系映射(前提是足夠小心地避免有問題的場(chǎng)景)。特別是,,您必須確保使用 Hibernate 不涉及使用內(nèi)部 WebSphere Application Server 接口,。按照這里提供的建議,您可以避免一些常見問題,,并將 Hibernate 用作部署到 WebSphere Application Server 的應(yīng)用程序的持久性框架,。
|