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

2023/08/18 编程人生 共 759 字,约 3 分钟

问题描述

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

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

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

    -v /etc/localtime:/etc/localtime
    -v /etc/timezone:/etc/timezone
    

文档信息

Search

    Table of Contents