diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/JdbcExecutionContextDao.java b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/JdbcExecutionContextDao.java index 3a0f027bf..239f8c30c 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/JdbcExecutionContextDao.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/JdbcExecutionContextDao.java @@ -16,19 +16,19 @@ package org.springframework.batch.core.repository.dao; +import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; -import java.sql.PreparedStatement; -import java.util.Map.Entry; import java.util.HashMap; -import java.util.Map; import java.util.List; +import java.util.Map; +import java.util.Map.Entry; import org.springframework.batch.core.JobExecution; import org.springframework.batch.core.StepExecution; import org.springframework.batch.item.ExecutionContext; -import org.springframework.jdbc.core.simple.ParameterizedRowMapper; import org.springframework.jdbc.core.PreparedStatementSetter; +import org.springframework.jdbc.core.simple.ParameterizedRowMapper; import org.springframework.jdbc.support.lob.DefaultLobHandler; import org.springframework.jdbc.support.lob.LobHandler; import org.springframework.util.Assert; @@ -63,12 +63,28 @@ public class JdbcExecutionContextDao extends AbstractJdbcBatchMetadataDao implem private static final String UPDATE_STEP_EXECUTION_CONTEXT = "UPDATE %PREFIX%STEP_EXECUTION_CONTEXT " + "SET SHORT_CONTEXT = ?, SERIALIZED_CONTEXT = ? " + "WHERE STEP_EXECUTION_ID = ?"; - private static final int MAX_VARCHAR_LENGTH = 2500; + private static final int DEFAULT_MAX_VARCHAR_LENGTH = 2500; + + private int shortContextLength = DEFAULT_MAX_VARCHAR_LENGTH; private LobHandler lobHandler = new DefaultLobHandler(); private ExecutionContextStringSerializer serializer; + /** + * The maximum size that an execution context can have and still be stored + * completely in short form in the column SHORT_CONTEXT. + * Anything longer than this will overflow into large-object storage, and + * the first part only will be retained in the short form for readability. + * Default value is 2500. Clients using multi-bytes charsets on the database + * server may need to reduce this value to as little as half the value of + * the column size. + * @param shortContextLength + */ + public void setShortContextLength(int shortContextLength) { + this.shortContextLength = shortContextLength; + } + public ExecutionContext getExecutionContext(JobExecution jobExecution) { Long executionId = jobExecution.getId(); Assert.notNull(executionId, "ExecutionId must not be null."); @@ -163,8 +179,10 @@ public class JdbcExecutionContextDao extends AbstractJdbcBatchMetadataDao implem final String shortContext; final String longContext; - if (serializedContext.length() > MAX_VARCHAR_LENGTH) { - shortContext = serializedContext.substring(0, MAX_VARCHAR_LENGTH - 4) + " ..."; + if (serializedContext.length() > shortContextLength) { + // Overestimate length of ellipsis to be on the safe side with + // 2-byte chars + shortContext = serializedContext.substring(0, shortContextLength - 8) + " ..."; longContext = serializedContext; } else {