Java17 Spring Boot用JpaRepository连Azure Databricks遇JDBC报错
问题场景
在Java 17的Spring Boot应用中,连接Azure Databricks并使用JpaRepository调用方法时,触发如下错误:
CannotCreateTransactionException: Could not open JPA EntityManager for transaction
...
org.hibernate.TransactionException: JDBC begin transaction failed
...
java.sql.SQLFeatureNotSupportedException: [Databricks]JDBC Driver does not support this optional feature.
解决方案
1. 调整JPA与Hibernate的事务配置
由于Databricks JDBC驱动不支持传统JDBC事务,需要修改Spring配置禁用事务自动管理:
application.properties配置:
# 禁用Hibernate自动DDL(根据实际需求调整,若不需要可设为none) spring.jpa.hibernate.ddl-auto=none # 开启自动提交,避免Hibernate尝试开启事务 spring.jpa.properties.hibernate.connection.autocommit=true # 禁用JTA事务平台 spring.jpa.properties.hibernate.transaction.jta.platform=org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform # 取消默认事务超时设置 spring.transaction.default-timeout=0
application.yml配置:
spring: jpa: hibernate: ddl-auto: none properties: hibernate: connection: autocommit: true transaction: jta: platform: org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform transaction: default-timeout: 0
2. 移除或调整事务注解
如果你的Repository接口或方法上标注了@Transactional,需要移除该注解,或者设置事务传播行为为不支持事务:
import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; @Transactional(propagation = Propagation.NOT_SUPPORTED) public interface YourRepository extends JpaRepository<YourEntity, Long> { // 自定义方法 }
3. 确保使用兼容的Databricks JDBC驱动
在pom.xml中引入最新稳定版的Databricks JDBC驱动:
<dependency> <groupId>com.databricks</groupId> <artifactId>databricks-jdbc</artifactId> <version>2.6.25</version> <!-- 替换为最新稳定版本 --> </dependency>
4. 验证Databricks连接URL格式
确保数据源URL符合Databricks官方规范,示例:
spring.datasource.url=jdbc:databricks://<你的Databricks实例地址>:443/default;transportMode=http;ssl=1;httpPath=<SQL仓库的HTTP路径>;AuthMech=3;UID=token;PWD=<你的Databricks访问令牌>
问题原因
Azure Databricks的SQL引擎(尤其是Serverless SQL仓库)基于Spark SQL设计,本身不支持传统的JDBC事务机制。当Hibernate尝试自动开启JDBC事务时,Databricks JDBC驱动会直接抛出"不支持该特性"的异常,导致无法创建EntityManager事务。
内容的提问来源于stack exchange,提问作者LDK

