我有一个数据源连接到我的应用程序中的Oracle数据库。是否可以通过此数据源访问包含Spring批处理元数据表的另一个模式?此数据源的用户拥有访问其他模式的所有权限。
我已经尝试过JobRepository的“tablePrefix”属性,例如“Schema.batch_”。但它不起作用。简而言之,我搜索告诉Spring-batch访问元数据表的方法,例如“select .... from Schema.batch_ ..”而不是“select ... from batch _...”。
答案 0 :(得分:8)
我遇到了同样的问题,因为我想将一个架构和批处理表中的应用程序表保存在一个单独的表中(使用postgres)。
tablePrefix
对我来说也不起作用(我尝试了不同的案例 - 没有一个能解决问题)。
所以最后我决定为Spring Batch配置一个单独的DataSource指向batch
模式。我就是这样做的。
在 application.properties 文件中,我有像spring.datasource.*
这样的标准道具,用于将应用程序用作主数据源。
像spring.batch.datasource.*
这样的道具是非标准道具,是仅在下面提供的代码中使用的辅助数据源。
以下是 application.properties 文件的示例:
spring.datasource.url=APP_DB_CONNECTION_URL
spring.datasource.username=APP_DB_USER
spring.datasource.password=APP_DB_PASS
spring.batch.datasource.url=BATCH_DB_CONNECTION_URL
spring.batch.datasource.username=BATCH_DB_USER
spring.batch.datasource.password=BATCH_DB_PASS
然后在 BatchConfiguration.java 这是应用来源的一部分,我添加了getBatchDataSource
方法来读取spring.batch.datasource.*
属性:
@Configuration
@EnableBatchProcessing
public class BatchConfiguration {
@Bean
@ConfigurationProperties(prefix="spring.batch.datasource")
public DataSource getBatchDataSource(){
return DataSourceBuilder.create().build();
}
...
}
这使得Spring Batch使用单独的数据源。
现在重要的是正确设置spring.batch.datasource.*
:
对于Postgres 9.4,您可以使用
currentSchema
参数在连接网址中指定架构:jdbc:postgresql://host:port/db?currentSchema=batch
对于9.4之前的Postgres,您可以使用
searchpath
参数在连接网址中指定架构:jdbc:postgresql://host:port/db?searchpath=batch
或者,您可以为
batch
架构创建单独的postgres用户/角色,并为该用户设置search_path
:ALTER USER BATCH_DB_USER SET search_path to 'batch';
在Oracle中,每个用户都有自己的架构(据我所知),无法在连接URL中设置架构,如postgres(我可能错了):
jdbc:oracle:thin:@//host:port/sid
因此,您需要在Oracle中为
batch
架构创建单独的用户。另一种方法是使用spring.batch.datasource.validation-query=ALTER SESSION SET CURRENT_SCHEMA=batch
(我没试过这个)
因此,Spring Bath使用单独的数据源配置为使用专用的batch
模式。批处理查询仍然看起来像select ...from batch_...
但是它针对batch
架构运行。应用程序使用指向应用程序专用模式app
的常规数据源。
使用Spring Boot v1.2.5.RELEASE和Postgres 9.4.1
测试了该解决方案希望这有帮助。
答案 1 :(得分:0)
由于spring.batch.table-prefix=<yourschema>.batch_
对我不起作用,并且我无法立即配置第二个数据源,因此我研究了Spring Batch完成的实际表生成。
生成表的sql-Script是静态的(至少在版本4.2.2和Postgresql中)。
因此,难怪spring.batch.table-prefix
不起作用。至少就我而言,因为数据库中还不存在这些表。
要修复此问题,我将schema-postgresql.sql
复制到了我的资源文件夹中,并根据需要对其进行了修改(创建架构并明确引用它)。
CREATE SCHEMA SPRING_BATCH;
CREATE TABLE SPRING_BATCH.BATCH_JOB_INSTANCE (
JOB_INSTANCE_ID BIGINT NOT NULL PRIMARY KEY ,
-- and so on
在我的application.properties
中,我添加了:
spring.batch.initialize-schema=always
spring.batch.table-prefix=SPRING_BATCH.BATCH_
spring.batch.schema=classpath:db/create_spring_batch_tables.sql