【发布时间】:2016-11-09 19:17:18
【问题描述】:
自上周以来我遇到了一个问题,我一直在到处寻找解决方案...我是瞎了吗?
我目前正在使用 Spring Boot 开发 Java Web 应用程序。我有 3 个具有相同结构但数据不同的 Oracle 数据库,因为每个数据库都在特定的环境中工作。
我发现了许多关于“如何使用多个数据源”的提示,但它们都在谈论具有特定实体的不同数据源(例如“用户”和“订单”)。所以他们没有解决我的问题。
因为我的 3 个数据库具有相同的结构,所以我希望能够使用我的实体并在我的所有数据库上搜索结果。
所以我尝试像这样配置应用程序:
@Configuration
public class OracleConfiguration {
@Bean
@Primary
@ConfigurationProperties(prefix="datasource.recette")
public DataSource recetteDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix="datasource.homologation")
public DataSource homologationDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix="datasource.production")
public DataSource productionDataSource() {
return DataSourceBuilder.create().build();
}
}
并将配置参数放入我的application.yml:
# Hibernate configuration
spring:
jpa:
database-platform: org.hibernate.dialect.Oracle10gDialect
datasource:
# Oracle configuration for "recette" database
recette:
url: "myURL_recette"
username: "userR"
password: "pwdR"
driver-class-name: "oracle.jdbc.OracleDriver"
# Oracle configuration for "homologation" database
homologation:
url: "myURL_hom"
username: "userH"
password: "pwdH"
driver-class-name: "oracle.jdbc.OracleDriver"
# Oracle configuration for "production" database
production:
url: "myURL_Prod"
username: "userP"
password: "pwdP"
driver-class-name: "oracle.jdbc.OracleDriver"
有了这个,我可以访问第一个注册的数据库,但不能访问其他 2 个。
有人对此有解决方案或任何想法吗? 如果我不够清楚,我会改写或补充细节。
编辑:添加了 Spring autowire beans 的主类:
@SpringBootApplication
@EnableAutoConfiguration
public class App {
public static void main(String[] args) {
System.out.println("My App ...");
SpringApplication.run(App.class, args);
}
}
编辑:添加实体示例:
@Entity
@Table(name = "UPSTREAM")
@IdClass(UpstreamPK.class)
public class Upstream implements Serializable {
private int numins;
private String name;
@Id
@Column(name = "NUMINS", nullable = false, precision = 0)
public int getNumins() {
return numins;
}
public void setNumins(int numins) {
this.numins = numins;
}
@Id
@Column(name = "NAME", nullable = false, length = 150)
public String getName() {
return nomfic;
}
public void setName(String name) {
this.name = name;
}
}
存储库:
@Transactional
public interface UpstreamRepository extends CrudRepository<Upstream, Long> {
}
服务:
@Service(value = "upstreamService")
public class UpstreamServiceImpl implements UpstreamService {
@PersistenceContext
private EntityManager em;
@Resource
private UpstreamRepository upstreamRepository;
@Override
public Upstream findOne(final String filename) {
final CriteriaBuilder cb = em.getCriteriaBuilder();
final CriteriaQuery<Upstream> cq = cb.createQuery(Upstream.class);
final Root<Upstream> root = cq.from(Upstream.class);
final EntityType<Upstream> entityType = root.getModel();
cq.select(root);
Predicate where = cb.conjunction();
if (filename != null && !filename.isEmpty()) {
// Add predicate for "name"
final Predicate namePredicate = root.get(entityType.getSingularAttribute("name")).in(filename);
where = cb.and(where, namePredicate);
}
// Query creation
cq.where(where);
final TypedQuery<Upstream> q = em.createQuery(cq);
return q.getSingleResult();
}
public UpstreamRepository getUpstreamRepository() {
return upstreamRepository;
}
public void setUpstreamRepository(final UpstreamRepository upstreamRepository) {
this.upstreamRepository = upstreamRepository;
}
}
【问题讨论】:
-
你真的需要一次3个数据库吗?
-
@M.Deinum:是的,我愿意!我需要搜索(使用一些 Hibernate Criteria)符合我的搜索和这 3 个数据库的行。
-
那么有 3 个独立的 DB 具有相同的表,但不同的数据?
-
你能把关于你的 Jpa/Hibernate/... 连接工厂的额外配置放在一边吗?
-
能否提供自动装配数据源的类/Bean?
标签: java spring hibernate spring-boot datasource