亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

JPA 存儲庫和阻塞 I/O

JPA 存儲庫和阻塞 I/O

MMTTMM 2022-12-15 14:52:28
我遇到一個問題,在使用 JpaRepository 寫入數據庫后,我需要在單獨的線程上執行幾個慢速 HTTP 請求。問題是doActualJob()在等待一系列期貨解決時的阻塞。這似乎可以防止底層 Hibernate 會話關閉,從而導致應用程序很快用完連接。如何編寫此函數,以便在執行阻塞 I/O 時數據庫連接不保持打開狀態?甚至可以使用 JpaRepositories,還是我需要使用像 EntityManager/SessionFactory 這樣的較低級別的 API?@Serviceclass SomeJobRunner {    private final SomeJobRepository mSomeJobRepository; //extends JpaRepository    @AutoWired    public SomeJobRunner(final SomeJobRepository someJobRepository) {        mSomeJobRepository = someJobRepository;    }    @Async    public void doSlowJob(final long someJobId) {        SomeJob someJob = mSomeJobRepository.findOne(someJobId);        someJob.setJobStarted(Instant.now());        mSomeJobRepository.saveAndFlush(someJob);        doActualjob(); // Synchronous job doing several requests using Unirest in series        someJob = mSomeJobRepository.findOne(someJobId);        someJob.setJobEnded(Instant.now());        mSomeJobRepository.saveAndFlush(someJob);}
查看完整描述

2 回答

?
慕斯王

TA貢獻1864條經驗 獲得超2個贊

嗯——非阻塞數據庫 IO 在 Java/JDBC 世界中以標準方式是不可能的。簡而言之——你的 Spring 數據存儲庫最終將使用 JPA ORM 實現(比如 Hibernate),而 JPA ORM 實現又將使用 JDBC 與之交互本質上是阻塞的數據庫。Oracle(異步數據庫訪問 API )目前正在做這方面的工作,以提供與 JDBC 類似但非阻塞的 API。他們打算將此作為標準提出。Spring 人員在這方面也有一項令人興奮的并行工作,即R2DBC – 反應式關系數據庫連接。他們實際上也將其與 Spring 數據集成(鏈接) 這樣可以幫助您集成到您的解決方案中??梢栽?a >此處找到 Spring 的一個很好的教程。

查看完整回答
反對 回復 2022-12-15
?
吃雞游戲

TA貢獻1829條經驗 獲得超7個贊

我建議使用單獨的JTA 事務寫入數據庫。這樣做,定義一個像這樣的方法


@Transactional(Transactional.TxType.REQUIRES_NEW)

public void saveJobStart(final long someJobId) {

    SomeJob someJob = mSomeJobRepository.findOne(someJobId);

    someJob.setJobStarted(Instant.now());

    mSomeJobRepository.saveAndFlush(someJob);

}

當然不完全一樣。如果doActualjob()失敗,在您的情況下,數據庫將不會保留開始日期。在我的提議中,它會堅持下去。作為補償,您需要在新事務中刪除doSlowJobcatch中的bloc 中的開始日期,然后重新處理異常。 throw


查看完整回答
反對 回復 2022-12-15
  • 2 回答
  • 0 關注
  • 122 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號