如何配置Oracle JDBC的serverTimezone解决ORA-01882时区错误
问题原因
你配置的useTimezone、serverTimezone是MySQL JDBC驱动的专属参数,Oracle JDBC驱动无法识别这两个配置,因此之前的URL参数配置完全不生效。
抛出ORA-01882: timezone region not found的核心原因是:Oracle JDBC驱动初始化连接时,会读取当前运行环境的默认时区,尝试和Oracle数据库内置的时区区域列表做匹配,如果JVM返回的时区ID不在Oracle的内置列表里,就会触发这个报错。
可落地的解决方法
按生效优先级排序,选其中一种即可:
- 方案1:修改JDBC连接URL,使用Oracle官方支持的时区参数,去掉无效的MySQL专属参数,示例配置:
# 请将IP、端口、服务名替换为你的实际数据库地址 spring.datasource.url=jdbc:oracle:thin:@192.168.1.1:1521:desastg?oracle.jdbc.timezoneAsRegion=false
配置oracle.jdbc.timezoneAsRegion=false后,驱动会使用时区偏移量而非区域名称做匹配,绕过时区区域找不到的问题。
- 方案2:给应用JVM添加启动参数,强制指定JVM使用Oracle可识别的标准时区ID,配置示例:
# 可根据业务需要选择UTC或者国内常用的Asia/Shanghai -Duser.timezone=Asia/Shanghai
从日志看你的服务跑在容器环境中,直接把这个参数加到JAVA启动的环境变量里即可,不需要改业务代码和配置。
- 方案3:修正Hikari连接池的配置层级,你之前的Hikari属性前缀写错导致配置未生效,正确配置如下:
spring.datasource.hikari.data-source-properties.timezoneAsRegion=false spring.jpa.database-platform=org.hibernate.dialect.Oracle10gDialect spring.jpa.properties.hibernate.jdbc.time_zone=UTC
注意:不要在Oracle JDBC的连接URL里保留
serverTimezone、useTimezone这类MySQL专属参数,没有任何作用还可能引发参数解析异常。
内容的提问来源于stack exchange,提问作者Aldo Inácio da Silva
相关产品推荐
相关产品推荐

