【问题标题】:Spring Txn - multiple datasources, transactionManaggers, How to decide on a transaction manager in runtime using @Transcational?Spring Txn - 多个数据源,事务管理器,如何使用@Transcational 在运行时决定事务管理器?
【发布时间】:2016-05-26 14:24:28
【问题描述】:

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

我有一项服务在运行时根据如下参数动态选择 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 实例下有多个数据源(一个用于在线,一个用于商店)和多个事务管理器。

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

有没有办法做到这一点?

我想让我的代码尽可能地简洁——不想使用外观创建 2 个服务或 DAO 实现。

【问题讨论】:

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


    【解决方案1】:

    请参阅以下步骤:

    1.创建使用自己的transactional managers2 different helper DAO implementation classes

    2.只要确保both Implementation classes 应该是implementcommon interface

    3.Main DAO 类将保留两个助手实现(利用@Qualifier 区分这两个助手实现)

    4.Main DAO 将获得一个datasource 名称作为parameter 并基于它调用正确的helper bean 方法

    【讨论】:

    • 感谢回复,我们不想介绍具体的实现类,因为实现看起来完全一样,这里的问题是因为存储数据的模式不同。所有应用程序逻辑将保持不变。所以我们正在寻找一种方法来根据接收到的方法的参数动态指定事务管理器。
    猜你喜欢
    • 1970-01-01
    • 2019-12-30
    • 2015-08-23
    • 2016-09-25
    • 2011-07-11
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多