【问题标题】:Set default schema = SOMETHING in oracle using Spring Boot and Spring JDBC使用 Spring Boot 和 Spring JDBC 在 oracle 中设置默认模式 = SOMETHING
【发布时间】:2016-06-22 16:17:53
【问题描述】:

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

示例:从 SCHEMA.table 中选择 *

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

【问题讨论】:

  • 也许你可以分享你当前的配置。

标签: oracle spring-boot spring-jdbc


【解决方案1】:

假设您使用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. 为您的表/视图/等创建同义词(如果我们谈论的是数据库中的大量元素,我觉得这很麻烦)。

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


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

spring.datasource.schema = schema.sql

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

ALTER SESSION SET CURRENT_SCHEMA=mySchema

【讨论】:

  • 它不起作用。 spring.datasource.url=jdbc:oracle:thin:@server:1521:orcl spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver spring.datasource.username=joe spring.datasource.password=pepito spring .datasource.schema=SCHEMA_PA
  • 我使用以下属性配置我的项目:spring.datasource.url=jdbc:oracle:thin:@server:1521:orcl spring.datasource.driver-class-name=oracle.jdbc.driver。 OracleDriver spring.datasource.username=luchito spring.datasource.password=funca spring.datasource.schema=schema.sql 和我的schema.sql 有alter session set current_schema=CELTIC_PA
  • 如果您使用连接池,这将不起作用,因为脚本仅使用一个连接执行,而您想在所有连接上执行它。
  • @LuiggiMendoza 我通过使用特定于我正在使用的连接池的属性解决了这个问题:spring.datasource.hikari.connection-init-sql=ALTER SESSION... 我见过类似的其他连接池也存在属性
【解决方案2】:

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

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

【讨论】:

  • 这对我不起作用。抱怨缺少包:org.apache.tomcat.jdbc
  • 现在有一个配置属性可以设置这个值:spring.datasource.tomcat.init-s-q-l
  • 有同样的问题。首先,Hibernate 抱怨数据库连接已关闭(Connection.close()),通过使用 testOnBorrow=true 更正它,但是现在,一旦第一个连接断开,第二个连接就没有定义数据库模式,即使我使用 hibernate.default_schema 选项。这是一个错误还是什么?
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    我找到了另一种方法来解决这个问题,通过更新实体类

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

    【讨论】:

    • 在 tomcat 中不工作,tomcat 会响应错误“Schema 'SCHEMA_NAME' not found
    • 您是否使用实际的架构名称而不是“SCHEMA_NAME”?
    • 不..我不是那个愚蠢的人..如果我们使用tomcat它就不起作用
    • 能否请您从您看到的错误中发布完整的堆栈跟踪。
    【解决方案5】:

    我遇到了currently accepted answer 的问题;具体来说,模式只会从初始连接更改。如果您的应用使用连接池,则需要配置池以对每个连接应用 SQL。

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

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

    【讨论】:

    • 为我工作!谢谢!对于使用 Oracle 的人来说,这是最简单的解决方案...
    • @Michael R:如果Spring Boot应用程序部署在jboss上,是否会使用该属性,因为该属性适用于tomcat?
    • 这个答案现在已经很老了,只适用于使用 Tomcat JDBC 连接池的 Spring Boot 1.x 应用程序。如果您要部署到单独的应用服务器,则取决于您计划如何配置 JDBC 连接池。如果你在你的应用服务器中配置它(很常见),你会以不同的方式配置它。我怀疑如今将 Spring Boot 应用程序部署为 WAR 而不是使用嵌入式服务器是一种非常不常见的配置。
    【解决方案6】:

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

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

    【讨论】:

      【解决方案7】:

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

      【讨论】:

        猜你喜欢
        • 2015-08-31
        • 2013-10-26
        • 2019-10-08
        • 2018-03-07
        • 2015-05-07
        • 2012-08-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多