使用Spring Boot和Spring JDBC在oracle中设置默认架构= SOMETHING

时间:2016-06-22 16:17:54

标签: oracle spring-boot spring-jdbc

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

示例:从SCHEMA.table

中选择*

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

7 个答案:

答案 0 :(得分:7)

假设您使用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

从该帖子中,您有两种选择:

  1. 在执行语句之前执行此语句:

    ALTER SESSION SET CURRENT_SCHEMA=yourSchema
    
  2. 为您的表/视图/等创建同义词(如果我们在谈论数据库中的大量元素,我会发现这很烦人。)

  3. 我建议使用第一个选项。从我看到的情况来看,Spring引导并不提供在检索连接时执行语句的简单方法,因此最好的方法是使用getConnection方法(或从中检索连接的方法)的方法。数据源)并在那里执行语句。

    通过评论,一种更简单的解决方法是使用spring.datasource.schema中的脚本:

    spring.datasource.schema = schema.sql
    

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

    ALTER SESSION SET CURRENT_SCHEMA=mySchema
    

答案 1 :(得分:7)

在春季靴子中,我找到了另一种方法,

@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;
} 

答案 2 :(得分:2)

我找到了另一种解决方法,方法是使用

更新实体类
@Table(schema = "SCHEMA_NAME" ,name = "TABLE_NAME")

答案 3 :(得分:1)

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

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;
/  

答案 4 :(得分:1)

我遇到currently accepted answer的问题;具体而言,只能从初始连接更改架构。如果您的应用使用连接池,则需要配置池以为每个连接应用SQL。

例如,在Spring Boot 1.5.x(Tomcat)中使用默认的jdbc池:

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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