【问题标题】:Spring Boot Database - Running Application with different DB User / FlywaySpring Boot 数据库 - 使用不同的数据库用户/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迁移使用相同的架构吗?

标签: spring database schema flyway application.properties


【解决方案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());
    }
}

【讨论】:

    猜你喜欢
    • 2020-10-17
    • 2019-02-02
    • 2018-09-13
    • 2019-08-14
    • 2018-08-01
    • 2018-11-10
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多