在jax-ws服务中,“全局事务期间不允许操作Connection.commit”

时间:2015-03-27 22:51:17

标签: java web-services hibernate transactions jax-ws

我有一个jax-ws服务,但是当我在其中运行hibernate事务时,我得到以下异常:

Caused by: java.sql.SQLException: DSRA9350E: Operation Connection.commit is not allowed during a global transaction.
    at com.ibm.ws.rsadapter.jdbc.WSJdbcConnection.commit(WSJdbcConnection.java:1104)
    at org.hibernate.transaction.JDBCTransaction.commitAndResetAutoCommit(JDBCTransaction.java:170)
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:146)
    ... 47 more

我没有使用XA数据源,客户端是一个没有连接到任何数据库的junit。我没有对这个Web服务做任何我知道的事情,导致它认为我想要一个全局事务。我没有在websphere中设置任何策略集,事实上当我查看管理控制台时,我看不到任何设置。

我的hibernate事务使用@Transactional。我的Web服务因此注释:

@WebService(targetNamespace = "http://my.domain.enote")
public interface IQueueWS {

@WebMethod(operationName="enqueueCandidate")
public List<String> enqueueCandidate(Candidate candidate);

@WebMethod(operationName="enqueueCandidates")
public List<String> enqueueCandidates(List<Candidate> candidates);

}

在我的实现类的顶部:

@Stateless
@WebService(
        portName = "QueueWSPort",
        serviceName = "QueueWSService",
        targetNamespace = "http://gov.usdoj.afms.enote",
        endpointInterface = "gov.usdoj.afms.enote.webservices.queue.IQueueWS")
public class QueueWS {

然后在客户端:

        Service client = Service.create(
            new URL("http://localhost:9080/eNotesApp/QueueWSService?wsdl"),
            new QName("http://gov.usdoj.afms.enote", "QueueWSService"));

    IQueueWS queue = client.getPort(IQueueWS.class);
    Candidate c = new Candidate();
    //blah blah, deleted for brevity
    List<String> errors = queue.enqueueCandidate(c);

我曾经使用eclipse的wsgen向导来生成服务,所以这是我第一次尝试仅使用注释......并且它们的工作范围是控制通过正确的参数获得所需的位置。正是这种交易事情阻碍了我们。

1 个答案:

答案 0 :(得分:1)

我认为您的@WebService是事务性的原因是因为@Stateless注释。在EJB 3.0中,所有EJB 3.0应用程序的默认transaction attributeREQUIRED

如果您不想这样,可以使用以下命令向无状态会话bean类添加注释:

@Stateless
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
@WebService(
...

我认为这可以让您在所描述的应用程序的较低级别执行事务逻辑,并且不会启动全局事务。