database-all
database-all copied to clipboard
Springboot TransactionManager 报错
感觉是事物管理出问题了,我这边因为还使用了hibernate,会导致下面的配置报错。
@Bean
@ConditionalOnMissingBean
public GaarasonTransactionManager gaarasonTransactionManager() {
logger.info("-------------------- gaarasonTransactionManager init ------------------");
return new GaarasonTransactionManager(gaarasonDataSource());
}
报错截图
GaarasonDatabaseConfiguration自定义的代码,因为database-spring-boot-starter里没有配置@Primary优先级,也会导致出问题
@Slf4j
@Configuration
@AutoConfigureBefore(DruidDataSourceAutoConfigure.class)
@EnableConfigurationProperties({GaarasonDatabaseProperties.class})
@Import({GeneralModel.class})
public class GaarasonDatabaseConfiguration {
private static final Logger logger = LoggerFactory.getLogger(GaarasonDatabaseConfiguration.class);
/**
* 指定 model 扫描范围
*/
GaarasonDatabaseConfiguration(ApplicationContext applicationContext, GaarasonDatabaseProperties gaarasonDatabaseProperties) {
// 注册 model实例获取方式
ModelInstanceProvider.register(modelClass -> {
try {
return ObjectUtils.typeCast(applicationContext.getBean(modelClass));
} catch (BeansException e) {
return ObjectUtils.typeCast(applicationContext.getBean(StringUtils.lowerFirstChar(modelClass.getSimpleName())));
}
});
logger.info("Model instance provider has been registered success.");
// 注册 雪花id实现
final int workerId = gaarasonDatabaseProperties.getSnowFlake().getWorkerId();
final int dataId = gaarasonDatabaseProperties.getSnowFlake().getDataId();
ContainerProvider.register(IdGenerator.SnowFlakesID.class, clazz -> new SnowFlakeIdGenerator(workerId, dataId));
logger.info("SnowFlakesID[ workId: {}, dataId: {}] instance has been registered success.", workerId, dataId);
}
@Primary
@Bean
@ConfigurationProperties(prefix = "spring.datasource2")
@ConditionalOnMissingBean
public DataSource dataSourceDruidConfig() {
logger.info("-------------------- dataSource druid config init ---------------------");
return DruidDataSourceBuilder.create().build();
}
@Bean
@ConditionalOnMissingBean
public GaarasonDataSource gaarasonDataSource() {
logger.info("-------------------- gaarasonDataSource init --------------------------");
return ContainerProvider.getBean(GaarasonDataSourceConfig.class).build(Collections.singletonList(dataSourceDruidConfig()));
}
@Bean
@ConditionalOnMissingBean
public GaarasonTransactionManager gaarasonTransactionManager() {
logger.info("-------------------- gaarasonTransactionManager init ------------------");
return new GaarasonTransactionManager(gaarasonDataSource());
}
}
请教怎么在多个数据源里让事务可以正常执行。
根据报错信息
似乎是标红的类么有找到。
此外,如果同时使用多种orm框架的话,那么在使用诸如@Transactional
等spring的注解时,需要注意其中生效的DataSource
接口的实现是否符合预期(例如,@Transactional
-> GaarasonTransactionManager
-> GaarasonDataSource
(DataSource的实现)or @Transactional
-> xxxxTransactionManager
-> DataSource
(其他orm框架中对于DataSource的实现))。
确实是这个提示,但是很奇怪,写了那个方法就会提示,不写就没有。
https://github.com/spring-projects/spring-boot/blob/main/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/neo4j/Neo4jDataAutoConfiguration.java
@Bean
@ConditionalOnMissingBean
public GaarasonTransactionManager transactionManager() {
logger.info("-------------------- gaarasonTransactionManager init ------------------");
return new GaarasonTransactionManager(gaarasonDataSource());
}
可以尝试更改下bean的名称~
好的,谢谢。