JTA、非JTA与线程混合使用的问题

昨天晚上被JTA和线程的问题搞了,mark一下,以后继续补充。

 

问题描述

接收一个Http请求后,执行一段逻辑,步骤为 : 

1.查询数据库ds1。

2.插数据库ds1、ds2。特点:要求事物,所有使用JTA

3.启动新线程调用WS

 

部署环境

服务器:Websphere 6.1

JDK: IBM 1.5

操作系统:Red Hat Enterprise Linux

 

数据源的配置

1.jdbc/x1 启用JTA,连接oracle10g,选定“将此数据源用于容器管理的持久性(CMP)”

2.jdbc/x2 启用JTA,连接MSSQL2005,选定“将此数据源用于容器管理的持久性(CMP)”,并且使用JTDS驱动

3.jdbc/nx1 与x1连接相同的库,只是不启用JTA

 

Dao的配置

x1Dao 对应数据源jdbc/x1

x2Dao 对应数据源jdbc/x2

nx1Dao  对应数据源jdbc/nx1

 

程序

程序中的JTA事物使用Spring管理

1.spring配置

<!--  数据库连接 -->
<jee:jndi-lookup id="x1" jndi-name="jdbc/x1" />
<jee:jndi-lookup id="x2" jndi-name="jdbc/x2" />
<jee:jndi-lookup id="nx1" jndi-name="jdbc/nx1" />

<!-- 数据库事务 -->
<tx:jta-transaction-manager />

2.运行正常的代码

    SdhxBO.java 作为Bean在spring容器中

@Transactional(rollbackFor = { Exception.class })	
@SuppressWarnings({ "unchecked"})
public void hx(ViewDataset datasetLeasCharge, ViewDataset datasetVirCharge,
			ViewDataset datasetPayments) throws Exception {
        
	//1.调用nx1查询
	x1Dao.do..
		
	//2.调用x1,x2操作两个数据库   
	x1Dao.do...
	x2Dao.do...
	   
	//3.启动Thread
        FetchWorkflowThread f = new FetchWorkflowThread(wfParamsList,headerMap);
	f.start();
}

    GzdDetailViewModel.java 不是bean,调用SchxBO的方法

public void hx(ParameterSet parameters, ParameterSet outParameters)		
throws Exception {
	ViewDataset datasetLeasCharge = this.getDataset("datasetLeasCharge");
	ViewDataset datasetVirCharge = this.getDataset("datasetVirCharge");
	ViewDataset datasetPayments = this.getDataset("datasetPayments");

	SdhxBO bo = SpringService.getSdhxBO();
	
	bo.hx(datasetLeasCharge, datasetVirCharge, datasetPayments);
}

 3.WS超时异常时候的代码   

2011-01-19 20:42:41,355 [WebContainer : 977] WARN  g.apache.cxf.phase.PhaseInterceptorChain -Interceptor for {urn:DefaultNamespace}IFELCWriteOffService#{urn:DefaultNamespace}CHECKRENT has thrown exception, unwinding now
org.apache.cxf.interceptor.Fault: Could not send Message.
	at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:64)
Caused by: java.net.SocketTimeoutException: SocketTimeoutException invoking http://dev1.corp.sinochem.com:80/k3oa/assistancework/daypaynetwork.nsf/IFELC_WriteOff?OpenWebService: Read timed out
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
Caused by: java.net.SocketTimeoutException: Read timed out
	at java.net.SocketInputStream.socketRead0(Native Method)

    SdhxBO.java

@Transactional(rollbackFor = { Exception.class })
@SuppressWarnings({ "unchecked"})
public List hx(ViewDataset datasetLeasCharge, ViewDataset datasetVirCharge,
			ViewDataset datasetPayments) throws Exception {
        
	//1.调用nx1查询
	nx1Dao.do..
		
	//2.调用x1,x2操作两个数据库   
	x1Dao.do...
	x2Dao.do...
	
	return list
}

    GzdDetailViewModel.java

public void hx(ParameterSet parameters, ParameterSet outParameters) 
    throws Exception {  
	...
    SdhxBO bo = SpringService.getSdhxBO();  
    List list = bo.hx(datasetLeasCharge, datasetVirCharge, datasetPayments);  
	//3.启动Thread
    FetchWorkflowThread f = new FetchWorkflowThread(list,headerMap);
    f.start();
}  

4.JTA异常1

org.springframework.transaction.TransactionSystemException: UOWManager transaction processing failed; nested exception is com.ibm.wsspi.uow.UOWException: javax.transaction.RollbackException: Global transaction timed out after 0 seconds
	at org.springframework.transaction.jta.WebSphereUowTransactionManager.execute(WebSphereUowTransactionManager.java:288)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:127)
Caused by: com.ibm.wsspi.uow.UOWException: javax.transaction.RollbackException: Global transaction timed out after 0 seconds
	at com.ibm.ws.uow.UOWManagerImpl.runUnderNewUOW(UOWManagerImpl.java:981)
	at com.ibm.ws.uow.UOWManagerImpl.runUnderUOW(UOWManagerImpl.java:510)
	at org.springframework.transaction.jta.WebSphereUowTransactionManager.execute(WebSphereUowTransactionManager.java:281)
Caused by: javax.transaction.RollbackException: Global transaction timed out after 0 seconds
	at com.ibm.ws.uow.UOWManagerImpl.uowEnd(UOWManagerImpl.java:1019)
	at com.ibm.ws.uow.UOWManagerImpl.runUnderNewUOW(UOWManagerImpl.java:976)

此时SdhxBO中调用nx1Dao,x1Dao,x2Dao和FetchWorkflowThread

5.JTA异常2

org.springframework.transaction.TransactionSystemException: UOWManager transaction processing failed; nested exception is com.ibm.wsspi.uow.UOWException: javax.transaction.RollbackException
	at org.springframework.transaction.jta.WebSphereUowTransactionManager.execute(WebSphereUowTransactionManager.java:288)
Caused by: com.ibm.wsspi.uow.UOWException: javax.transaction.RollbackException
	at com.ibm.ws.uow.UOWManagerImpl.runUnderNewUOW(UOWManagerImpl.java:981)
Caused by: javax.transaction.RollbackException
	at com.ibm.ws.Transaction.JTA.TransactionImpl.stage3CommitProcessing(TransactionImpl.java:1880)

此时SdhxBO中调用nx1Dao,x1Dao,x2Dao和FetchWorkflowThread

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值