Spring 在 SCDF 上执行时批量 Hibernate 配置错误
Spring Batch Hibernate configuration error when execute on SCDF
问题:无法使用 CommandLineJob运行ner 执行 spring 批处理作业,其中应用程序定义了自己的数据源和 Hibernate 配置。
错误消息(提取)
DatabaseLookup org.springframework.boot.autoconfigure.orm.jpa.DatabaseLookup getDatabase org.springframework.jdbc.support.MetaDataAccessException: 无法获取用于提取元数据的连接;嵌套异常是 org.springframework.jdbc.CannotGetJdbcConnectionException:无法获得 JDBC 连接;嵌套异常是 org.apache.commons.dbcp.SQLNestedException:无法创建 PoolableConnectionFactory
...
Caused by: org.hibernate.HibernateException: 当 'hibernate.dialect' 未设置
时,对 DialectResolutionInfo 的访问不能为空
批处理作业:
- SCDF 运行 使用从 spring 网站下载的 docker-compose.yml。
- /config 下的一些属性文件,内置于 jar 中,包括一个定义 "hibernate.dialect=org.hibernate.dialect.MySQLDialect" 的 Hibernate 配置文件
- 应用程序使用以下属性定义自己的数据源
qre.data.driverClassName=org.mariadb.jdbc.Driver
qre.data.url=jdbc:mysql://127.0.0.1:3306/dataflow
qre.data.username=root
qre.data.password=rootpw
- 一个 XML 配置,其中包含导入这些属性的占位符定义
jar文件使用spring-boot-maven-plugin构建,定义org.springframework.batch.core.launch.support.CommandLineJobRunner为mainClass
org.springframework.boot
spring-boot-maven-plugin
a.b.c.MyCommandLineJobRunner
MyCommandLineJob运行ner 扩展 Spring CommandLineJob运行ner 并将作业名称和配置作为 name/value 对
传递
job.name=我的工作
运行 jar 在本地成功 "java -jar application.jar job.name=MYJOB"
- 在 SCDF 上注册应用程序并创建任务。 运行 带有参数的任务 "job.name=MYJOB"
任务执行失败,错误如上
试图搜索 SCDF 参考指南,但找不到任何有用的信息。
欢迎任何帮助。
我不确定为什么您的应用程序试图覆盖休眠方言 属性,因为批处理应用程序仍然需要使用 SCDF 的数据源。您可以使用 属性 spring.jpa.properties.hibernate.dialect
覆盖 SCDF 服务器的休眠方言。您可以在文档中查看其中一些示例 here。
对配置进行一些更改后,我认为 JDBC url 配置不正确。
将其更改为与 docker-compose.yml、
中相同的值
- SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/dataflow
- SPRING_DATASOURCE_DRIVER_CLASS_NAME=org.mariadb.jdbc.Driver
作业可以 运行 成功。
问题:无法使用 CommandLineJob运行ner 执行 spring 批处理作业,其中应用程序定义了自己的数据源和 Hibernate 配置。
错误消息(提取) DatabaseLookup org.springframework.boot.autoconfigure.orm.jpa.DatabaseLookup getDatabase org.springframework.jdbc.support.MetaDataAccessException: 无法获取用于提取元数据的连接;嵌套异常是 org.springframework.jdbc.CannotGetJdbcConnectionException:无法获得 JDBC 连接;嵌套异常是 org.apache.commons.dbcp.SQLNestedException:无法创建 PoolableConnectionFactory ... Caused by: org.hibernate.HibernateException: 当 'hibernate.dialect' 未设置
时,对 DialectResolutionInfo 的访问不能为空批处理作业: - SCDF 运行 使用从 spring 网站下载的 docker-compose.yml。 - /config 下的一些属性文件,内置于 jar 中,包括一个定义 "hibernate.dialect=org.hibernate.dialect.MySQLDialect" 的 Hibernate 配置文件 - 应用程序使用以下属性定义自己的数据源
qre.data.driverClassName=org.mariadb.jdbc.Driver
qre.data.url=jdbc:mysql://127.0.0.1:3306/dataflow
qre.data.username=root
qre.data.password=rootpw
- 一个 XML 配置,其中包含导入这些属性的占位符定义
jar文件使用spring-boot-maven-plugin构建,定义org.springframework.batch.core.launch.support.CommandLineJobRunner为mainClass
org.springframework.boot spring-boot-maven-plugin a.b.c.MyCommandLineJobRunner
MyCommandLineJob运行ner 扩展 Spring CommandLineJob运行ner 并将作业名称和配置作为 name/value 对
传递job.name=我的工作
运行 jar 在本地成功 "java -jar application.jar job.name=MYJOB"
- 在 SCDF 上注册应用程序并创建任务。 运行 带有参数的任务 "job.name=MYJOB" 任务执行失败,错误如上
试图搜索 SCDF 参考指南,但找不到任何有用的信息。 欢迎任何帮助。
我不确定为什么您的应用程序试图覆盖休眠方言 属性,因为批处理应用程序仍然需要使用 SCDF 的数据源。您可以使用 属性 spring.jpa.properties.hibernate.dialect
覆盖 SCDF 服务器的休眠方言。您可以在文档中查看其中一些示例 here。
对配置进行一些更改后,我认为 JDBC url 配置不正确。 将其更改为与 docker-compose.yml、
中相同的值- SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/dataflow
- SPRING_DATASOURCE_DRIVER_CLASS_NAME=org.mariadb.jdbc.Driver
作业可以 运行 成功。