我有以下问题。我有一个AppointmentRequest类,它是一个如下所示的实体:
public class AppointmentRequest implements Serializable{
private static final long serialVersionUID = 4075310313280246558L;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "id_Sequence")
@SequenceGenerator(name = "id_Sequence", sequenceName = "ID_SEQ")
@Column(name = "APPOINTMENT_REQUEST_ID", nullable = false)
private long requestId;
@Version
private long version;
@Column(nullable=false)
private String firstName;
@Column(nullable=false)
private String lastName;
@Column(nullable = false)
private long jmbg;
@OneToOne
private TimeSlot timeSlot;
时间段实体:
public class TimeSlot {
@Id
@Column(columnDefinition="TIMESTAMP(0)",nullable=false)
private LocalDateTime dateTime;
@OneToOne(mappedBy="timeSlot")
private AppointmentRequest appointmentRequest;
以下是验证和保留appointmentRequest的EJB代码:
validator.slotAvailable(appointmentRequest.getTimeSlot());
entityManager.persist(appointmentRequest);
验证器EJB检查时隙是否可用以及是否应该保留为missionRequest,但如果不存在则抛出异常。请求和响应通过SOAP Web服务进行,因此如果成功则服务返回true,如果已经预订了插槽,则返回false。
当我逐个发送SOAP请求时,一切正常。
但是,我创建了一个SOAP客户端,它可以创建多个线程(模拟多个客户端)并同时向同一时隙发送许多请求。在这种情况下,多个appointmentRequest在一个时隙中保持不变。 这种情况正在发生,因为验证是异步发生的,并且多个线程的验证同时进行,因此多个实体会被持久化,这不应该发生。
我该如何解决这个问题?通过向@Prepersist回调添加验证,我获得了更好的性能,但有时仍然会在同一时隙中保留多个appointmentRequests。
答案 0 :(得分:0)
我只是同步并获得性能提升:
validator.slotAvailable(appointmentRequest.getTimeSlot());
synchronized {
validator.slotAvailable(appointmentRequest.getTimeSlot());
entityManager.persist(appointmentRequest);
entityManager.flush()
}