【发布时间】:2016-06-22 16:17:53
【问题描述】:
我现在正在使用 oracle 和 spring jdbc,但我不想在我的 sql 语句中使用架构:
示例:从 SCHEMA.table 中选择 *
有没有办法在 application.properties 或 application.yml 中设置默认架构?
【问题讨论】:
-
也许你可以分享你当前的配置。
标签: oracle spring-boot spring-jdbc
我现在正在使用 oracle 和 spring jdbc,但我不想在我的 sql 语句中使用架构:
示例:从 SCHEMA.table 中选择 *
有没有办法在 application.properties 或 application.yml 中设置默认架构?
【问题讨论】:
标签: oracle spring-boot spring-jdbc
假设您使用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
从该帖子中,您有两个选择:
在执行您的语句之前执行此语句:
ALTER SESSION SET CURRENT_SCHEMA=yourSchema
为您的表/视图/等创建同义词(如果我们谈论的是数据库中的大量元素,我觉得这很麻烦)。
我建议使用第一个选项。据我所知,Spring boot 在检索连接时没有提供执行语句的简单方法,因此最好的办法是使用 getConnection 方法(或从数据中检索连接的方法)周围的方面source) 并在那里执行语句。
根据您的评论,更简单的解决方法是使用spring.datasource.schema 中的脚本:
spring.datasource.schema = schema.sql
然后是一个包含以下内容的文件 squema.sql:
ALTER SESSION SET CURRENT_SCHEMA=mySchema
【讨论】:
在 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;
}
【讨论】:
如果您使用 hikari,请使用 spring.datasource.hikari.schema=YOUR_SCHEMA。 使用 Oracle 与 SpringBoot + tomcat 一起为我工作。
【讨论】:
我找到了另一种方法来解决这个问题,通过更新实体类
@Table(schema = "SCHEMA_NAME" ,name = "TABLE_NAME")
【讨论】:
我遇到了currently accepted answer 的问题;具体来说,模式只会从初始连接更改。如果您的应用使用连接池,则需要配置池以对每个连接应用 SQL。
例如,在 Spring Boot 1.5.x (Tomcat) 中使用默认的 jdbc 池:
spring.datasource.tomcat.init-s-q-l = 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;
/
【讨论】:
另一种选择是创建数据源包装器。正常创建数据源,然后创建转发除 getConnection 方法之外的所有方法的包装器。对于那些我刚刚添加 SQL 来设置架构的人。我们有多个数据源,这允许我们为每个数据源指定不同的模式。如果有人知道这是否有问题,我会喜欢 cmets。或者,如果有使用这些属性的替代方法。
【讨论】: