转贴地址:http://hi.baidu.com/balance9/blog/item/8c30f33662ef44390a55a992.html
项目进展过程中,我们的框架中事务处理从最开始的仓促搭建,到后期一直在不断的改善。
经历的过程如下:
1. 使用DBCP的数据源配置
2. 使用JTOM配置JTA事务控制
3. 使用ATOMIKOS配置JTA事务控制
注意:
a 使用ORACLE的XA驱动
b 对用户按照如下授权。
grant select on sys.dba_pending_transactions to <user name>;
grant select on sys.pending_trans$ to <user name>;
grant select on sys.dba_2pc_pending to <user name>;
grant execute on sys.dbms_system to <user name>;
4. 使用容器的数据源配置和spring的weblogic的事务控制类。
网上的例子很多,可是我不得不在这里发句牢骚,国内的网站上的文章,有七八成是转载,转载不可怕,就怕转载不转全,要不然就是不管好不好用就转载,结果坑坏了后来的这帮到处找解决方案的虾米们,可咋整呢?
这里先描述一下环境:
spring 2.0.8
struts 2.0.11
weblogic 10
oracle 10g rac
关键条件:
1. 在weblogic的当前域下配置数据源,配置的时候要选择oracle thin XA的驱动,否则会报异常。
2. 在spring中配置的时候需要注意jndi的写法。会在下面示例中写明。
<!-- weblogic datasource -->
<bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
<property name="environment">
<props>
<prop key="java.naming.factory.initial">
weblogic.jndi.WLInitialContextFactory
</prop>
<prop key="java.naming.provider.url">t3://127.0.0.1:7777</prop>
<prop key="java.naming.security.principal">weblogic</prop>
<prop key="java.naming.security.credentials">weblogic</prop>
</props>
</property>
</bean>
<bean id="platformDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName"><value>test_rac</value></property>
<property name="jndiTemplate"><ref local="jndiTemplate"/></property>
</bean>
<bean id="businessDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName"><value>scott_rac</value></property>
<property name="jndiTemplate"><ref local="jndiTemplate"/></property>
</bean>
<!-- DAO template -->
<bean id="defaultLobHandler" class="org.springframework.jdbc.support.lob.DefaultLobHandler" lazy-init="true"></bean>
<bean id="platformDAOProxy" lazy-init="true" class="com.neusoft.ess.dao.ESSDAO" abstract="true">
<property name="dataSource">
<ref bean="platformDataSource" />
</property>
<property name="lobHandler">
<ref bean="defaultLobHandler" />
</property>
</bean>
<!-- Weblogic jta Transaction Manage -->
<bean id="txManager" class="org.springframework.transaction.jta.WebLogicJtaTransactionManager">
<property name="jndiTemplate" ref="jndiTemplate"></property>
<property name="userTransactionName">
<value>weblogic/transaction/UserTransaction</value>
</property>
</bean>
<bean id="baseTxProxy" abstract="true"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="txManager" />
</property>
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED,-Exception</prop>
</props>
</property>
</bean>
在这个过程中,看到网上有文章说可以搭建远程的数据源,可以建立一个公共的数据源,开发人员连接公共的数据源,这样连接数和数据源等参数可以通过统一设置了。可是按照那种方式没有成功。不知是否有哪里操作错误了。