You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity Catalog中Java SQL Driver Manager无法正常工作问题排查

Unity Catalog环境下调用DriverManager.getConnection报错的解决方法

问题说明

普通Databricks工作区能正常运行的JDBC代码,放到Unity Catalog环境下执行时会抛出权限异常,提示DriverManager.getConnection方法不在白名单内,拆分参数调用后问题仍存在。

原单参数代码

driver_manager = spark._sc._gateway.jvm.java.sql.DriverManager
con = driver_manager.getConnection(connection_string)

statement = con.prepareCall(query)
statement.execute()

statement.close()
con.close()

拆分参数后的代码

sqlsUrl = f"jdbc:sqlserver://{host}:{port};database={dbname}"
username = 'test'
password = 'test'
con = jvm.java.sql.DriverManager.getConnection(sqlsUrl, username,password)

错误信息

py4j.security.Py4JSecurityException: Method public static java.sql.Connection java.sql.DriverManager.getConnection(java.lang.String) throws java.sql.SQLException is not whitelisted on class class java.sql.DriverManager

原因

Unity Catalog环境对Py4J调用有更严格的安全管控,java.sql.DriverManager的静态方法不在允许直接调用的白名单内,这是UC为了规范连接方式、避免绕过Spark封装而设置的安全策略。

解决方案

放弃直接调用DriverManager,改用Spark原生封装的JDBC相关API,以下是两种可行方式:

方式1:用Spark SQL读写数据(推荐)

如果只是执行查询或数据读写操作,直接使用Spark的read/write API即可,完全符合UC安全规范:

# 读取数据示例
df = spark.read \
    .format("jdbc") \
    .option("url", sqlsUrl) \
    .option("dbtable", "目标表名") \
    .option("user", username) \
    .option("password", password) \
    .load()

# 写入数据示例
df.write \
    .format("jdbc") \
    .option("url", sqlsUrl) \
    .option("dbtable", "目标表名") \
    .option("user", username) \
    .option("password", password) \
    .mode("append") \
    .save()

方式2:通过Spark JdbcUtils获取连接(适用于存储过程等自定义操作)

如果需要执行存储过程或自定义JDBC逻辑,可以借助Spark官方提供的JdbcUtils工具类获取连接,该类在UC环境下是合规的:

jvm = spark._sc._gateway.jvm
jdbc_utils = jvm.org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils

# 构建连接属性
props = jvm.java.util.Properties()
props.setProperty("user", username)
props.setProperty("password", password)

# 获取合规连接
con = jdbc_utils.createConnection(sqlsUrl, props)

# 执行自定义操作(例如存储过程)
statement = con.prepareCall(query)
statement.execute()

# 关闭资源
statement.close()
con.close()

注意事项

  • 禁止直接调用Java原生DriverManager,UC安全策略会持续拦截此类操作
  • 优先使用Spark封装的JDBC API,既能符合安全要求,还能利用Spark的连接池和优化机制
  • 若需使用特殊JDBC驱动,确保已在Databricks集群中正确安装对应jar包

内容的提问来源于stack exchange,提问作者LaTreb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 23:40:01