java – Spring事务不能正常运行JAX WS JDBC

前端之家收集整理的这篇文章主要介绍了java – Spring事务不能正常运行JAX WS JDBC前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我对这个问题有点恼怒.让我们检查是否有人实现了类似的东西.

我有一个带有8个WS的java 8 Web应用程序.一些这样的WS,通过JDBCTemplate进行插入和更新(由于性能需要,Hibernate不是一个选择),如果执行因异常而崩溃,我需要它们回滚.

我在spring app上下文文件中有以下数据源和事务管理器配置(Tomcat的server.xml / context.xml中的jndi资源):

  diobjectfactorybean">
        

另一方面,我有一个dataBase DBcontroller.class的唯一访问点,它有一个插入,删除和更新的通用方法

private NamedParameterJdbcTemplate jdbcTemplate;
private DataSource datasource;

@Autowired
public void setDataSource(DataSource dataSource) {
    this.datasource = dataSource;
    this.jdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
}
@Override
public boolean queryForModifying(String query,sqlParameterSource parameters) {

  int modifiedRows= 0;
  try {
      modifiedRows= this.jdbcTemplate.update(query,parameters);
  } catch (Exception e) {
      e.printStackTrace();
      numRegistrosAfectados = 0;
  }
  return (modifiedRows> 0) ? true : false;
}

最后我有一个WS接口这样:

@WebService
public interface IService{

    @WebMethod
    public method(MethodRequestType request) throws IllegalArgumentException,IllegalAccessException;

}

实施:

@WebService(endpointInterface = "com.package.IService")
@HandlerChain(file = "handler-chain.xml")
public class Service implements IService{

    @Autowired
    IDBController dbController;

使用“交易”方法

@Transactional
private boolean inserts(HashMap

它应该在非WS项目上正常工作,但正如我发现没有那么简单的方法来完成这项工作.

首先我认为它没有回滚,但现在我很确定它不会创建交易.

stackoverflow中有一些类似的帖子,但没有一个能解决我的问题.我已经谷歌了很多,建议的唯一方法是WS-AtomicTransactions,我从未听说过.

我已经尝试了几乎所有的XML配置文件,我甚至尝试以编程方式管理事务,但由于它是一个连接池,我无法将自动提交设置为false,因此我可以强制回滚.

因为如果它对任何人都有用,我为每个WS实现了肥皂处理程序,看起来像这样:

public class ServiceHandler implements SOAPHandler
最佳答案
重要的是你调用@Transactional注释的方法.例如,如果你有:

@Service
public class Service1 {

    @Transactional
    public void method1() { ... }

    public void method2() {
        method1();
    }
}

@Service
public class Service2 {

    @Autowired
    private Service1 service1;

    public void method1() {
        service1.method1();
    }

    public void method2() {
        service1.method2();
    }
}

>调用service2.method2()不会创建事务.
>调用service2.method1()将创建一个.

由于Spring处理Proxies和AOP的方式.

猜你在找的Spring相关文章