JDBC连接Oracle报错 ORA-01882: timezone region not found

开发反馈jdbc连接oracle时遇到报错 java.sql.SQLException: ORA-00604: error occurred at recursive SQL level 1 ORA-01882: timezone region not found。并且只有这一台应用服务器有这个问题,别的都是正常的。

网上搜索发现,通常是由于:Oracle数据库与应用的时区不一致导致的。

一、 常规解决方案

查看下JVM的时区,编写一个简单的CheckTz.java

import java.util.TimeZone;
public class CheckTz {
    public static void main(String[] args) {
        System.out.println(TimeZone.getDefault());
    }
}
  • 法一:修改java运行环境配置,添加-Duser.timezone=xxx(xxx为oracle时区ID)
  • 法二:修改应用服务器时区,重新执行JVM初始化
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo 'Asia/Shanghai' >/etc/timezone

Java可以通过Timezone获取时区,但是获取的时区是JVM初始化时保存的时区,并不是操作系统所设置的时区。当修改了操作系统的时区后,JVM并不会同步更新,因此还需要重新执行JVM初始化。

二、 ORA-01882相关bug

之前还遇到一个特定类型sql触发ora-1882报错的bug,sql的特征是通过dblink查询timestamp 字面值。

详情可以参考 Bug 16731148 ORA-1882 using TIMESTAMP literals over a database link

An unexpected ORA-1882 may be raised when using TIMESTAMP literals across a database link connection if the NLS_NUMERIC_CHARACTERS setting
does not use a dot (".") as the decimal separator.

workaround

alter session set NLS_NUMERIC_CHARACTERS = ',.';
select timestamp '2012-07-24 07:00:00.00' from dual@somelink;

参考

记一次JDBC连接Oracle出现“ORA-01882: timezone region not found“_不会画画的画师的博客-CSDN博客_error occurred at recursive sql level 1 ora-01882:

数据库常见告警、报错与解决方法记录_Hehuyi_In的博客-CSDN博客_数据库告警

Doc ID 16731148.8

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hehuyi_In

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值