我目前正在开发Spring Boot项目,我需要连接到2个以上的数据源(实际上是4个)。 我找到了很多关于如何连接到2 DS的示例,但是当我按照相同的方式添加下一个时它不起作用:
...调用init方法失败;嵌套异常是java.lang.IllegalArgumentException:不是托管类型:class ...
对数据源有任何限制吗? 或者是否可以连接到2个以上的DS?
答案 0 :(得分:2)
创建所需数量的数据源。我没有任何限制。它只是另一个bean。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();
}
答案 1 :(得分:0)
添加@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。
答案 2 :(得分:0)
感谢您的帮助。 其实我做的所有配置都正确但是...(一个小拼错全部崩溃:)) 当我开始包含我的代码时,我找到它,修复了,现在一切正常。 但这里是我的代码作为例子(也许有人会使用它:))
所有三个实体和存储库(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();
}
}