【Java】配置多数据源报错循环依赖

简介: 【Java】配置多数据源报错循环依赖

分析

首先,循环依赖是指在应用程序中,两个或更多的bean相互依赖,形成一个闭环。在Java中,这通常通过Spring框架的依赖注入来解决。

如果你在配置多个数据源时遇到循环依赖的问题,那么可能是由于你的数据源bean彼此之间存在着直接或间接的依赖关系。这可能是因为一个数据源bean的方法或构造函数中引用了另一个数据源bean,或者两个数据源bean都引用了一个共享的第三方bean,而这个第三方bean又引用了其中一个数据源bean。

解决这个问题的一种方法是使用@Lazy注解。Spring的@Lazy注解可以让Spring在需要的时候才去初始化bean,这样可以避免循环依赖的产生。

现象

Description:

The dependencies of some of the beans in the application context form a cycle:

bookInfoController (field private com.croot.portal.service.PortalBookInfoService

com.croot.portal.controller.BookInfoController.portalBookInfoService)

portalBookInfoService

commonService

commonMapper defined in file [D:\workspace\masterportal\rims\global-module\target\classes\com\croot\global\dao\CommonMapper.class]

sqlSessionFactory defined in class path resource [com/baomidou/mybatisplus/autoconfigure/MybatisPlusAutoConfiguration.class]

┌─────┐

| dynamicDataSource defined in class path resource [com/croot/portal/config/DataSourceConfig.class]

↑ ↓

| datasource1 defined in class path resource [com/croot/portal/config/DataSourceConfig.class]

↑ ↓

| org.springframework.boot.autoconfigure.jdbc.DataSourceInitializerInvoker

避免

@Configuration  
public class DataSourceConfig {  
  
    @Bean  
    @Lazy  
    @ConfigurationProperties(prefix = "spring.datasource.one")  
    public DataSource dataSourceOne() {  
        return DataSourceBuilder.create().build();  
    }  
  
    @Bean  
    @Lazy  
    @ConfigurationProperties(prefix = "spring.datasource.two")  
    public DataSource dataSourceTwo() {  
        return DataSourceBuilder.create().build();  
    }  
}

在这个例子中,@Lazy注解让Spring在需要dataSourceOne或dataSourceTwo的时候才去初始化它们,避免了循环依赖的产生。

但是请注意,@Lazy只能解决由于自动装配(autowiring)导致的循环依赖问题。如果你的循环依赖问题是由于其他原因导致的,比如构造函数注入,那么你可能需要寻找其他的解决方案。例如,你可能需要重新设计你的类结构,避免数据源bean之间的直接依赖。

实战

sprintboot 低版本可以使用 spring.datasource.initialize=false (默认为true) 来解决,升级到sprintboot2.1.2后就发现被启用了

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)

在启动类上增加这个属性即可!

目录
相关文章
|
1天前
|
Java
Java快速入门之判断与循环
本文介绍了编程中的流程控制语句,主要包括顺序结构、判断结构(if语句和switch语句)以及循环结构(for、while和do...while)。通过这些语句可以精确控制程序的执行流程。if语句有三种格式,分别用于简单条件判断、二选一判断和多条件判断。switch语句适用于有限个离散值的选择判断,而循环结构则用于重复执行某段代码,其中for循环适合已知次数的情况,while循环适合未知次数但有明确结束条件的情况,do...while则是先执行后判断。文中还提供了多个示例和练习,帮助读者理解并掌握这些重要的编程概念。
|
16天前
|
Java Maven
java项目中jar启动执行日志报错:no main manifest attribute, in /www/wwwroot/snow-server/z-server.jar-jar打包的大小明显小于正常大小如何解决
在Java项目中,启动jar包时遇到“no main manifest attribute”错误,且打包大小明显偏小。常见原因包括:1) Maven配置中跳过主程序打包;2) 缺少Manifest文件或Main-Class属性。解决方案如下:
java项目中jar启动执行日志报错:no main manifest attribute, in /www/wwwroot/snow-server/z-server.jar-jar打包的大小明显小于正常大小如何解决
|
5天前
|
Java Windows
【Azure Function】部署Java Function失败:报错deploy [ERROR] Status code 401和警告 'China North 3' may not be a valid region
1:deploy [ERROR] Status code 401, (empty body). 2: China North 3 may not be a valid region,please refer to https://aka.ms/maven_function_configuration#supported-regions for values. 3:  <azure.functions.maven.plugin.version>1.36.0</azure.functions.maven.plugin.version>
22 11
|
2月前
|
JSON Java 关系型数据库
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
在Java中,使用mybatis-plus更新实体类对象到mysql,其中一个字段对应数据库中json数据类型,更新时报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
171 4
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
|
2月前
|
Java 程序员 API
Java循环操作哪个快?
本文探讨了Java中stream API与传统for循环在性能上的对比,通过多个示例分析了不同场景下两者的优劣。作者指出,尽管stream API使代码更简洁,但不当使用会降低可读性和性能,特别是在处理大数据量时。实验结果显示,在多数情况下,普通for循环的性能优于stream API,尤其是在单次操作耗时较短但需多次执行的场景中。文章建议开发者在设计初期就考虑全局流程,避免重复使用stream流,以提升代码质量和性能。
Java循环操作哪个快?
|
2月前
|
Java 程序员 API
Java循环操作哪个快?
本文探讨了Java中Stream API与传统for循环的性能对比及适用场景。作者通过实际案例分析,指出在某些情况下,过度使用Stream API会导致代码可读性和维护性下降。测试结果显示,在数据量较小的情况下,普通for循环的性能优于Stream API,尤其是在涉及多次类似操作时。因此,建议在开发中根据具体需求选择合适的遍历方式,以提高代码的可读性和性能。
Java循环操作哪个快?
|
2月前
|
分布式计算 Java MaxCompute
ODPS MR节点跑graph连通分量计算代码报错java heap space如何解决
任务启动命令:jar -resources odps-graph-connect-family-2.0-SNAPSHOT.jar -classpath ./odps-graph-connect-family-2.0-SNAPSHOT.jar ConnectFamily 若是设置参数该如何设置
|
2月前
|
Java 数据库连接 数据库
如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面
本文介绍了如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面。通过合理配置初始连接数、最大连接数和空闲连接超时时间,确保系统性能和稳定性。文章还探讨了同步阻塞、异步回调和信号量等并发控制策略,并提供了异常处理的最佳实践。最后,给出了一个简单的连接池示例代码,并推荐使用成熟的连接池框架(如HikariCP、C3P0)以简化开发。
70 2
|
3月前
|
算法 Java 测试技术
🧑‍💻Java零基础:Java 的循环退出语句 break
【10月更文挑战第16天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
78 6
|
2月前
|
安全 小程序 Java
Java“AccessControlException”报错解决
Java中的“AccessControlException”通常发生在尝试访问受安全策略限制的资源时。解决方法包括:1. 检查安全策略文件(java.policy)配置;2. 确保代码具有足够的权限;3. 调整JVM启动参数以放宽安全限制。
210 1