I faced the same issue since I want to keep application tables in one schema and batch tables in a separate one (using postgres).
tablePrefix
didn't work for me either (I tried different cases - none of it solves the issue).
So finally I deciced to configure a separate DataSource for Spring Batch pointing to a batch
schema. Here is how I did it.
In application.properties file I have standard props like spring.datasource.*
which is used for the application as a primary datasource.
And props like spring.batch.datasource.*
is non-standard and is a secondary datasource used only in the code provided below.
Here is example of application.properties file:
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
Then in BatchConfiguration.java which is a part of app sources I added getBatchDataSource
method which reads spring.batch.datasource.*
properties:
@Configuration
@EnableBatchProcessing
public class BatchConfiguration {
@Bean
@ConfigurationProperties(prefix="spring.batch.datasource")
public DataSource getBatchDataSource(){
return DataSourceBuilder.create().build();
}
...
}
This makes Spring Batch to use a separate data source.
Now important thing is to setup spring.batch.datasource.*
correctly:
For Postgres 9.4 you can specify schema in the connection URL using currentSchema
parameter: jdbc:postgresql://host:port/db?currentSchema=batch
For Postgres before 9.4 you can specify schema in the connection URL using searchpath
parameter: jdbc:postgresql://host:port/db?searchpath=batch
Or you can create a separate postgres user/role for batch
schema and setup search_path
for that user: ALTER USER BATCH_DB_USER SET search_path to 'batch';
In Oracle each user has their own schema (as far as i know) and no way to set schema in the connection URL like for postgres (I may be wrong): jdbc:oracle:thin:@//host:port/sid
So you need to create a separate user for batch
schema in Oracle. Another way is to use spring.batch.datasource.validation-query=ALTER SESSION SET CURRENT_SCHEMA=batch
(I didn't try this)
So in this way Spring Batch uses a separate datasource configured to use dedicated batch
schema. Batch queries still look like select ...from batch_...
however it runs against batch
schema. And application is using regular datasource pointing to an application dedicated schema app
.
This solution was tested using Spring Boot v1.2.5.RELEASE and Postgres 9.4.1
Hope this helps.