使用 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,您有两个选择:
在执行你的语句之前先执行这条语句:
ALTER SESSION SET CURRENT_SCHEMA=yourSchema
为您的 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 为我工作。
我现在正在使用 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,您有两个选择:
在执行你的语句之前先执行这条语句:
ALTER SESSION SET CURRENT_SCHEMA=yourSchema
为您的 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 为我工作。