java应用连接docker内的oracle时报ORA-01882错误

问题描述

数据库升级,用docker容器安装oracle11g数据库,应用连接的时候报ORA-01882错误

1
2
3
4
5
6
java.sql.SQLException: ORA-00604: error occurred at recursive SQL level 1
ORA-01882: timezone region not found

at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:509)
at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:456)
at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:451)

环境:

  • jdk : openjdk8
  • oracle: 11g

解决

问题本质上是java应用程序启动时, 找不到本地系统的时区环境变量导致。 我们只有把时区环境变量配置上就可以了。

解决办法有二:

  1. java应用程序启动时增加环境变量配置
1
-Duser.timezone=xxx(xxx为oracle时区ID)
  1. 直接修改服务器的系统环境变量(更彻底)
1
2
3
4
# 时间更新为东八区时间
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 配置时区为东八区。 Java可以通过Timezone获取时区的,修改完重启服务即可。
echo 'Asia/Shanghai' >/etc/timezone

如果是docker的话,将宿主机改为上述配置后,docker容器启动(run)增加挂载配置就可以了

1
2
-v /etc/localtime:/etc/localtime
-v /etc/timezone:/etc/timezone

java应用连接docker内的oracle时报ORA-01882错误
https://www.hancher.top/2023/08/18/exception-java-oracle-docker-timezone-not-find/
作者
寒澈
发布于
2023年8月18日
许可协议