Oralce TIMESTAMP 类型转换为 JSON 失败 | oracle.sql.TIMESTAMP 问题

2024-04-12 19:12

本文主要是介绍Oralce TIMESTAMP 类型转换为 JSON 失败 | oracle.sql.TIMESTAMP 问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题场景

使用 springboot 做的某业务查询,使用的数据库是 Oracle 数据库,数据库中的字段 TRANS_TIME 使用的数据库字段类型是 TIMESTAMP。程序中在 MyBatis 的 XML 中编写了常规的 select 查询,<select id="queryData" resultType="java.util.Map">,这里因为实际业务需求原因没有将查询结果自动转换为 Java 对象,而是直接放到 Map 中返回给前端。

本意是希望前端能获取到查询的数据集合渲染,实际上发现这个 TIMESTAMP 类型的字段没有正常在 json 中显示时间。通过分析发现 map 中的 TRANS_TIME 字段对应的类型是 oracle.sql.TIMESTAMP,而不是 java.sql.Timestamp 类型(如果数据库字段是 DATE 类型则没有问题)。进一步得出结论 oracle.sql.TIMESTAMP 序列化和反序列化有问题,所以不能正常被 spring 的 MessageConvert 转换为 json。

鉴于上述问题和结论,查阅了 oracle 官方文档,获得如下原文说明:

Footnote 1 ResultSet.getObject returns java.sql.Timestamp only if the oracle.jdbc.J2EE13Compliant connection property is set to TRUE, else the method returns oracle.sql.TIMESTAMP.Note:The ResultSet.getObject method returns java.sql.Timestamp for the TIMESTAMP SQL type, only when the connection property oracle.jdbc.J2EE13Compliant is set to TRUE. This property has to be set when the connection is obtained. If this connection property is not set or if it is set after the connection is obtained, then the ResultSet.getObject method returns oracle.sql.TIMESTAMP for the TIMESTAMP SQL type.
The oracle.jdbc.J2EE13Compliant connection property can also be set without changing the code in the following ways:Including the ojdbc5dms.jar or ojdbc6dms.jar files in the CLASSPATH. These files set oracle.jdbc.J2EE13Compliant to TRUE by default. These are specific to the Oracle Application Server release and are not available as part of the general JDBC release. They are located in $ORACLE_HOME/jdbc/lib.Setting the system property by calling the java command with the flag -Doracle.jdbc.J2EE13Compliant=true. For example,java -Doracle.jdbc.J2EE13Compliant=true ...
When the J2EE13Compliant is set to TRUE the action is as in Table B-3 of the JDBC specification.

文中描述大概说的意思就是,oracle 驱动类默认使用 oracle.sql.TIMESTAMP 类型,如果希望使用 J2EE1.3及以后的标准,需要通过设置 JVM 参数 -Doracle.jdbc.J2EE13Compliant=true 来明确让它使用 java.sql.Timestamp 类型。

具体两种方式的示例就是:
1、启动 java 服务的时候通过 -Doracle.jdbc.J2EE13Compliant=true 设定。
2、在 java 程序的入口处硬编码使用 System.setProperty("oracle.jdbc.J2EE13Compliant", "true") 来设定。

这两种方式,做了测试验证,都有效,可以按需选择其一使用。

有兴趣的话,可以进一步查看 oracle 驱动源码,在 oracle.jdbc.driver.GeneratedPhysicalConnection 类的 readConnectionProperties 方法、oracle.jdbc.driver.TimestampAccessorgetObject 方法、oracle.jdbc.driver.DateTimeCommonAccessorgetTimestampgetTIMESTAMP 方法中,能看到关于该配置属性和对应时间类型的处理逻辑。

总结

通过设置属性 oracle.jdbc.J2EE13Compliant=true,可以使 oracle 的 timestamp 类型字段以 java.sql.Timestamp 类型返回,不设置时默认 false,返回 oracle.sql.TIMESTAMP,可能会导致序列化时类型转换失败等问题。


(END)

这篇关于Oralce TIMESTAMP 类型转换为 JSON 失败 | oracle.sql.TIMESTAMP 问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/897994

相关文章

Oracle迁移PostgreSQL隐式类型转换配置指南

《Oracle迁移PostgreSQL隐式类型转换配置指南》Oracle迁移PostgreSQL时因类型差异易引发错误,需通过显式/隐式类型转换、转换关系管理及冲突处理解决,并配合验证测试确保数据一致... 目录一、问题背景二、解决方案1. 显式类型转换2. 隐式转换配置三、维护操作1. 转换关系管理2.

Oracle查询表结构建表语句索引等方式

《Oracle查询表结构建表语句索引等方式》使用USER_TAB_COLUMNS查询表结构可避免系统隐藏字段(如LISTUSER的CLOB与VARCHAR2同名字段),这些字段可能为dbms_lob.... 目录oracle查询表结构建表语句索引1.用“USER_TAB_COLUMNS”查询表结构2.用“a

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

Oracle数据库定时备份脚本方式(Linux)

《Oracle数据库定时备份脚本方式(Linux)》文章介绍Oracle数据库自动备份方案,包含主机备份传输与备机解压导入流程,强调需提前全量删除原库数据避免报错,并需配置无密传输、定时任务及验证脚本... 目录说明主机脚本备机上自动导库脚本整个自动备份oracle数据库的过程(建议全程用root用户)总结

SQL Server跟踪自动统计信息更新实战指南

《SQLServer跟踪自动统计信息更新实战指南》本文详解SQLServer自动统计信息更新的跟踪方法,推荐使用扩展事件实时捕获更新操作及详细信息,同时结合系统视图快速检查统计信息状态,重点强调修... 目录SQL Server 如何跟踪自动统计信息更新:深入解析与实战指南 核心跟踪方法1️⃣ 利用系统目录

MySQL 内存使用率常用分析语句

《MySQL内存使用率常用分析语句》用户整理了MySQL内存占用过高的分析方法,涵盖操作系统层确认及数据库层bufferpool、内存模块差值、线程状态、performance_schema性能数据... 目录一、 OS层二、 DB层1. 全局情况2. 内存占js用详情最近连续遇到mysql内存占用过高导致

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

Python进行JSON和Excel文件转换处理指南

《Python进行JSON和Excel文件转换处理指南》在数据交换与系统集成中,JSON与Excel是两种极为常见的数据格式,本文将介绍如何使用Python实现将JSON转换为格式化的Excel文件,... 目录将 jsON 导入为格式化 Excel将 Excel 导出为结构化 JSON处理嵌套 JSON: