Spring Boot Batch ResourcelessTransactionManager DataSourceProperties$DataSourceBeanCreationExceptio
Posted
技术标签:
【中文标题】Spring Boot Batch ResourcelessTransactionManager DataSourceProperties$DataSourceBeanCreationException【英文标题】: 【发布时间】:2017-01-14 13:13:12 【问题描述】:我正在尝试使用 Java 配置设置一个使用 ResourcelessTransactionManager
事务管理器的 Spring Boot 批处理项目,但我没有运气。
我尝试这样做的原因是我不希望任何状态持续存在,如果我不希望它开始,我宁愿不要用 hsqldb 浪费内存。我有一个没有使用 Spring Boot 的现有 Spring Batch 项目,它没有持久性,也没有 hsqldb。
我使用此sample project 作为基础(但删除了 hsqldb),并使用此other answer 作为参考,但我不断收到此异常:
Caused by: org.springframework.boot.autoconfigure.jdbc.DataSourceProperties$DataSourceBeanCreationException: Cannot determine embedded database driver class for database type NONE. If you want an embedded database please put a supported one on the classpath. If you have database settings to be loaded from a particular profile you may need to active it (no profiles are currently active).
at org.springframework.boot.autoconfigure.jdbc.DataSourceProperties.determineDriverClassName(DataSourceProperties.java:218) ~[spring-boot-autoconfigure-1.4.0.RELEASE.jar:1.4.0.RELEASE]
at org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration.createDataSource(DataSourceConfiguration.java:42) ~[spring-boot-autoconfigure-1.4.0.RELEASE.jar:1.4.0.RELEASE]
at org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration$Tomcat.dataSource(DataSourceConfiguration.java:55) ~[spring-boot-autoconfigure-1.4.0.RELEASE.jar:1.4.0.RELEASE]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_73]
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_73]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_73]
at java.lang.reflect.Method.invoke(Unknown Source) ~[na:1.8.0_73]
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE]
... 56 common frames omitted
这是我修改的:
@SpringBootApplication
@EnableBatchProcessing
@Configuration
public class SampleBatchApplication
@Autowired
private JobBuilderFactory jobs;
@Autowired
private StepBuilderFactory steps;
@Bean
protected Tasklet tasklet()
return new Tasklet()
@Override
public RepeatStatus execute(StepContribution contribution,
ChunkContext context)
return RepeatStatus.FINISHED;
;
@Bean
public Job job() throws Exception
return this.jobs.get("job").start(step1()).build();
@Bean
protected Step step1() throws Exception
return this.steps.get("step1").tasklet(tasklet()).build();
public static void main(String[] args) throws Exception
// System.exit is common for Batch applications since the exit code can be used to
// drive a workflow
System.exit(SpringApplication
.exit(SpringApplication.run(SampleBatchApplication.class, args)));
@Bean
ResourcelessTransactionManager transactionManager()
return new ResourcelessTransactionManager();
@Bean
public JobRepository getJobRepo() throws Exception
return new MapJobRepositoryFactoryBean(transactionManager()).getObject();
我需要做什么才能让它使用ResourcelessTransactionManager
?
编辑:增加了我希望 ResourcelessTransactionManager 工作的原因。
【问题讨论】:
【参考方案1】:以下是一些用于设置数据源的基本 Spring Boot 属性。通过查看驱动程序类,引导可以推断您的数据库类型并可以自动创建DataSource
bean。
spring.datasource.driver-class-name
spring.datasource.url
spring.datasource.username
spring.datasource.password
spring.datasource.tomcat.max-active
spring.datasource.tomcat.initialSize
spring.datasource.tomcat.maxIdle
最后三个属性用于在容器中设置连接池。
缺少显式 DataSource
信息,并且类路径中未提供内存数据库。
通过在 application.properties 中显式提供条目或在类路径中包含内存数据库(H2、HSQL 等)来解决问题。
只要您不使用EnableAutoConfiguration
,您的配置看起来就可以不使用任何数据源(即如果您已配置ResourcelessTransactionManager
和MapJobRepository
),但您的堆栈跟踪表明使用带有EnableAutoConfiguration
的引导.
我猜,不允许选择性禁用数据源,see question
编辑:我能够通过添加@SpringBootApplication(exclude=DataSource.class,DataSourceAutoConfiguration.class)
来修复您的代码中的错误
日志转储这个 - 在 bean 创建过程之后,
排除:
org.apache.tomcat.jdbc.pool.DataSource
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
【讨论】:
我将问题更新为更清晰一点,我不想要持久性,你知道如何启用它吗? 在评论中,您说 我们在没有数据库的情况下以非 spring-boot 方式运行 spring-batch ,但是您的堆栈跟踪表明启动包,@987654331 @ 。我错过了什么吗? 抱歉,是的,我的意思是我已经有spring-batch
在运行没有弹簧启动和持久性,但我想知道如何与 spring-boot
一起工作。堆栈跟踪来自我尝试使其与 Spring Boot 一起使用。
我已经编辑了我的答案,希望对你有帮助!!我用 Spring Boot 运行了你的代码。
太好了,谢谢,解决了!原来我不需要指定ResourcelessTransactionManager
,我猜是因为我没有像你说的那样专门使用任何数据源。【参考方案2】:
您的问题似乎是您的配置中没有可用的数据源。 Spring Batch 需要数据库,因此保持其状态。
如果你在类路径上有一些,Spring Boot 可以自动在内存数据库中配置。您所指的示例应用程序在此处的 POM 中包含 HSQL:https://github.com/spring-projects/spring-boot/blob/v1.4.0.RELEASE/spring-boot-samples/spring-boot-sample-batch/pom.xml#L26
因此,要解决您的问题,请定义对数据库的访问权限。
【讨论】:
我很确定您可以将 spring 批处理配置为不保留其状态。我很确定这就是ResourcelessTransactionManager
的重点,对吧?我们在没有数据库的情况下以非 spring-boot 方式运行 spring-batch,它没有持久化任何状态,也没有抱怨。以上是关于Spring Boot Batch ResourcelessTransactionManager DataSourceProperties$DataSourceBeanCreationExceptio的主要内容,如果未能解决你的问题,请参考以下文章
spring-boot-starter-jta-atomikos 和 spring-boot-starter-batch
Spring boot spring.batch.job.enabled=false 无法识别
Spring boot spring.batch.job.enabled=false 无法识别
Maven 打包“JAR”不适用于 spring-boot-starter-batch