我们正在改变遗留应用程序的体系结构以使用Spring JDBC。
应用程序需要在一个事务中连续调用两个存储过程。存储过程A注册运行存储过程B所需的安全令牌:
BEGIN package_a.a('token'); END;
BEGIN package_b.b('foo','bar','baz'); END;
我为每一个创建了Spring存储过程:
@Component
public class SecurityTokenSP extends StoredProcedure {
@Autowired
public SecurityTokenSP(DataSource ds) {
super(ds, "package_a.a");
declareParameter(new SqlParameter("token", Types.VARCHAR));
compile();
}
public void setToken(String token) {
Map<String, Object> inputParams = new HashMap<String, Object>();
inputParams.put("token", token);
execute(inputParams);
}
}
// Similar code for procedure B (FooBarBazSP)
我在一种方法中从服务中调用这两种方法:
@Service
public class MyService {
@Autowired
private SecurityTokenSP securityTokenSP;
@Autowired
private FooBarBazSP fooBarBazSP;
@Transactional(propagation = Propagation.MANDATORY, rollbackFor = Exception.class)
public void doIt(String foo, String bar, String baz) {
securityTokenSP.setToken("myToken");
fooBarBazSP.doIt(foo, bar, baz);
}
}
所有内容都正确连接并调用每个过程。但是,第二个过程就像第一个过程没有运行一样。我怀疑Spring在执行调用期间在连接上调用'commit',但这只是一个理论。
我没有看到如何将两个类合并为一个,因为StoredProcedure构造函数采用特定存储过程的名称,并且似乎只是为了包装一个存储过程。