Weblogic 12.1.3 存储日期问题

Weblogic 12.1.3 issue with storing date

从 WL 12.1.2 升级到 WL 12.1.3 应用程序开始存储带有时间戳的日期。

因此所有以前的版本都会存储日期并自动截断时间,但升级后它还会保存破坏功能的时间戳。

Oracle 数据库的问题重现。列在数据库中具有日期类型。 我尝试将 ojdbc 驱动程序从 WLS 12.1.2 替换为 WLS 12.1.3,但没有效果(替换 oracle_common/modules 文件夹中的 jar 文件)。

针对原始 jdbc 连接和 sql 语句以及带有注释的 EJB 实体重现了问题。

有谁能告诉我这里有什么问题吗?

Can you post a couple lines on the timestamps you are seeing and point out what you want? Are you talking about manifest files, the deployments listed in the admin console, database entries, or log files? – I see it in database that perform select queries and application behaviour is changed.

因此应用程序保存日期并期望将其保存为 21/05/2015 00:00:00(时间被截断)。升级后,它还将时间存储为 21/05/2015 05:31:23 例如。某些功能不需要它,并且在 select 期间不执行源日期截断,这会造成麻烦。

我进行了一些调查并使用了源代码反编译,似乎找到了根本原因。 当使用 ojdbc 11.2 驱动程序 (WLS 12.1.2) 时,它使用以下代码来初始化日期:

public static byte[] toBytes(Date var0, Calendar var1) {
    if(var0 == null) {
        return null;
    } else {
        if(var1 == null) {
            var1 = Calendar.getInstance();
        }

        var1.clear();
        var1.setTime(var0);
        byte[] var2 = new byte[7];
        int var3 = var1.get(1);
        if(var1.get(0) == 0) {
            var3 = -var3;
        }

        if(var3 >= -4712 && var3 <= 9999) {
            var2[0] = (byte)(var3 / 100 + 100);
            var2[1] = (byte)(var3 % 100 + 100);
            var2[2] = (byte)(var1.get(2) + 1);
            var2[3] = (byte)var1.get(5);
            var2[4] = 1;
            var2[5] = 1;
            var2[6] = 1;
            return var2;
        } else {
            throw new IllegalArgumentException("Invalid year value");
        }
    }
}

对于 WLS 12.1.3 中使用的 ojdbc 驱动程序 12.1,我们有以下代码:

public static byte[] toBytes(Date var0, Calendar var1) {
    if(var0 == null) {
        return null;
    } else {
        Calendar var2;
        if(var1 == null) {
            var2 = Calendar.getInstance();
        } else {
            var2 = Calendar.getInstance(var1.getTimeZone());
        }

        var2.clear();
        var2.setTime(var0);
        byte[] var3 = new byte[7];
        int var4 = TIMESTAMP.getOracleYear(var2);
        var3[0] = (byte)(var4 / 100 + 100);
        var3[1] = (byte)(var4 % 100 + 100);
        var3[2] = (byte)(var2.get(2) + 1);
        var3[3] = (byte)var2.get(5);
        var3[4] = (byte)(var2.get(11) + 1);
        var3[5] = (byte)(var2.get(12) + 1);
        var3[6] = (byte)(var2.get(13) + 1);
        return var3;
    }
}

因此设置 4,5 和 6 字节的区别很明显。

所以问题通过更换驱动程序解决了。

根本原因是我在上面发布的 oracle 驱动程序 12+ 版本中更改了 setDate 方法。

解决问题还不是很明显。要替换 ojdbc6.jar,您需要:

  1. 将此 jar 添加到类路径或替换现有 oracle_common 文件夹中的 ojdbc6.jar。
  2. 从 weblogic 中的 oracle_common 中删除 ojdbc7.jar,因为它默认使用并在 weblogic 清单文件中声明 - 所以没有其他方法可以处理它。