Q: 高版本 DataGrip 无法使用 Phoenix 驱动
# 一、问题复现
在 DataGrip 中配置 Phoenix 数据源,通过 Thick 客户端 方式连接 HBase(Zookeeper 集群地址),往往会出现如下报错:
[08004][103] ERROR 103 (08004): Unable to establish connection. 'void sun.misc.Unsafe.putLong(java.lang.Object, int, long)'.
1
对应界面如下图所示:
关键原因
这是 Phoenix 驱动与高版本 JDK 不兼容 导致的。
DataGrip 自带运行时 JDK 较新,而 Phoenix 驱动仍在依赖过时的 sun.misc.Unsafe
方法。
# 二、常见尝试与局限
更换 DataGrip 的运行时 JDK 在理论上,切换到 JDK8 可以解决兼容性。但实际情况是:
- DataGrip 自身有 最低版本限制,无法回退到过低 JDK;
- 即便切换,重启可能直接导致 DataGrip 启动失败。
不推荐
已经过实际验证,此路基本行不通。建议避免继续在 JDK 切换上浪费时间。
替换 Phoenix 驱动 jar 这是目前最直接、稳定的方式。通过重新编译 Phoenix 源码,生成与高版本 JDK 兼容的驱动 jar 包。
# 三、解决方案:自编译 Phoenix 驱动
为了避免大家重复踩坑,我们已经将 Phoenix 源码重新编译,并提供了兼容版本 jar 包。
👉 编译方法与下载说明可参考另一篇文章: Phoenix - JDK17 制作&下载
你可以选择:
- 方式一:自行按照文章说明编译;
- 方式二:直接使用我们提供的兼容 jar。
完成后,只需在 DataGrip 中手动替换 Phoenix 驱动 jar 即可。
# 四、成功验证
替换后,重新配置 Phoenix 数据源,连接即可正常建立。如下图所示:
图 1:添加数据源驱动
图 2:连接测试成功,状态显示正常
图 3:表结构与数据浏览界面正常显示,兼容性问题彻底解决
总结
- 症状:
sun.misc.Unsafe.putLong
报错 - 根因:Phoenix 驱动与高版本 JDK 不兼容
- 解法:替换为重新编译的 Phoenix 驱动 jar
- 01
- [/metrics/metadata] — 元数据查询和使用 GET09-12
- 02
- [/metrics/metadata] — 请求完整链路解读09-12
- 03
- [/metrics/metadata] — 缓存数据装载 Phoenix09-12