我现在正在使用oracle和spring jdbc,但我不想在我的sql语句中使用该模式:
示例:从SCHEMA.table
中选择*有没有办法在application.properties或application.yml中设置默认架构?
答案 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
从该帖子中,您有两种选择:
在执行语句之前执行此语句:
ALTER SESSION SET CURRENT_SCHEMA=yourSchema
为您的表/视图/等创建同义词(如果我们在谈论数据库中的大量元素,我会发现这很烦人。)
我建议使用第一个选项。从我看到的情况来看,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上为我工作。