Spring Txn - 多个数据源,transactionManaggers,如何使用@Transcational在运行时决定事务管理器?

时间:2016-05-26 04:44:22

标签: spring transactions spring-annotations spring-4 spring-mybatis

我正在研究一种在运行时动态获取事务管理器实例的方法。

我有一个服务,它根据下面的参数

在运行时动态选择DAO引用
@Mapper //Spring-MyBatis mapper
public interface DataMapper {
   void save(Object domain);
}

public class DAO {
  private DataMapper mapper;

   public void save(Object domain) {
     mapper.save(domain);
  }
}

@Component
public class Service {

   private DAO onlineBusinessDAO;
   private DAO storeBusinessDAO;

   public void save(String businessIdentifier, Object domain) {
      identifyDAOBasedOn(businessIdentifier).save(domain);
   }

   private DAO identifyDAOBasedOn(String businessIdentifier) {
    Switch(businessIdentifier) {
      case "Online":
          return onlineBusinessDAO;
      case "Store":
          return storeBusinessDAO;
     }
   }
}

在上面基于businessIdentifier的实现中,我决定在哪个DAO实例中进行拾取,在DAO中我使用mybatis Mapper来完成这项工作。

所以我有多个数据源(一个用于在线,一个用于商店)和一个特定DAO实例下的多个transactionManagers。

我想在Service类的save()下使用spring @Transactional,但我需要根据businessIdentifier参数指定在运行时动态地使用哪个“transactionManager”引用。

有没有办法实现这个目标?

我希望保持代码更清晰,尽可能少 - 不想使用facade创建2个服务或DAO实现。

1 个答案:

答案 0 :(得分:0)

请参阅以下步骤:

1.创建使用自己2 different helper DAO implementation classes的{​​{1}}。

2.请确保transactional managers应该both Implementation classes一个implement

3. common interface类将保留两个辅助实现(使用Main DAO来区分这两个辅助实现)

4.主DAO将获得@Qualifier作为datasource的名称,并根据它将调用正确的方法parameter