我目前正在开发Spring Boot项目,我需要连接到2个以上的数据源(实际上是4个) . 我找到了许多如何连接到2 DS的例子,但是当我以相同的方式添加下一个时它不起作用:
...Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not a managed type: class...
对数据源有任何限制吗?或者是否可以连接到2个以上的DS?
加上@Surya说的话
步骤1:如上所述在application.properties文件中设置数据库配置 .
第2步:您需要创建一个bean . 在您的情况下,您需要创建2个指向2 diff数据源的单独bean .
@Bean("firstds") @ConfigurationProperties(prefix="spring.datasource") public DataSource primaryDataSource() { return DataSourceBuilder.create().build(); } @Bean("secondds") @ConfigurationProperties(prefix="spring.secondDatasource") public DataSource secondaryDataSource() { return DataSourceBuilder.create().build(); }
你可以在一个类中创建这个2 bean .
现在想知道如何使用这个bean!
@Autowired @Qualifier("firstds") NamedParameterJdbcTemplate firstConnection; result = firstConnection.query(Your query goes here)
以上查询将始终通过您创建的bean命中第一个数据库 . 类似地,您可以使用连接通过第二个bean命中db 2 .
创建所需数量的数据源 . 我没有任何限制 . 这只是另一种 beans 子 . Refer here
#first db spring.datasource.url = [url] spring.datasource.username = [username] spring.datasource.password = [password] spring.datasource.driverClassName = oracle.jdbc.OracleDriver #second db ... spring.secondDatasource.url = [url] spring.secondDatasource.username = [username] spring.secondDatasource.password = [password] spring.secondDatasource.driverClassName = oracle.jdbc.OracleDriver @Bean("firstds") @ConfigurationProperties(prefix="spring.datasource") public DataSource primaryDataSource() { return DataSourceBuilder.create().build(); } @Bean("secondds") @ConfigurationProperties(prefix="spring.secondDatasource") public DataSource secondaryDataSource() { return DataSourceBuilder.create().build(); }
谢谢你的帮助 . 实际上我做了所有的配置,但...(一个小拼错崩溃所有:))当我开始包括我的代码我发现它,修复,现在一切正常 . 但这里是我的代码示例(也许有人会使用它:))
所有三个实体和存储库(Shadow,Main,Project)都以完全相同的方式配置,因此我只将它放置一次 . (唯一的区别是主要的DS是@Primary .
谢谢 . BR
application.properties
#-------------------------- first spring.datasource.url=jdbc:mysql:// spring.datasource.username= spring.datasource.password= spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver #-------------------------- second second.datasource.url=jdbc:mysql:// second.datasource.username= second.datasource.password= second.datasource.driver-class-name=com.mysql.cj.jdbc.Driver #-------------------------- third third.datasource.url=jdbc:mysql:// third.datasource.password= third.datasource.username= third.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
Shadow.java
package com.server.shadow.domain; import ... @Entity @Table(name = "shadow") public class Shadow { @Id private String id; private String shadow; public Shadow(){} //getters and setters }
ShadowRepository.java
package com.server.shadow.repo; import ... @Repository public interface ShadowRepository extends JpaRepository<Shadow,Long> { }
ShadowDbConf.java
package com.server; import ... @Configuration @EnableTransactionManagement @EnableJpaRepositories(entityManagerFactoryRef = "shadowEntityManagerFactory", transactionManagerRef = "shadowTransactionManager", basePackages = {"com.server.shadow.repo"} ) public class ShadowDbConf { @Bean(name = "shadowDataSource") @ConfigurationProperties(prefix = "second.datasource") public DataSource dataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "shadowEntityManagerFactory") public LocalContainerEntityManagerFactoryBean shadowEntityManagerFactory( EntityManagerFactoryBuilder builder, @Qualifier("shadowDataSource") DataSource dataSource ) { return builder .dataSource(dataSource) .packages("com.server.shadow.domain") .persistenceUnit("shadow") .build(); } @Bean(name = "shadowTransactionManager") public PlatformTransactionManager shadowTransactionManager( @Qualifier("shadowEntityManagerFactory") EntityManagerFactory shadowEntityManagerFactory ) { return new JpaTransactionManager(shadowEntityManagerFactory); } }
MainController.java
package com.server; import ... @RestController public class MainController { private final ShadowRepository shadowRepository; private final MainRepository mainRepository; private final PojectRepository projectRepository; @Autowired MainController(ShadowRepository shadowRepository, MainRepository mainRepository,PojectRepository projectRepository) { this.shadowRepository = shadowRepository; this.mainRepository = mainRepository; this.projectRepository = projectRepository; } @GetMapping(path = "/shadow") public @ResponseBody Iterable<Shadow> getShadows(){ return shadowRepository.findAll(); } }
3 回答
加上@Surya说的话
步骤1:如上所述在application.properties文件中设置数据库配置 .
第2步:您需要创建一个bean . 在您的情况下,您需要创建2个指向2 diff数据源的单独bean .
你可以在一个类中创建这个2 bean .
现在想知道如何使用这个bean!
以上查询将始终通过您创建的bean命中第一个数据库 . 类似地,您可以使用连接通过第二个bean命中db 2 .
创建所需数量的数据源 . 我没有任何限制 . 这只是另一种 beans 子 . Refer here
谢谢你的帮助 . 实际上我做了所有的配置,但...(一个小拼错崩溃所有:))当我开始包括我的代码我发现它,修复,现在一切正常 . 但这里是我的代码示例(也许有人会使用它:))
所有三个实体和存储库(Shadow,Main,Project)都以完全相同的方式配置,因此我只将它放置一次 . (唯一的区别是主要的DS是@Primary .
谢谢 . BR
application.properties
Shadow.java
ShadowRepository.java
ShadowDbConf.java
MainController.java