Поток зависает при вызове getResultList () - PullRequest
0 голосов
/ 17 декабря 2018

У меня странная проблема с JPA.В моем шедулере выполняется следующий код

@SuppressWarnings("unchecked")
 @Transactional
 public void refreshSmsStatuses() {
    try {
        log.info("Enter refreshSmsStatuses");

        EntityManager em = hibernateHelper.getEntityManager();

        log.info("EM created");

        List<Sms> lSms = null;

        log.info("lSms = null;");

        TypedQuery<Sms> smsQuery = em.createQuery(
            "SELECT sms FROM Sms AS sms 
             join sms.status as status 
             WHERE status.isFinal = 0 
             and sms.remoteId is not null 
             and sms.sendDate > sysdate - 3", Sms.class);

        log.info("sqlQuery created");

        lSms = smsQuery.getResultList();

        log.info("Query SMS executed");
        .....

После планирования ночной перезагрузки он работает несколько раз и зависает.Следующие строки

2018-12-17 00:10:33,802 [SmsDao.java:pool-2-thread-1:166] - lSms = null;
2018-12-17 00:10:33,802 [SmsDao.java:pool-2-thread-1:168] - sqlQuery created

в файлах журнала.Запрос не выполняется в БД, он висит где-то в JPA.Проблема только на рабочем сервере.После зависания любые методы шедулера не работают, потому что, я думаю, они ждут конца этого метода.Если кто-нибудь сталкивался с подобной проблемой, пожалуйста, помогите мне.Большое спасибо

ОБНОВЛЕНО

@Table( name = "ZUSB_SMS") 
@Entity
public class Sms extends BaseModel {
    private static final long serialVersionUID = -3624326750555670797L;
    @Id
    @SequenceGenerator(name = "generator", sequenceName = "ZUSB_SMS_SEQ")
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "generator")
    @Column(name = "id")
    private Long id;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "REF_SMS_TEMPLATE_ID", referencedColumnName = "id")
    private SmsTemplate template;
    @Column(name = "name")
    private String name;
    @Column(name = "send_date")
    private Date sendDate;
    @Column(name = "phone")
    private String phone;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "REF_CLIENT_ID", referencedColumnName = "id")
    private Client client;
    @Column(name = "text")
    private String text;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "REF_SMS_STATUS_ID", referencedColumnName = "id")
    private SmsStatus status;


    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "REF_USER_ID", referencedColumnName = "id")
    private User user;
    @Column(name = "remote_id")
    private Long remoteId;
    private String log = "";

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "REF_CLE_STATUS_ID", referencedColumnName = "id")
    private SmsCleStatus cleStatus;
    @Column(name = "cle_text")
    private String cleText;
    @Column(name = "cle_id")
    private Long cleId;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public SmsTemplate getTemplate() {
        return template;
    }
    public void setTemplate(SmsTemplate template) {
        this.template = template;
    }
    public Date getSendDate() {
        return sendDate;
    }
    public void setSendDate(Date sendDate) {
        this.sendDate = sendDate;
    }
    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
    public Client getClient() {
        return client;
    }
    public void setClient(Client client) {
        this.client = client;
    }
    public String getText() {
        return text;
    }
    public void setText(String text) {
        this.text = text;
    }
    public SmsStatus getStatus() {
        return status;
    }
    public void setStatus(SmsStatus status) {
        this.status = status;
    }
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    public Long getRemoteId() {
        return remoteId;
    }
    public void setRemoteId(Long remoteId) {
        this.remoteId = remoteId;
    }
    public String getLog() {
        return log;
    }

    public void setLog(String log) {
        DateFormat df = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
        Date today = Calendar.getInstance().getTime();        
        String reportDate = df.format(today);
        if(log.equals(""))
            this.log = reportDate + " " + log;
        else
            this.log = this.log + "\n" + reportDate + " " + log;
    }

    public SmsCleStatus getCleStatus() {
        return cleStatus;
    }

    public void setCleStatus(SmsCleStatus cleStatus) {
        this.cleStatus = cleStatus;
    }

    public String getCleText() {
        return cleText;
    }

    public void setCleText(String cleText) {
        this.cleText = cleText;
    }

    public Long getCleId() {
        return cleId;
    }

    public void setCleId(Long cleId) {
        this.cleId = cleId;
    }






}

PS Извините за мой английский

1 Ответ

0 голосов
/ 17 декабря 2018

Во-первых, ваш запрос неверен, так как вы не указали ON, к чему вы присоединяетесь.Во-вторых, вам не нужно явно указывать таблицу join SmsStatus, поскольку вы сопоставили ее с @ManyToOne.

Обновите ваш запрос следующим образом -

TypedQuery<Sms> smsQuery = em.createQuery(
        "FROM Sms s                            
         WHERE s.status.isFinal = 0
         AND s.remoteId IS NOT NULL   
         AND s.sendDate > sysdate-3", Sms.class);

Это может решить проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...