You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ignite 2.14.0 + JDK17 Date列序列化异常解决请求

解决Ignite独立应用Date字段序列化异常问题

问题根源

Ignite默认的优化序列化器无法正确处理java.util.Date对象的序列化,导致执行Insert/Select时抛出java.sql.BatchUpdateException。以下是针对性的解决方案:


方案1:替换日期类型为java.sql.Date

将实体类中的java.util.Date替换为java.sql.Date,它与数据库DATE类型映射更直接,Ignite序列化器对JDBC标准日期类型支持更完善。

示例代码修改:

// 原实体类字段
private Date createDate;

// 修改后
private java.sql.Date createDate;

插入数据时的对象构造:

// 将java.util.Date转换为java.sql.Date
entity.setCreateDate(new java.sql.Date(new Date().getTime()));

方案2:调整Ignite序列化配置

禁用优化序列化,改用JDK默认序列化

在Ignite配置中指定使用JDK序列化器,避免优化序列化的类型限制:

IgniteConfiguration cfg = new IgniteConfiguration();
cfg.setMarshaller(new JdkMarshaller());

配置优化序列化器允许Date类型

如果需要保留优化序列化,可显式指定允许序列化的java.util.Date类型:

OptimizedMarshaller marshaller = new OptimizedMarshaller();
marshaller.setClassNames(new String[]{"java.util.Date"});
cfg.setMarshaller(marshaller);

方案3:确保DDL与实体类映射匹配

检查DDL表结构的DATE列和实体类字段的注解配置是否对应:

DDL示例

CREATE TABLE IF NOT EXISTS TEST_TABLE (
    ID INT PRIMARY KEY,
    CREATE_DATE DATE
);

实体类字段注解配置

@QuerySqlField(name = "CREATE_DATE", type = QuerySqlField.Type.DATE)
private Date createDate;

方案4:使用Ignite日期转换工具

插入数据时,用Ignite内置工具转换日期为可序列化格式:

import org.apache.ignite.internal.util.IgniteUtils;

// 转换为Ignite可序列化的日期对象
Date serializableDate = IgniteUtils.toSerializableDate(new Date());

内容的提问来源于stack exchange,提问作者sumati patri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 19:15:33