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
相关产品推荐
相关产品推荐

