SERIALIZED CONTEXT 数据截断问题 [SPRING BATCH]

Posted

技术标签:

【中文标题】SERIALIZED CONTEXT 数据截断问题 [SPRING BATCH]【英文标题】:SERIALIZED CONTEXT data truncation issue [SPRING BATCH] 【发布时间】:2020-04-14 18:41:11 【问题描述】:

由于 spring boot 升级到 spring boot 2.1.6,我在数据库上遇到了 spring batch 异常:

Caused by: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Data too long for column 'SERIALIZED_CONTEXT' at row 1
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:104)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:955)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1094)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1042)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeLargeUpdate(ClientPreparedStatement.java:1345)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdate(ClientPreparedStatement.java:1027)
at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61)
at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java)
at org.springframework.jdbc.core.JdbcTemplate.lambda$update$0(JdbcTemplate.java:866)
at org.springframework.jdbc.core.

我不会直接在数据库上更改列,我正在寻找一个干净的解决方案。有谁知道如何解决这个异常?

提前谢谢你。

【问题讨论】:

【参考方案1】:

我不会直接在数据库上更改列,我正在寻找一个干净的解决方案。有谁知道如何解决这个异常?

Spring Batch 不会阻止您将任何您想要的内容放入执行上下文中,但同时不能强制数据库接受比列定义接受的更多内容。

因此,解决此问题的干净方法是修改 DDL 中的列并在 JobRepositoryFactoryBean#setMaxVarCharLength 中设置适当的值。

【讨论】:

感谢您的回复。所以,我认为现在唯一的解决方案是改变列大小以接受上下文值。稍后我将尝试实现一个自定义的上下文序列化器以减小值大小。 太好了,不客气!在这种情况下,请accept the answer。 我已经修改了该列并且它可以正常工作。但是,我面临的第二个问题是我使用 liquibase 更新数据库,这不适用于集成测试,因为 liquibase 脚本是在执行 spring-batch 元数据模式之前执行的,这会触发 sql 错误:表 BATCH_JOB_EXECUTION_CONTEXT 没有存在 !最后测试通过失败。 这是另一个问题,您需要确保脚本以正确的顺序执行。 是的,这是另一个问题。不过我会看看如何解决这个问题。 Spring-batch 脚本包含在核心中并自动执行,我无法更改集成测试的顺序。 Liquibase 脚本首先是 spring-btach 脚本。

以上是关于SERIALIZED CONTEXT 数据截断问题 [SPRING BATCH]的主要内容,如果未能解决你的问题,请参考以下文章

UIView下阴影截断

实体框架核心中的截断表

json.parse 给出 Uncaught SyntaxError: Unexpected Token (Django json serialized queryset)

Spring Batch ORA-08177: 运行单个作业时无法序列化此事务的访问,SERIALIZED 隔离级别

在一个 Kafka Topic 下发送两个 Serialized Java 对象

Caused by: java.lang.IllegalStateException: Serialized class cn.bloghut.dto.ProducterDto must implem