Инициализация базы данных H2 для весеннего пакетного применения
Я недавно создал пакетное приложение Springboot с Java 8, и я хочу создать базу данных для таблиц SpringBatch только с аннотацией.
Я полагаю, мне нужно создать файл конфигурации, но я не знаю, как это сделать.
Ниже вы можете увидеть все настройки, которые я хочу воспроизвести в моей Java-программе с аннотацией:
<!-- Base de donnees H2 pour les tables Spring Batch -->
<jdbc:embedded-database id="springBatchDataSource" type="H2">
<jdbc:script location="org/springframework/batch/core/schema-drop-h2.sql" />
<jdbc:script location="org/springframework/batch/core/schema-h2.sql" />
</jdbc:embedded-database>
<!-- TransactionManager Spring Batch -->
<bean id="springBatchTransactionManager" class="org.springframework.batch.support.transaction.ResourcelessTransactionManager" />
<!-- JobRepository Spring Batch -->
<bean id="jobRepository" class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean">
<property name="dataSource" ref="springBatchDataSource" />
<property name="transactionManager" ref="springBatchTransactionManager" />
<property name="databaseType" value="H2" />
</bean>
Я добавил код ниже:
@Configuration открытый класс ConfigBatch {
@Bean(destroyMethod = "shutdown")
public EmbeddedDatabase dataSourceH2() {
return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2)
.addScript("classpath:org/springframework/batch/core/schema-drop-h2.sql")
.addScript("classpath:org/springframework/batch/core/schema-h2.sql").build();
}
@Bean
public SimpleJobLauncher jobLauncher() throws Exception {
final SimpleJobLauncher launcher = new SimpleJobLauncher();
launcher.setJobRepository(jobRepository());
return launcher;
}
@Bean
public JobRepository jobRepository() throws Exception {
final JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean();
factory.setDatabaseType(DatabaseType.H2.getProductName());
factory.setDataSource(dataSourceH2());
factory.setTransactionManager(transactionManager());
return factory.getObject();
}
@Bean
public ResourcelessTransactionManager transactionManager() {
return new ResourcelessTransactionManager();
}
}
Мой импорт "@ImportResource" генерирует ошибку, потому что в моем java-коде есть один источник данных, а в моем xml-файле - один источник данных:
Не определен квалифицирующий компонент типа [javax.sql.DataSource]: ожидается один соответствующий компонент, но найден 2:
Я просто хочу сгенерировать таблицы пакетной пружины в источнике данных H2 и запустить средство записи пакетных данных в источнике данных oracle (ресурс импорта xml).
Вы можете мне помочь? Спасибо:)
1 ответ
Поместите следующие коды в класс, помеченный @Configuration.
@Bean
public DataSource dataSource() {
EmbeddedDatabaseBuilder embeddedDatabaseBuilder = new EmbeddedDatabaseBuilder();
return embeddedDatabaseBuilder.addScript("classpath:org/springframework/batch/core/schema-drop-h2.sql")
.addScript("classpath:org/springframework/batch/core/schema-h2.sql")
.setType(EmbeddedDatabaseType.H2)
.build();
}
@Bean
public ResourcelessTransactionManager transactionManager() {
return new ResourcelessTransactionManager();
}
@Bean
public JobRepository jobRepository() throws Exception {
JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean();
factory.setDatabaseType(DatabaseType.H2.getProductName());
factory.setDataSource(dataSource());
factory.setTransactionManager(transactionManager());
return factory.getObject();
}
Настройка второго источника данных для встроенной базы данных H2 для Spring Batch Repository и использование основного dataSource
для Oracle или другого db. Определение секундыdataSource
bean и добавив его в jobRepository
было недостаточно. Вspring.batch.initialize-schema=embedded
не будет инициализировать эту базу данных, так как она попытается использовать первичный dataSource
. Следующее сработало для меня.
@Configuration
public class H2BatchRepositoryConfigurer extends DefaultBatchConfigurer {
@Autowired
@Qualifier("h2DataSource")
private DataSource dataSource;
@Autowired
private PlatformTransactionManager platformTransactionManager;
@Override
protected JobRepository createJobRepository() throws Exception {
JobRepositoryFactoryBean factoryBean = new JobRepositoryFactoryBean();
factoryBean.setDatabaseType(DatabaseType.H2.getProductName());
factoryBean.setTablePrefix("BATCH_");
factoryBean.setIsolationLevelForCreate("ISOLATION_READ_COMMITTED");
factoryBean.setDataSource(dataSource);
factoryBean.setTransactionManager(platformTransactionManager);
factoryBean.afterPropertiesSet();
return factoryBean.getObject();
}
@Override
protected JobExplorer createJobExplorer() throws Exception {
JobExplorerFactoryBean factoryBean = new JobExplorerFactoryBean();
factoryBean.setDataSource(this.dataSource);
factoryBean.setTablePrefix("BATCH_");
factoryBean.afterPropertiesSet();
return factoryBean.getObject();
}
@Bean(destroyMethod = "shutdown")
public EmbeddedDatabase dataSourceH2() {
return new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.H2)
.addScript("classpath:org/springframework/batch/core/schema-drop-h2.sql")
.addScript("classpath:org/springframework/batch/core/schema-h2.sql")
.build();
}
}
Перейдите по этой ссылке, чтобы определить h2DataSource
bean Spring Boot Настройка и использование двух источников данных
Класс конфигурации
@EnableBatchProcessing
@Import({ DataSourceConfiguration.class, OracleDbConfig.class })
public class Example BatchConfiguration extends DefaultBatchConfigurer {
@Override
@Autowired
public void setDataSource(@Qualifier("batchDataSource") DataSource dataSource) {
super.setDataSource(dataSource);
}
}
Затем создайте класс для встроенного источника данных Batch
package com.cookmedical.batch.configuration;
import javax.sql.DataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
@Configuration
public class DataSourceConfiguration {
@Primary
@Bean(name = "batchDataSource")
public DataSource batchDataSource() {
return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2).build();
}
}
база данных оракула. обновите basePackages как вашу модель и JpaRepository
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "orcaleEntityManagerFactory", transactionManagerRef = "orcaleTransactionManager", basePackages = {
"com.test.batch.orcale.repo" })
//@EntityScan( basePackages = {"com.test.batch.dao.entity"} )
public class OracleDbConfig {
@Bean(name = "dataSource")
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "orcaleEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean orcaleEntityManagerFactory(EntityManagerFactoryBuilder builder,
@Qualifier("dataSource") DataSource dataSource) {
return builder.dataSource(dataSource).packages("com.test.batch.orcale.domain").persistenceUnit("orcale")
.build();
}
@Bean(name = "orcaleTransactionManager")
public PlatformTransactionManager orcaleTransactionManager(
@Qualifier("orcaleEntityManagerFactory") EntityManagerFactory orcaleEntityManagerFactory) {
return new JpaTransactionManager(orcaleEntityManagerFactory);
}
}
package com.test.batch.orcale.repo;
import org.springframework.data.jpa.repository.JpaRepository;
import com.test.batch.orcale.domain.CustomerView;
public interface ICustomerViewRepository extends JpaRepository<CustomerView, Long>{
CustomerView findByCustomerNbr(String customerNbr);
}
application.properties файл. Нет необходимости в записи для источника данных h2.
spring.datasource.jdbcUrl=jdbc:oracle:thin:@o:1521/
spring.datasource.username=**
spring.datasource.password=*