gpt4 book ai didi

java - Spring : Do I require to define separate TransactionManager for 2 data sources?

转载 作者:行者123 更新时间:2023-12-02 11:06:23 25 4
gpt4 key购买 nike

我正在开发一个 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

WebConfig.java:

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"com.ourapp.spring"})
@EnableTransactionManagement
@EnableCaching
public class WebConfig extends WebMvcConfigurerAdapter {


@Bean(name="primary_tx")
public HibernateTransactionManager getPrimaryTransactionManager() throws IOException {
HibernateTransactionManager txName= new HibernateTransactionManager();
txName.setSessionFactory(sessionFactory().getObject());
return txName;
}

@Bean(name="extended_tx")
public HibernateTransactionManager txName() throws IOException {
HibernateTransactionManager txName= new HibernateTransactionManager();
txName.setSessionFactory(getExtendedSessionFactory().getObject());
return txName;
}

@Bean
@Qualifier("sessionFactory_origin")
public LocalSessionFactoryBean sessionFactory() {
LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
sessionFactory.setDataSource(new DataSourceConfig().primaryDataSource());
sessionFactory.setPackagesToScan("com.ourapp.spring");
return sessionFactory;
}

@Bean
@Qualifier("sessionFactory_extended")
public LocalSessionFactoryBean getExtendedSessionFactory() {
LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
sessionFactory.setDataSource(new DataSourceConfig_Extended().secondaryDataSource());
sessionFactory.setPackagesToScan("com.ourapp.spring");
return sessionFactory;
}
}

典型的服务层方法:

@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 实例。现在,我已经注释了需要使用 secondary_tx 扩展 sessionFactory 的 DAO 层方法,但它不起作用。谢谢。 :-)

最佳答案

问题的答案

Do I require to define separate TransactionManager for 2 data sources?

从 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(){
}

关于java - Spring : Do I require to define separate TransactionManager for 2 data sources?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50928216/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com