Spring Batch作业元数据持久性问题

时间:2016-07-07 14:56:46

标签: database spring spring-batch hsqldb

我们使用Spring Batch来编写我们的工作,它的工作非常好。但是最近我们看到了截断的问题,导致关于spring批量存储关于作业的元数据的一些问题。

  1. 每次作业运行时,sp​​ring批处理都会在db中存储有关作业的元数据。有两个表:batch_step_execution_context和batch_job_execution_context,它们将元数据保存在2列short_context和serialized_context中。这两列都保存了确切的数据,但short_context的限制为2500个字符,因此数据被截断。
  2. 为什么我们有2列用于存储确切数据,如果我们摆脱short_context对作业有什么影响

    1. 现在我们在内存中使用HSQL db作为我们的工作。我们的一项工作提出了以下例外:

      org.springframework.dao.DataIntegrityViolationException:PreparedStatementCallback; SQL [UPDATE BATCH_JOB_EXECUTION_CONTEXT SET SHORT_CONTEXT =?,SERIALIZED_CONTEXT =? WHERE JOB_EXECUTION_ID =?];数据异常:字符串数据,右截断;嵌套异常是java.sql.SQLDataException:数据异常:字符串数据,右截断

    2. 更多堆栈跟踪:

      Caused by: org.hsqldb.HsqlException: data exception: string data, right truncation
          at org.hsqldb.error.Error.error(Unknown Source) ~[hsqldb-2.3.3.jar!/:2.3.3]
          at org.hsqldb.error.Error.error(Unknown Source) ~[hsqldb-2.3.3.jar!/:2.3.3]
          at org.hsqldb.types.CharacterType.castOrConvertToType(Unknown Source) ~[hsqldb-2.3.3.jar!/:2.3.3]
          at org.hsqldb.types.CharacterType.convertToType(Unknown Source) ~[hsqldb-2.3.3.jar!/:2.3.3]
          at org.hsqldb.StatementDML.getUpdatedData(Unknown Source) ~[hsqldb-2.3.3.jar!/:2.3.3]
          at org.hsqldb.StatementDML.executeUpdateStatement(Unknown Source) ~[hsqldb-2.3.3.jar!/:2.3.3]
          at org.hsqldb.StatementDML.getResult(Unknown Source) ~[hsqldb-2.3.3.jar!/:2.3.3]
          at org.hsqldb.StatementDMQL.execute(Unknown Source) ~[hsqldb-2.3.3.jar!/:2.3.3]
          at org.hsqldb.Session.executeCompiledStatement(Unknown Source) ~[hsqldb-2.3.3.jar!/:2.3.3]
          at org.hsqldb.Session.execute(Unknown Source) ~[hsqldb-2.3.3.jar!/:2.3.3]
      

      这是否特定于HSQL数据库,因为它适用于其他作业,即正确截断它

      感谢

1 个答案:

答案 0 :(得分:0)

serialized_context列应该是CLOB(或HSQLDB中的LONGVARCHAR),而不是2500可变长度字符字段。检查DDL here。如果更改HSQLDB数据库中的数据类型,则不应该看到任何截断。

除此之外,我会提醒您在执行环境中序列化过多,因为它会严重影响性能。你存的那么大的东西是什么?