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
相关产品推荐
相关产品推荐

