Spring Boot 数据库 - 使用不同的数据库用户/Flyway 运行应用程序

Posted

技术标签:

【中文标题】Spring Boot 数据库 - 使用不同的数据库用户/Flyway 运行应用程序【英文标题】:Spring Boot Database - Running Application with different DB User / Flyway 【发布时间】:2020-07-06 13:16:31 【问题描述】:

我的应用程序目前存在问题。这是一个 Spring Boot 应用程序,我通过 Flyway 创建数据库表。对于 Flyway,我创建了一个具有足够权限的数据库用户来创建数据库表。

对于应用程序,我想使用不同的 DB 用户 (APP_DB_USER) 来插入业务数据。

到目前为止,Flyway 脚本运行良好,并且正在创建表格 我还使用以下命令授予 APP_DB_USER 权限。 (在我的示例中,架构名称和用户名相同)

GRANT ALL ON DB_USER.TABLE1 TO APP_DB_USER;

在 SQL Developer 中,我可以在 DB_USER 表(例如 DB_USER.TABLE1)上使用 APP_DB_USER 运行 SELECT / INSERT 语句

我的问题现在出现在 Spring Boot 应用程序中。 我已经设置:

spring:
  datasource:
    url: DB_URL
    username: APP_DB_USER 
    password: password
    driver-class-name: oracle.jdbc.OracleDriver
    initialization-mode: EMBEDDED
    hikari:
      connection-timeout: 20000
      minimum-idle : 1
      maximum-pool-size : 2
      idle-timeout: 10000
      max-lifetime: 1000
      auto-commit: true
      schema: DB_USER

应用程序正在正确启动,但是一旦我尝试保存实体,它就会给我错误消息

java.sql.SQLSyntaxErrorException: ORA-00942: Table or View not found

另外我尝试了以下属性

jpa:
    show-sql: true
    properties:
      hibernate:
        default_schema: DB_USER
        dialect: org.hibernate.dialect.Oracle12cDialect 

有没有人知道我做错了什么。 我如何通过 Flyway 创建不同的 DB_User 表,然后应用程序可以通过不同的 APP_DB_USER 使用这些表

【问题讨论】:

您确定应用和flyway迁移使用相同的架构吗? 【参考方案1】:

Hikari 可能无法访问架构参数,因为它位于嵌套结构中。如果您有多个数据源,则可能会发生这种情况。以下解决方案对我有用:

在 application.yml 中

spring:
  datasource:
    url: DB_URL
    username: APP_DB_USER 
    password: password
    driver-class-name: oracle.jdbc.OracleDriver
    initialization-mode: EMBEDDED
    connection-timeout: 20000
    minimum-idle : 1
    maximum-pool-size : 2
    idle-timeout: 10000
    max-lifetime: 1000
    auto-commit: true
    schema: DB_USER

在 Application.class 中

@SpringBootApplication
public class Application 
    public static void main(String[] args) 
        SpringApplication.run(Application.class, args);
    

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public HikariConfig firstHikariConfig() 
        return new HikariConfig();
    

    @Bean
    public DataSource firstDataSource() 
        return new HikariDataSource(firstHikariConfig());
    

    @Bean
    public JdbcTemplate firstJdbcTemplate() 
        return new JdbcTemplate(firstDataSource());
    

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.second")
    public HikariConfig secondHikariConfig() 
        return new HikariConfig();
    

    @Bean
    public DataSource secondDataSource() 
        return new HikariDataSource(secondHikariConfig());
    

    @Bean
    public JdbcTemplate secondJdbcTemplate() 
        return new JdbcTemplate(secondDataSource());
    

【讨论】:

以上是关于Spring Boot 数据库 - 使用不同的数据库用户/Flyway 运行应用程序的主要内容,如果未能解决你的问题,请参考以下文章

连接到多个 mongo db 主机并在 spring boot 中使用不同的数据库进行身份验证

使用Spring Boot JPA Specification实现使用JSON数据来查询实体数据

如何在Spring Boot和Spring Data中使用两个Cassandra数据源?

Spring Boot2 系列教程 | 实现声明式事务

Spring Boot教程7——Profile

如何配置 Spring Boot 以使用两个数据库?