【问题标题】:Configure OracleDataSource programmatically in Spring Boot with a default schema在 Spring Boot 中使用默认模式以编程方式配置 OracleDataSource
【发布时间】:2018-07-12 16:29:36
【问题描述】:

如何在 Spring Boot 中使用默认架构以编程方式配置 Oracle DataSource?

@Bean
public DataSource getDataSource() throws SQLException {
    OracleDataSource d = new OracleDataSource();
    d.setURL(Secrets.get("DB_URL"));
    d.setUser(Secrets.get("DB_USER"));
    d.setPassword(Secrets.get("DB_PASS"));
    // d.setSchema(System.getenv("DB_SCHEMA")); ???
    return d;
}

【问题讨论】:

  • 是否可以使用 application.properties 文件进行配置或需要手动创建数据源?
  • 我在 spring 配置文件参考 spring.datasource.schema 中看到了良好的属性,但不幸的是,无法弄清楚如何以编程方式应用它。 (需要手动创建数据源)
  • 好的,没问题

标签: java spring spring-boot


【解决方案1】:

OracleDataSource中的schema不能更改或者使用连接URL,需要执行

ALTER SESSION SET CURRENT_SCHEMA=targetschema;

this answer 中解释的声明。根据Connection Properties Recognized by Oracle JDBC Drivers,初始模式没有驱动程序属性。

【讨论】:

  • 感谢卡罗尔的回答。我知道这个alter session trick,但是我需要在连接初始化时找到一个放置这个sql的好地方。你能推荐这个吗?
  • @Daryl 是否必须使用OracleDataSource?其他池库对此有一个属性,例如HiakriCP 提供connectionInitSql 配置属性
  • 感谢卡罗尔的建议。看起来 HikariDataSource 完成了我需要的工作。它有数据源包装方法和connectionInitSql。 HikariDataSource hikariDs = new HikariDataSource(); hikariDs.setDataSource(oracleDs); hikariDs.setConnectionInitSql("ALTER SESSION SET CURRENT_SCHEMA = SOME_SCHEMA"); 接受您的回答。请相应更新。
【解决方案2】:

尝试将sql执行添加到数据源创建方法中

@Bean
public DataSource getDataSource() throws SQLException {
    OracleDataSource d = new OracleDataSource();
    d.setURL(Secrets.get("DB_URL"));
    d.setUser(Secrets.get("DB_USER"));
    d.setPassword(Secrets.get("DB_PASS"));

    Resource initSchema = new ClassPathResource("scripts/schema-alter.sql");
    DatabasePopulator databasePopulator = new ResourceDatabasePopulator(initSchema);
    DatabasePopulatorUtils.execute(databasePopulator, dataSource);

    return d;
}

在 scripts/schema-alter.sql 中将是这段代码

ALTER SESSION SET CURRENT_SCHEMA=targetschema;

【讨论】:

  • 感谢马克西姆的回答。 HikariDataSource 更适合我们的目的。投票赞成你的答案。
  • @Daryl 哦,我不知道我们有能力改变 dataSources 的实现。我很高兴这个答案对你有所帮助)
  • 是否会为来自该数据源的每个新连接运行schema-alter.sql?
【解决方案3】:

完整示例:

@Bean
public DataSource getDataSource() throws SQLException {
    OracleDataSource oracleDs = new OracleDataSource();
    oracleDs.setURL(Secrets.get("DB_URL"));
    oracleDs.setUser(Secrets.get("DB_USER"));
    oracleDs.setPassword(Secrets.get("DB_PASS"));
    // other Oracle related settings...

    HikariDataSource hikariDs = new HikariDataSource();
    hikariDs.setDataSource(oracleDs);
    hikariDs.setConnectionInitSql("ALTER SESSION SET CURRENT_SCHEMA = MY_SCHEMA");

    return hikariDs;
}

【讨论】:

  • 您不需要实例化 OracleDataSource,只要 HikariDataSource 使用适当的设置即可。
【解决方案4】:

在 Spring Boot 2 中,可以在 application.properties 文件中使用以下属性设置所需的架构:

spring.datasource.hikari.connection-init-sql=ALTER SESSION SET CURRENT_SCHEMA = MY_SCHEMA

HikariCP 是 Spring Boot 2 中的默认连接池。要查看日志文件中的所有 HikariCP 设置(包括“connectionInitSql”),还要在 application.properties 中添加以下内容:

logging.level.com.zaxxer.hikari=DEBUG

【讨论】:

    猜你喜欢
    • 2015-05-03
    • 2017-02-24
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 2015-12-21
    • 2020-03-09
    • 2018-04-06
    • 2015-08-31
    相关资源
    最近更新 更多