在jdbc中,XAConnection和Connection是沒有繼承關系的,在jms中XAConnection是繼 承Connection接口的。同樣XADataSource和Datasource也是相應的關系。
我們在使用jdbc時,如果是managed datasource,配置在配置文件中,如在oc4j data-sources.xml中,有下面這段配置:
<managed-data-source name="MIFSystemLogXADataSource"
connection-pool-name="MIFSysLogXAConnectionFactory"
jndi-name="jdbc/mifXAStatusLog" tx-level='global'/> <!-- tx-level='global' -->
<connection-pool
name="MIFSysLogXAConnectionFactory">
<connection-factory
factory-class="oracle.jdbc.xa.client.OracleXADataSource" user="gavin"
password="gavin" url="jdbc:oracle:thin:@luga:1521:lugadb">
</connection-factory>
</connection-pool>
但是在java代碼我們使用時,是這樣的:
DataSource dataSource = (DataSource) context
.lookup(jdbc/mifXAStatusLog);
Connection connection = dataSource.getConnection();
lookup出來的DataSource的實現類是:oracle.sql.oc4j.ManagedDataSource,它是實 現DataSource接口的,和XADataSource無關,然後get出來的是Connection和 XAConnection無關,但是拿它做操作確是和XAConnection的效果相同,說明拿出來的可能 是一個dynamic proxy,它是實現Connection接口,完成XAConnection的功能。為什麼要 這樣做呢,就是方便我們通過配置文件更改,修改了配置文件,從xa到非xa,從非xa到xa ,代碼不需要重修修改。所以只能都拿出Connection來了。但是如果XAConnection繼承 Connection接口,這樣拿出來的即使是Connection,通過多態我們不更好理解嗎? 為什 麼當初寫規范時,不讓 XADataSource繼承DataSource,讓XAConnection繼承Connection 呢?