使用 Spring Boot 和 Spring JDBC 在 oracle 中设置默认模式 = SOMETHING

Set default schema = SOMETHING in oracle using Spring Boot and Spring JDBC

我现在正在使用 oracle 和 spring jdbc,但我不想在我的 sql 语句中使用模式:

示例:Select * 来自 SCHEMA.table

有没有办法在 application.properties 或 application.yml 中设置默认架构?

假设您使用 spring 数据源定义数据库连接,您可以在定义数据源配置时设置默认架构:

spring.datasource.schema = #value for your default schema to use in database

您可以在此处找到更多信息:Spring Boot Reference Guide. Appendix A. Common application properties


经过一些研究,Oracle 驱动程序似乎不允许您设置要使用的默认模式,如下所述:

Default Schema in Oracle Connection URL

据此 post,您有两个选择:

  1. 在执行你的语句之前先执行这条语句:

    ALTER SESSION SET CURRENT_SCHEMA=yourSchema
    
  2. 为您的 tables/views/etc 创建同义词(如果我们谈论的是数据库中的大量元素,我觉得这真的很麻烦)。

我建议使用第一个选项。据我所知,Spring boot 没有提供一种在检索连接时执行语句的简单方法,因此最好的办法是使用 getConnection 方法(或从数据源检索连接)并在那里执行语句。


根据您的评论,更简单的解决方法是使用 spring.datasource.schema 中的脚本:

spring.datasource.schema = schema.sql

然后是一个包含以下内容的文件 squema.sql:

ALTER SESSION SET CURRENT_SCHEMA=mySchema

以您的用户身份连接到数据库,您可以创建一个触发器,每次登录时都会更改架构:

CREATE OR REPLACE TRIGGER LOGON_TRG 
  AFTER LOGON ON SCHEMA
BEGIN
     EXECUTE IMMEDIATE 'ALTER SESSION SET CURRENT_SCHEMA = foo';
EXCEPTION 
  when others 
    then null;
END;
/  

在 spring 引导中,我找到了另一种方法,

@Bean
@ConfigurationProperties(prefix="spring.datasource")
public DataSource dataSource(@Value("${spring.datasource.schema}") String schema) {
    DataSource datasource = DataSourceBuilder.create().build();
    if(!schema.isEmpty() && datasource instanceof org.apache.tomcat.jdbc.pool.DataSource){
            ((org.apache.tomcat.jdbc.pool.DataSource) datasource).setInitSQL("ALTER SESSION SET CURRENT_SCHEMA=" + schema);
    }
    return datasource;
} 

我遇到了 currently accepted answer 的问题;具体来说,架构只会从初始连接开始更改。如果您的应用程序使用连接池,您需要将池配置为为每个连接应用 SQL。

例如,在 Spring 引导 1 中使用默认 jdbc 池。5.x (Tomcat):

spring.datasource.tomcat.init-s-q-l = ALTER SESSION SET CURRENT_SCHEMA=mySchema

另一种选择是创建数据源包装器。正常创建数据源,然后创建转发除 getConnection 方法之外的所有方法的包装器。对于那些我刚刚添加 SQL 来设置架构。我们有多个数据源,这允许我们为每个数据源指定不同的模式。如果有人知道这是否有问题,我很乐意发表评论。或者,如果有使用这些属性的替代方案。

我找到了另一种方法来解决这个问题,方法是将实体 class 更新为

@Table(schema = "SCHEMA_NAME" ,name = "TABLE_NAME")

如果您使用的是 hikari,请使用 spring.datasource.hikari.schema=YOUR_SCHEMA。 使用 Oracle 的 SpringBoot + tomcat 为我工作。