diff --git a/core/src/main/java/org/mapfish/print/servlet/job/HibernateAccountingEntry.java b/core/src/main/java/org/mapfish/print/servlet/job/HibernateAccountingEntry.java index fcfee8621c..d6dea5e4aa 100644 --- a/core/src/main/java/org/mapfish/print/servlet/job/HibernateAccountingEntry.java +++ b/core/src/main/java/org/mapfish/print/servlet/job/HibernateAccountingEntry.java @@ -7,6 +7,8 @@ import jakarta.persistence.Id; import jakarta.persistence.Table; import java.util.Date; +import org.hibernate.annotations.JdbcTypeCode; +import org.hibernate.type.SqlTypes; import org.mapfish.print.Constants; import org.mapfish.print.config.Configuration; import org.mapfish.print.processor.ExecutionStats; @@ -25,13 +27,14 @@ public class HibernateAccountingEntry { private static final Logger LOGGER = LoggerFactory.getLogger(HibernateAccountingEntry.class); @Id - @Column(name = "reference_id") + @Column(name = "reference_id", columnDefinition = "TEXT") private String referenceId; - @Column(nullable = false, name = "app_id") + @Column(nullable = false, name = "app_id", columnDefinition = "TEXT") private String appId; - @Column private String referrer; + @Column(columnDefinition = "TEXT") + private String referrer; @Column(nullable = false) @Enumerated(EnumType.STRING) @@ -46,16 +49,17 @@ public class HibernateAccountingEntry { @Column(name = "total_time_ms", nullable = false) private long totalTimeMS; - @Column(nullable = false, name = "output_format") + @Column(nullable = false, name = "output_format", columnDefinition = "TEXT") private String outputFormat; - @Column(nullable = false) + @Column(nullable = false, columnDefinition = "TEXT") private String layout; @Column(name = "file_size") private Long fileSize = null; @Column(columnDefinition = "jsonb") + @JdbcTypeCode(SqlTypes.JSON) private ObjectNode stats = null; @Column(nullable = false) diff --git a/core/src/main/java/org/mapfish/print/servlet/job/PrintJobEntry.java b/core/src/main/java/org/mapfish/print/servlet/job/PrintJobEntry.java index e3e68d38ae..1ba8817d88 100644 --- a/core/src/main/java/org/mapfish/print/servlet/job/PrintJobEntry.java +++ b/core/src/main/java/org/mapfish/print/servlet/job/PrintJobEntry.java @@ -19,10 +19,10 @@ @Embeddable public class PrintJobEntry { - @Column(insertable = false, updatable = false) + @Column(insertable = false, updatable = false, columnDefinition = "TEXT") private String referenceId; - @Column() + @Column(columnDefinition = "TEXT") @Type(PJsonObjectUserType.class) private PJsonObject requestData; diff --git a/core/src/main/java/org/mapfish/print/servlet/job/impl/PrintJobResultImpl.java b/core/src/main/java/org/mapfish/print/servlet/job/impl/PrintJobResultImpl.java index d0c1b6d821..3838a6964b 100644 --- a/core/src/main/java/org/mapfish/print/servlet/job/impl/PrintJobResultImpl.java +++ b/core/src/main/java/org/mapfish/print/servlet/job/impl/PrintJobResultImpl.java @@ -20,20 +20,25 @@ @Table(name = "print_job_results") public class PrintJobResultImpl implements PrintJobResult { - @Id private String reportURI; + @Id + @Column(columnDefinition = "TEXT") + private String reportURI; - @Column private String mimeType; + @Column(columnDefinition = "TEXT") + private String mimeType; - @Column private String fileExtension; + @Column(columnDefinition = "TEXT") + private String fileExtension; - @Column private String fileName; + @Column(columnDefinition = "TEXT") + private String fileName; @OneToOne(targetEntity = PrintJobStatusImpl.class, fetch = FetchType.LAZY) @OnDelete(action = OnDeleteAction.CASCADE) @JoinColumn(name = "referenceId", insertable = false, updatable = false) private PrintJobStatus status = null; - @Column(insertable = true, updatable = true) + @Column(insertable = true, updatable = true, columnDefinition = "TEXT") private String referenceId; /** Default Constructor. */ diff --git a/core/src/main/java/org/mapfish/print/servlet/job/impl/PrintJobStatusImpl.java b/core/src/main/java/org/mapfish/print/servlet/job/impl/PrintJobStatusImpl.java index ef832fb123..1b6383dbed 100644 --- a/core/src/main/java/org/mapfish/print/servlet/job/impl/PrintJobStatusImpl.java +++ b/core/src/main/java/org/mapfish/print/servlet/job/impl/PrintJobStatusImpl.java @@ -23,7 +23,9 @@ public class PrintJobStatusImpl implements PrintJobStatus { @Embedded private PrintJobEntry entry; - @Id private String referenceId; + @Id + @Column(columnDefinition = "TEXT") + private String referenceId; @Column @Enumerated(EnumType.STRING) @@ -33,7 +35,7 @@ public class PrintJobStatusImpl implements PrintJobStatus { @Column private long requestCount; - @Column(length = 4096) + @Column(columnDefinition = "TEXT") private String error; @OneToOne(targetEntity = PrintJobResultImpl.class, cascade = CascadeType.ALL, mappedBy = "status") diff --git a/core/src/main/java/org/mapfish/print/servlet/job/impl/hibernate/PrintJobDao.java b/core/src/main/java/org/mapfish/print/servlet/job/impl/hibernate/PrintJobDao.java index f6ba6e6477..6baf3ab576 100644 --- a/core/src/main/java/org/mapfish/print/servlet/job/impl/hibernate/PrintJobDao.java +++ b/core/src/main/java/org/mapfish/print/servlet/job/impl/hibernate/PrintJobDao.java @@ -2,7 +2,6 @@ import jakarta.annotation.Nullable; import jakarta.annotation.PostConstruct; -import jakarta.persistence.PessimisticLockException; import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.CriteriaDelete; import jakarta.persistence.criteria.CriteriaQuery; @@ -11,7 +10,6 @@ import jakarta.persistence.criteria.Root; import java.net.URI; import java.util.Arrays; -import java.util.Collections; import java.util.List; import org.hibernate.LockMode; import org.hibernate.Session; @@ -223,16 +221,11 @@ public final List poll(final int size) { criteria.orderBy(builder.asc(root.get("entry").get("startTime"))); final Query query = getSession().createQuery(criteria); query.setMaxResults(size); - // LOCK but don't wait for release (since this is run continuously - // anyway, no wait prevents deadlock) - query.setLockMode("pj", LockMode.PESSIMISTIC_WRITE); + // If the row is locked, it means that the row is already taken by some other worker. + // So, this row must not be returned as it's not in a WAITING state. + query.setLockMode("pj", LockMode.UPGRADE_SKIPLOCKED); query.setHint("jakarta.persistence.lock.timeout", 0); - try { - return query.getResultList(); - } catch (PessimisticLockException ex) { - // Another process was polling at the same time. We can ignore this error - return Collections.emptyList(); - } + return query.getResultList(); } /** diff --git a/core/src/main/resources/mapfish-spring-hibernate.xml b/core/src/main/resources/mapfish-spring-hibernate.xml index e75a99d115..519bbb43e6 100644 --- a/core/src/main/resources/mapfish-spring-hibernate.xml +++ b/core/src/main/resources/mapfish-spring-hibernate.xml @@ -10,6 +10,7 @@ + org.mapfish.print.servlet.job org.mapfish.print.servlet.job.impl org.mapfish.print.servlet.job.impl.hibernate