簡體   English   中英

如何在具有多個服務器的同一數據庫上使用駱駝 JPA 組件?

[英]How to use camel JPA component on the same database with multiple servers?

我目前正在設置我的駱駝項目,但我無法讓我的 JPA 輪詢器在多個並發服務器上工作。

這是我的駱駝路線:

public class TicketPoller extends RouteBuilder {

    /** The uri. */
    private final String uri = "jpa://Ticket?consumeDelete=false&consumeLockEntity=true&consumer.SkipLockedEntity=true&consumer.query=select t from Ticket t where t.state=1";

    @Override
    public void configure() {
        from(uri).to("log:input");

    }
}

在我的 Hibernate 實體中直接輪詢時,我使用 @Consumed 注釋來更改票證狀態:

@Entity
@Table(name = "TICKET", schema = "TEIKITEL")
public class Ticket implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "TICKET_ID")
    private String ticketId;

    @Column(name = "STATE")
    private int state;

    ...

    @Consumed
    public void changeTicketState() {
        this.state = 2;
    }

    @Override
    public String toString() {
        return "Ticket@ticketId=" + this.ticketId;
    }
}

當我從 Eclipse 的一台 Tomcat 服務器 (Tomcat 8) 上啟動它時,它工作正常。

但是當我在同一個數據庫上啟動 2 個服務器輪詢時,當我在我的 TICKET 表中插入一些行時出現這些錯誤:

在我的第一台服務器上,我可以看到:

Hibernate: select TICKET_ID from TEIKITEL.TICKET where TICKET_ID =? for update nowait
2016-04-05 15:04:56,796 INFO  [Camel (camel-1) thread #0 - jpa://com.teikitel.model.entity.Ticket] input(180) - Exchange[ExchangePattern: InOnly, BodyType: com.teikitel.model.entity.Ticket, Body: Ticket@ticketId=TICKET1]
Hibernate: select TICKET_ID from TEIKITEL.TICKET where TICKET_ID =? for update nowait
2016-04-05 15:04:56,812 INFO  [Camel (camel-1) thread #0 - jpa://com.teikitel.model.entity.Ticket] input(180) - Exchange[ExchangePattern: InOnly, BodyType: com.teikitel.model.entity.Ticket, Body: Ticket@ticketId=TICKET2]

在我的第二台服務器上:

Hibernate: select TICKET_ID from TEIKITEL.TICKET where TICKET_ID =? for update nowait
2016-04-05 15:04:56,859 WARN  [Camel (camel-1) thread #0 - jpa://com.teikitel.model.entity.Ticket] o.h.e.j.spi.SqlExceptionHelper(144) - SQL Error: 54, SQLState: 61000
2016-04-05 15:04:56,859 ERROR [Camel (camel-1) thread #0 - jpa://com.teikitel.model.entity.Ticket] o.h.e.j.spi.SqlExceptionHelper(146) - ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired
Hibernate: select TICKET_ID from TEIKITEL.TICKET where TICKET_ID =? for update nowait
2016-04-05 15:04:56,874 WARN  [Camel (camel-1) thread #0 - jpa://com.teikitel.model.entity.Ticket] o.h.e.j.spi.SqlExceptionHelper(144) - SQL Error: 54, SQLState: 61000
2016-04-05 15:04:56,874 ERROR [Camel (camel-1) thread #0 - jpa://com.teikitel.model.entity.Ticket] o.h.e.j.spi.SqlExceptionHelper(146) - ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired

有人遇到過同樣的問題嗎?

洛伊克

沒有錯誤!

這些錯誤日志來自Hibernate,而不是來自Camel。

Camel執行其Job並跳過鎖定在數據庫中的元素(觸發的日志操作僅在一個實例上執行一次)但它使用Hibernate執行其非阻塞選擇請求。 Hibernate拋出異常,Camel BUT成功忽略該異常,在日志輸出中打印錯誤。 這就是你所看到的。

我解決你的問題的方法是將Hibernate日志設置到更高的級別。

對於諸如論文(同步)之類的問題,請不要猶豫,使用駱駝中的延遲方法來更好地理解:

public class TicketPoller extends RouteBuilder {

/** The uri. */
private final String uri = "jpa://Ticket?consumeDelete=false&consumeLockEntity=true&consumer.SkipLockedEntity=true&consumer.query=select t from Ticket t where t.state=1";

@Override
public void configure() {
    from(uri).delay(10000).to("log:input"); //wait 10sec 

}

}

看起來實體已經鎖定了第一台服務器上運行的其他線程。 您正在使用consumeLockEntity = true鎖定單元格,並且您沒有等待發布使用消費者 .SkipLockedEntity = true因此在嘗試之后第二個服務器中的連接關閉而不等待。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM