0

我正在寻找一种在运行时动态获取事务管理器实例的方法。Spring Txn - 多个datasources,transactionManaggers,如何使用@Transcational在运行时决定事务管理器?

我有其基于像下面

@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上述实现动态地选择在运行时DAO基准的服务我正在使用mybatis Mapper来完成这项工作。

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

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

有没有办法做到这一点?

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

回答

0

下面请看步骤:

1.创建2 different helper DAO implementation classes其使用自己的transactional managers

2.Just确保both Implementation classes应该implement一个common interface

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

四,主要DAO会得到一个datasource的名称为parameter,并基于它会调用正确的方法helper bean

+0

感谢您的回应,我们不想引入特定的实现类作为实现n看起来完全一样,这里的问题是因为存储数据的不同模式。所有的应用程序逻辑将保持不变。所以我们正在寻找一种方法来根据收到的参数动态指定transactionmanager。 – sriharishk

相关问题