?
本文檔使用 PHP中文網(wǎng)手冊 發(fā)布
使用JCA CCI的基礎資源是 ConnectionFactory
接口。
所用的連接器必須提供這個接口的一個實現(xiàn)。
為了使用連接器,可以把它部署到你的應用服務器上,并從服務器的JNDI環(huán)境(托管模式)取回 ConnectionFactory
。
連接器必須打包為一個RAR文件(resource adapte archive)并包含一個部署描述符文件 ra.xml
。
部署時需要指定資源的實際名字。如果想通過Spring訪問它,只要簡單地使用Spring的 JndiObjectFactoryBean
來通過JNDI名字獲取工廠。
使用連接器的另一種方法是把它嵌入到應用程序中(非托管模式(non-managed mode)),而不用在應用服務器中部署并配置它。
Spring提供了通過已提供的 FactoryBean
(LocalConnectionFactoryBean
))來將連接器配置成一個bean的可能。
在這種方式中,只需要把連接器類庫放到classpath目錄下(不需要RAR文件和 ra.xml
描述符)。
如果有必要的話,必須從連接器的RAR文件解壓得到那個類庫。
一旦訪問 ConnectionFactory
實例,
就可以將它注入到組件。這些組件既可以用簡單的CCI API編碼,也可以利用Spring支持CCI訪問的類(比如,CciTemplate
)。
當在非托管模式(non-managed mode)下使用連接器時,將無法使用全局事務, 因為該資源從不會被加入或刪除到當前線程的當前全局事務中。該資源根本不知道任何可能正在運行的全局的J2EE事務。
為了創(chuàng)建到 EIS 的連接,如果處于托管模式(managed mode),你需要從應用服務器獲取一個 ConnectionFactory
,
或者當你在非托管模式(non-managed mode)時直接從Spring去獲取。
在托管模式(managed mode)下,你可以從JNDI訪問 ConnectionFactory
,
它的屬性將被配置在應用服務器中。
<bean id="eciConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName" value="eis/cicseci"/> </bean>
在非托管模式(non-managed mode)下,你必須在Spring配置中將你要用的 ConnectionFactory
配置為一個JavaBean。
LocalConnectionFactoryBean
類提供這種配置風格,把 ManagedConnectionFactory
傳入到你的連接器的實現(xiàn)中,
暴露應用級的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>
你不能直接實例化一個指定的 ConnectionFactory
接口。
你需要為連接器實現(xiàn)相應的 ManagedConnectionFactory
接口,這個接口是JCA SPI規(guī)范的一部分。
JCA CCI允許開發(fā)者使用自己的連接器的 ConnectionSpec
接口實現(xiàn)來配置到 EIS 的連接。
為了配置該連接的屬性,需要用一個指定的 ConnectionSpecConnectionFactoryAdapter
適配器來封裝目標連接工廠。
因此,特定的 ConnectionSpec
接口可以用 connectionSpec
屬性來配置(作為一個內部bean)。
這個屬性不是必需的,因為CCI ConnectionFactory
接口定義了兩個不同的方法來獲取 CCI 連接。
ConnectionSpec
的一些屬性常??梢员慌渲迷趹梅掌髦校ㄍ泄苣J剑╩anaged mode))
或相關的本地 ManagedConnectionFactory
實現(xiàn)。
public interface ConnectionFactory implements Serializable, Referenceable { ... Connection getConnection() throws ResourceException; Connection getConnection(ConnectionSpec connectionSpec) throws ResourceException; ... }
Spring提供了 ConnectionSpecConnectionFactoryAdapter
適配器,
允許你指定一個 ConnectionSpec
接口的實例, 供給定工廠的所有操作使用。
如果指定了適配器的 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>
如果想使用一個 CCI 單連接,Spring提供一個額外的 ConnectionFactory
適配器來管理它。
SingleConnectionFactory
適配器類將延遲打開一個單獨的連接并在應用程序銷毀這個bean的時候關閉它。
這個類將暴露出特殊 Connection
的相應代理,并共享同一個底層的物理連接。
<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>
這個 ConnectionFactory
適配器不能直接用 ConnectionSpec
配置。
如果需要特定 ConnectionSpec
的單一連接,那么可以用 SingleConnectionFactory
與之通信的中間 ConnectionSpecConnectionFactoryAdapter
適配器。