?
Dokumen ini menggunakan Manual laman web PHP Cina Lepaskan
使用JCA CCI的基礎(chǔ)資源是 ConnectionFactory
接口。
所用的連接器必須提供這個(gè)接口的一個(gè)實(shí)現(xiàn)。
為了使用連接器,可以把它部署到你的應(yīng)用服務(wù)器上,并從服務(wù)器的JNDI環(huán)境(托管模式)取回 ConnectionFactory
。
連接器必須打包為一個(gè)RAR文件(resource adapte archive)并包含一個(gè)部署描述符文件 ra.xml
。
部署時(shí)需要指定資源的實(shí)際名字。如果想通過Spring訪問它,只要簡單地使用Spring的 JndiObjectFactoryBean
來通過JNDI名字獲取工廠。
使用連接器的另一種方法是把它嵌入到應(yīng)用程序中(非托管模式(non-managed mode)),而不用在應(yīng)用服務(wù)器中部署并配置它。
Spring提供了通過已提供的 FactoryBean
(LocalConnectionFactoryBean
))來將連接器配置成一個(gè)bean的可能。
在這種方式中,只需要把連接器類庫放到classpath目錄下(不需要RAR文件和 ra.xml
描述符)。
如果有必要的話,必須從連接器的RAR文件解壓得到那個(gè)類庫。
一旦訪問 ConnectionFactory
實(shí)例,
就可以將它注入到組件。這些組件既可以用簡單的CCI API編碼,也可以利用Spring支持CCI訪問的類(比如,CciTemplate
)。
當(dāng)在非托管模式(non-managed mode)下使用連接器時(shí),將無法使用全局事務(wù), 因?yàn)樵撡Y源從不會(huì)被加入或刪除到當(dāng)前線程的當(dāng)前全局事務(wù)中。該資源根本不知道任何可能正在運(yùn)行的全局的J2EE事務(wù)。
為了創(chuàng)建到 EIS 的連接,如果處于托管模式(managed mode),你需要從應(yīng)用服務(wù)器獲取一個(gè) ConnectionFactory
,
或者當(dāng)你在非托管模式(non-managed mode)時(shí)直接從Spring去獲取。
在托管模式(managed mode)下,你可以從JNDI訪問 ConnectionFactory
,
它的屬性將被配置在應(yīng)用服務(wù)器中。
<bean id="eciConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName" value="eis/cicseci"/> </bean>
在非托管模式(non-managed mode)下,你必須在Spring配置中將你要用的 ConnectionFactory
配置為一個(gè)JavaBean。
LocalConnectionFactoryBean
類提供這種配置風(fēng)格,把 ManagedConnectionFactory
傳入到你的連接器的實(shí)現(xiàn)中,
暴露應(yīng)用級(jí)的CCI ConnectionFactory
。
<bean id="eciManagedConnectionFactory" class="com.ibm.connector2.cics.ECIManagedConnectionFactory"> <property name="serverName" value="TXSERIES"/> <property name="connectionURL" value="tcp://localhost/"/> <property name="portNumber" value="2006"/> </bean> <bean id="eciConnectionFactory" class="org.springframework.jca.support.LocalConnectionFactoryBean"> <property name="managedConnectionFactory" ref="eciManagedConnectionFactory"/> </bean>
你不能直接實(shí)例化一個(gè)指定的 ConnectionFactory
接口。
你需要為連接器實(shí)現(xiàn)相應(yīng)的 ManagedConnectionFactory
接口,這個(gè)接口是JCA SPI規(guī)范的一部分。
JCA CCI允許開發(fā)者使用自己的連接器的 ConnectionSpec
接口實(shí)現(xiàn)來配置到 EIS 的連接。
為了配置該連接的屬性,需要用一個(gè)指定的 ConnectionSpecConnectionFactoryAdapter
適配器來封裝目標(biāo)連接工廠。
因此,特定的 ConnectionSpec
接口可以用 connectionSpec
屬性來配置(作為一個(gè)內(nèi)部bean)。
這個(gè)屬性不是必需的,因?yàn)镃CI ConnectionFactory
接口定義了兩個(gè)不同的方法來獲取 CCI 連接。
ConnectionSpec
的一些屬性常??梢员慌渲迷趹?yīng)用服務(wù)器中(托管模式(managed mode))
或相關(guān)的本地 ManagedConnectionFactory
實(shí)現(xiàn)。
public interface ConnectionFactory implements Serializable, Referenceable { ... Connection getConnection() throws ResourceException; Connection getConnection(ConnectionSpec connectionSpec) throws ResourceException; ... }
Spring提供了 ConnectionSpecConnectionFactoryAdapter
適配器,
允許你指定一個(gè) ConnectionSpec
接口的實(shí)例, 供給定工廠的所有操作使用。
如果指定了適配器的 connectionSpec
屬性,適配器就使用沒有參數(shù)的 getConnection
變量,
而不是有 ConnectionSpec
參數(shù)的變量。
<bean id="managedConnectionFactory" class="com.sun.connector.cciblackbox.CciLocalTxManagedConnectionFactory"> <property name="connectionURL" value="jdbc:hsqldb:hsql://localhost:9001"/> <property name="driverName" value="org.hsqldb.jdbcDriver"/> </bean> <bean id="targetConnectionFactory" class="org.springframework.jca.support.LocalConnectionFactoryBean"> <property name="managedConnectionFactory" ref="managedConnectionFactory"/> </bean> <bean id="connectionFactory" class="org.springframework.jca.cci.connection.ConnectionSpecConnectionFactoryAdapter"> <property name="targetConnectionFactory" ref="targetConnectionFactory"/> <property name="connectionSpec"> <bean class="com.sun.connector.cciblackbox.CciConnectionSpec"> <property name="user" value="sa"/> <property name="password" value=""/> </bean> </property> </bean>
如果想使用一個(gè) CCI 單連接,Spring提供一個(gè)額外的 ConnectionFactory
適配器來管理它。
SingleConnectionFactory
適配器類將延遲打開一個(gè)單獨(dú)的連接并在應(yīng)用程序銷毀這個(gè)bean的時(shí)候關(guān)閉它。
這個(gè)類將暴露出特殊 Connection
的相應(yīng)代理,并共享同一個(gè)底層的物理連接。
<bean id="eciManagedConnectionFactory" class="com.ibm.connector2.cics.ECIManagedConnectionFactory"> <property name="serverName" value="TEST"/> <property name="connectionURL" value="tcp://localhost/"/> <property name="portNumber" value="2006"/> </bean> <bean id="targetEciConnectionFactory" class="org.springframework.jca.support.LocalConnectionFactoryBean"> <property name="managedConnectionFactory" ref="eciManagedConnectionFactory"/> </bean> <bean id="eciConnectionFactory" class="org.springframework.jca.cci.connection.SingleConnectionFactory"> <property name="targetConnectionFactory" ref="targetEciConnectionFactory"/> </bean>
這個(gè) ConnectionFactory
適配器不能直接用 ConnectionSpec
配置。
如果需要特定 ConnectionSpec
的單一連接,那么可以用 SingleConnectionFactory
與之通信的中間 ConnectionSpecConnectionFactoryAdapter
適配器。