我的应用程序中有一个连接到Oracle数据库的数据源。是否可以通过此数据源访问包含Spring-batch元数据表的另一个模式?此数据源的用户具有访问其他架构的所有权限。
我已经尝试过JobRepository的"tablePrefix“属性,比如"Schema.batch_”。但它不起作用。简单地说,我搜索告诉Spring-batch访问元数据表的方法,比如"select ....from Schema.batch_..“不是"select ...from batch_...“。
发布于 2015-10-30 07:31:51
我也遇到过同样的问题,因为我希望将应用程序表保存在一个模式中,而将批量表保存在一个单独的模式中(使用postgres)。
tablePrefix也不适用于我(我尝试过不同的情况--都不能解决问题)。
因此,最后我决定为Spring Batch配置一个指向batch模式的单独DataSource。这就是我是如何做到的。
在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中,我添加了读取spring.batch.datasource.*属性的getBatchDataSource方法:
@Configuration
@EnableBatchProcessing
public class BatchConfiguration {
@Bean
@ConfigurationProperties(prefix="spring.batch.datasource")
public DataSource getBatchDataSource(){
return DataSourceBuilder.create().build();
}
...
}这使得Spring Batch可以使用单独的数据源。
现在重要的是正确设置spring.batch.datasource.*:
对于Postgres9.4,您可以使用currentSchema参数在连接
中指定模式:
jdbc:postgresql://host:port/db?currentSchema=batch
对于Postgres9.4之前的版本,您可以使用searchpath参数jdbc:postgresql://host:port/db?searchpath=batch在连接URL中指定模式
或者,您可以为batch模式创建单独的postgres用户/角色,并为该用户设置search_path:ALTER USER BATCH_DB_USER SET search_path to 'batch';
在Oracle中,每个用户都有自己的模式(据我所知),并且没有办法像postgres那样在连接URL中设置模式(我可能是错的):jdbc:oracle:thin:@//host:port/sid
因此您需要为Oracle中batch模式创建一个单独的用户。另一种方法是使用spring.batch.datasource.validation-query=ALTER SESSION SET CURRENT_SCHEMA=batch (我没有尝试过这个)
因此,Spring Batch通过这种方式使用一个单独的数据源,该数据源被配置为使用专用的batch模式。批处理查询看起来仍然像select ...from batch_...,但是它是针对batch模式运行的。并且应用程序正在使用指向应用程序专用架构app的常规数据源。
此解决方案使用Spring Boot v1.2.5版本和Postgres 9.4.1进行了测试
希望这能有所帮助。
发布于 2020-05-28 13:39:48
因为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.sqlhttps://stackoverflow.com/questions/30994838
复制相似问题