亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Spring:我需要為2個數據源定義單獨的TransactionManager嗎?

Spring:我需要為2個數據源定義單獨的TransactionManager嗎?

九州編程 2021-04-06 21:10:17
我正在開發一個Spring-MVC應用程序,在該應用程序中,我為不同類型的任務定義了2個數據源。當前,在從XML到Java的遷移過程中,我偶然發現了添加新HibernateTransactionManager對象@Transactional才能正常工作的要求。對于2個不同的數據源,我有2個單獨的SessionFactory實例。但是,當我嘗試使用輔助數據源創建另一個HibernateTransactionManager實例時,出現了一個非唯一異常。我要發布的配置是否需要輔助HibernateTransactionManager實例,還是1個就足夠了?如果需要,如何創建一個?謝謝你。錯誤日志:org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [org.springframework.transaction.PlatformTransactionManager] is defined: expected single matching bean but found 2: primary_tx,extended_tx    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:368)    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331)    at org.springframework.transaction.interceptor.TransactionAspectSupport.determineTransactionManager(TransactionAspectSupport.java:367)    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:271)    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)    at org.springfram典型的服務層方法:@Service@Transactional("primary_tx")public class ChatRoomMembersServiceImpl implements ChatRoomMembersService{   private final ChatRoomMembersDAO chatRoomMembersDAO;    @Autowired    public ChatRoomMembersServiceImpl(ChatRoomMembersDAO chatRoomMembersDAO){        this.chatRoomMembersDAO = chatRoomMembersDAO;    }}典型的DAO層方法:@Repository@Transactional("primary_tx")public class ChatRoomMembersDAOImpl implements ChatRoomMembersDAO{    @Autowired    @Qualifier(value = "sessionFactory_origin")    private  SessionFactory sessionFactory;    @Autowired    @Qualifier(value = "sessionFactory_extended")    private  SessionFactory sessionFactory_extended;}現在,每當需要時,我指的是擴展的SessionFactory實例?,F在,我用來注釋了需要擴展sessionFactory的DAO層方法secondary_tx,但是它不起作用。謝謝你。:-)
查看完整描述

1 回答

?
翻閱古今

TA貢獻1780條經驗 獲得超5個贊

您問題的答案


我是否需要為2個數據源定義單獨的TransactionManager?


是YES


從Java8開始,您可以在方法上多次具有相同的批注(前提是批注標記為@Repeatable)。實現此目的的另一種方法是提供自定義注釋,該注釋將處理數據源之一。


您得到的異常是因為有兩個用于事務管理的合格Bean。您需要一個限定詞。


代替:


@Bean(name="primary_tx")

    public HibernateTransactionManager getPrimaryTransactionManager() throws IOException {

        HibernateTransactionManager txName= new HibernateTransactionManager();

        txName.setSessionFactory(sessionFactory().getObject());

        return txName;

    }


@Bean @Qualifier("primary_tx")


    public HibernateTransactionManager getPrimaryTransactionManager() throws IOException {

        HibernateTransactionManager txName= new HibernateTransactionManager();

        txName.setSessionFactory(sessionFactory().getObject());

        return txName;

    }

現在,假設您要使我的方法m1中的事務成為原子事務。以下是您需要的


@Transactional("primary_tx")

public void m1(){

}


查看完整回答
反對 回復 2021-04-14
  • 1 回答
  • 0 關注
  • 336 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號