【问题标题】:How define e chose a second datasource from application.properties on spring boot project如何定义 e 从 spring boot 项目的 application.properties 中选择第二个数据源
【发布时间】:2018-09-17 13:42:12
【问题描述】:

我是弹簧规格的新手。我与 JEE 合作了很长时间。所以我了解到我们使用 spring 在 application.properties 文件中定义数据源。

如何在 application.properties 上定义两个或多个数据源以及如何选择第二个数据源? 如果我尝试使用 spring.datasourceB.datasource.meta-datas 定义第二个数据源,该文件会显示一些标志,说明未知属性。

我目前的案例我建立了一个这样的项目:

application.properties

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://xx.xx.xx.xx:3306/dbA?useSSL=false
spring.datasource.username=username
spring.datasource.password=password

spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect

spring.DSB.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect

# Enable to auto identify each datasource
spring.jpa.database=default

我的存储库类如下所示:

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.springframework.stereotype.Repository;

@Repository
public class ClassDaoDSA {

    @PersistenceContext
    private EntityManager manager;

    public List<T> Records() {

        String stmt = "SELECT d FROM Data d ORDER BY d.id DESC";

        return manager.createQuery(stmt).getResultList();
    }

}

当我使用 JEE 项目时,我可以使用 @PersistenceUnit 标签并在那里选择我的数据源。 我如何使用 spring boot 达到同样的效果?

【问题讨论】:

  • 如果要配置多个数据源,请参考link

标签: java hibernate spring-boot jpa datasource


【解决方案1】:

您使用的命名约定不是强制性的,它只是让您无需进行配置。但是您也可以使用配置类。这是我的一个项目中的一个例子:

@Configuration
@PropertySource("app.properties")
public class DataConfig {
    @Autowired
    private Environment env;

    @Bean
    public LocalSessionFactoryBean sessionFactory() {
        Resource config = new ClassPathResource("hibernate.cfg.xml");
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setConfigLocation(config);
        sessionFactory.setPackagesToScan(env.getProperty("myapp.entity.package"));
        sessionFactory.setDataSource(dataSource());
        return sessionFactory;
    }

    @Bean
    public DataSource dataSource() {
        BasicDataSource ds = new BasicDataSource();
        ds.setDriverClassName(env.getProperty("myapp.db.driver"));
        ds.setUrl(env.getProperty("myapp.db.url"));
        ds.setUsername(env.getProperty("myapp.db.username"));
        ds.setPassword(env.getProperty("myapp.db.password"));

        return ds;
    }
}

您可以拥有不同的属性文件并在 @PropertySource 注释中指定要使用的文件,或者您可以拥有其他属性,例如 myapp.prod.db.url 和 myapp.test.db.url 并设置您的数据根据需要来源。

【讨论】:

  • 你好@lgaleazzi 你能举例说明我应该如何使用吗?我尝试使用您的类示例实现,但为每个数据源创建两个类。现在,当我运行我的项目时,我得到一个输出,说我的存储库类中有一个不满足的依赖项。但我在我的存储库类中自动装配 SessionFactory。那是我需要使用的方式吗?
  • 如果使用SessionFactory,需要定义两个LocalSessionFactoryBean(每个数据源一个),可以这样命名:@Bean(name="sessionFactory1")。然后当你注入 SessionFactory 时,你指定哪个应该与 @Qualifier("sessionFactory1") 一起使用
  • 如果你使用 Spring JPA,请参考这篇文章,它很好地解释了配置:baeldung.com/spring-data-jpa-multiple-databases 两种配置都应该工作。
猜你喜欢
  • 2015-11-06
  • 2022-01-26
  • 2018-02-26
  • 2017-06-24
  • 2020-10-12
  • 2019-03-15
  • 2020-04-27
  • 2015-11-10
  • 2020-12-25
相关资源
最近更新 更多