Странные и дублированные UUID генерируются постоянно - PullRequest
1 голос
/ 18 февраля 2020

Возникла проблема с моим приложением Spring Boot (с использованием Oracle Java 8, Hibernate и Oracle DB).
У меня есть следующая ошибка в журналах:
WARN ohejdb c .spi.SqlExceptionHelper.logExceptions - SQL Ошибка: 1, SQLState: 23000
ОШИБКА ohejdb c .spi.SqlExceptionHelper.logExceptions - ORA-00001: уникальное ограничение (MY_SCHEMA.SYS_C0057302)
Это ограничение (SYS_C0057302) является UUID УНИКАЛЬНЫМ. (UUID VARCHAR2 (32) NOT NULL UNIQUE)

Я не могу спровоцировать это поведение, выполняя его локально (даже с нагрузочными тестами) - локально на windows это выглядит хорошо, но в RHEL (где он развернут) проблема возникает постоянно.

Обратите внимание, что у меня есть еще дюжина классов сущностей, у всех из которых есть UUID, но только этот класс постоянно генерирует такие странные дубликаты.

Не знаю, как это исправить. Не могу найти root причину этого.

Примеры классов UUIDsand, используемых ниже:

В начале немного нормальных UUID, но через некоторое время создаются странные и дублированные UUID. На 2-й различном envs RHEL

* ** 1023 тысячи двадцать-два * Примеры нормальных UUID,:.
0C34561DD75D422CAD652715DF6C6E75
0CB86A03945040B9886752CC07EB116E
0DAA1A3AF2B5438F8CB9489348A92223
0EAE079E621B4D2B8E8BE445F76B14C9
0FCF05797E7E40DE8D3A9D6A3B44AAE1 * +1030 * 12DEBCAB53C94285A4C3FF32C5A0BF8E
132A877F404D44069F78D9B74DD4BDC9
1338A8CE09B14552B78CBAD640A3CF29
136310C44374412FB5B1B8FAF7E35330

* * * * * * *1035* 1035 *1036* 1036 * 10% *, которые представляют собой UUID, которые обычно совпадают с UU, равными 10 UU, например, UU, например, UU, которые являются случайными UUID, схожими со значениями UU, равными 10 UU. до много:
33333330333433363333333233333339
33333330333433363333333333333336
33333330333433363333333433333330
33333330333433363333333433333332
33333330333433363333333433333333
33333330333433363333333533333330
33333330333433363333333533333333
33333330333433363333333533333339
33333330333433363333333533343332
33333330333433363333333633333332
3333333033343 3363333333633333334
33333330333433363333333733333333
33333330333433363333333733343335
33333330333433363333333833333333
33333330333433363333333933333332

TaskEntity класс:

import lombok.Builder;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import ----DashboardTaskDto;
import ----SimpleUserDto;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.UUID;

@Getter
@Setter
@NoArgsConstructor
@Entity
@Table(name = "TASK")
@ToString
@EntityListeners(AuditingEntityListener.class)
@Slf4j
class TaskEntity {

    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "TASK_SEQ")
    @SequenceGenerator(sequenceName = "TASK_SEQ", allocationSize = 1, name = "TASK_SEQ")
    @Id
    private Long id;

    @Column(name = "KKF")
    private String kkf;

    @EqualsAndHashCode.Include
    private UUID uuid = UUID.randomUUID();

    private String customerName;
    private String assignedUserName;
    private String assignedUserRole;
    private int dpd;
    private Boolean bgk;
    private String courtProceedings;
    private String name;
    private LocalDateTime dueDate;
    private LocalDateTime doneDate;
    private BigDecimal totalLiabilities;
    private Long issueActivityId;
    private String userId;

    @Enumerated(EnumType.STRING)
    private TaskStatus status;

    @CreatedDate
    private LocalDateTime created;

    @LastModifiedDate
    private LocalDateTime modified;

    @Builder
    public TaskEntity(String kkf, String customerName, String assignedUserName, String assignedUserRole, int dpd, Boolean bgk, String courtProceedings, String name, LocalDateTime dueDate, LocalDateTime doneDate, BigDecimal totalLiabilities, Long issueActivityId, String userId, TaskStatus status, LocalDateTime created, LocalDateTime modified) {
        this.kkf = kkf;
        this.customerName = customerName;
        this.assignedUserName = assignedUserName;
        this.assignedUserRole = assignedUserRole;
        this.dpd = dpd;
        this.bgk = bgk;
        this.courtProceedings = courtProceedings;
        this.name = name;
        this.dueDate = dueDate;
        this.doneDate = doneDate;
        this.totalLiabilities = totalLiabilities;
        this.issueActivityId = issueActivityId;
        this.userId = userId;
        this.status = status;
        this.created = created;
        this.modified = modified;
    }

Задача вместилище класс:

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.repository.Repository;
import org.springframework.lang.Nullable;

import java.util.Optional;

interface TaskRepository extends Repository<TaskEntity, Long> {
    TaskEntity save(TaskEntity from);

    Optional<TaskEntity> findByIssueActivityId(Long id);

    Page<TaskEntity> findAll(@Nullable Specification<TaskEntity> spec, Pageable pageable);
}

TaskCreator используется для создания / обновления сущностей:

class TaskCreator {
   public TaskEntity from(IssueActivityEntity issueActivityEntity) {
       IssueEntity issue = issueActivityEntity.getIssue();
       CustomerEntity customer = issue.getCustomer();
       UserEntity user = issueActivityEntity.getUser();
       return TaskEntity.builder()
           .kkf(customer.getKkf())
           .customerName(customer.getCompanyName())
           .assignedUserName(user.getName())
           .assignedUserRole(user.getRole())
           .dpd(issue.retrieveMaxDpd())
           .bgk(customer.isBgk())
           .courtProceedings(customer.getCourtProceedings())
           .name(issueActivityEntity.getActivity().getStatus())
           .dueDate(issueActivityEntity.getDueDate())
           .doneDate(issueActivityEntity.getDoneDate())
           .totalLiabilities(customer.getTotalLiabilities())
           .issueActivityId(issueActivityEntity.getId())
           .status(issueActivityEntity.getStatus())
           .userId(user.getId())
           .build();
   }

   TaskEntity updateFrom(final TaskEntity task, final IssueActivityEntity ia) {
       IssueEntity issue = ia.getIssue();
       CustomerEntity customer = issue.getCustomer();
       UserEntity user = ia.getUser();
       task.setKkf(customer.getKkf());
       task.setCustomerName(customer.getCompanyName());
       task.setAssignedUserRole(user.getRole());
       task.setDpd(issue.retrieveMaxDpd());
       task.setBgk(customer.isBgk());
       task.setCourtProceedings(customer.getCourtProceedings());
       task.setName(ia.getActivity().getStatus());
       task.setDueDate(ia.getDueDate());
       task.setDoneDate(ia.getDoneDate());
       task.setTotalLiabilities(customer.getTotalLiabilities());
       task.setIssueActivityId(ia.getId());
       task.setStatus(ia.getStatus());
       task.setUserId(user.getId());
       return task;
   }
}


Обновление 1:
Я попытался установить -D java .security.egd = file: / dev /./ urandom, но это не помогло совсем.

...