从WL 12.1.2升级到带有时间戳的WL 12.1.3应用程序开始存储日期。
所有以前的版本存储日期并自动截断时间,但升级后它还会保存打破功能的时间戳。
oracle数据库的问题重现。列在数据库中具有日期类型。 我尝试将ojdbc驱动程序从WLS 12.1.2替换为WLS 12.1.3并且它没有效果(替换oracle_common / modules文件夹中的jar文件)。
为原始jdbc连接以及带有注释的sql statetments和EJB实体重现了问题。
有人可以告诉我这里有什么问题吗?
您可以在您看到的时间戳上发布几行,并指出您想要的内容吗?您是在谈论清单文件,管理控制台中列出的部署,数据库条目还是日志文件? - 我在数据库中看到它执行选择查询并且应用程序行为已更改。
因此,应用程序会保存日期并期望它将保存为21/05/2015 00:00:00(时间被截断)。升级后,它还将时间存储为21/05/2015 05:31:23。某些功能不期望它并且在选择期间不执行截断源日期并且它会产生麻烦。
我执行一些调查并使用源代码反编译,似乎找到了根本原因。 当使用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字节的区别是显而易见的。
答案 0 :(得分:0)
所以问题由司机更换解决了。
根本原因是我在上面发布的oracle驱动程序12+版本中更改了setDate方法。
解决问题也不明显。要替换ojdbc6.jar,您需要: