簡體   English   中英

Java fork-join執行程序對數據庫訪問的用法

[英]java fork-join executor usage for db access

ForkJoinTask顯式調出“可細分的任務也不應執行阻塞的I / O ”。 它的主要目標是“ 計算任務以計算純函數或對純隔離對象進行操作”。 我的問題是:

  1. 為什么要設計ForkJoinTask來限制阻塞的IO任務?
  2. 如果我確實執行阻塞IO任務,該怎么辦?
  3. spring和play框架為何都包含使用fork-join執行程序進行數據庫調用的示例?

在我的場景中,單個請求執行兩種類型的工作,其中一種是加密,它將200毫秒內的CPU內核推到100%,第二次是很少的數據庫調用。 諸如6個用於加密的線程和2個用於阻止IO的線程之類的靜態分區都無法提供CPU的最佳使用。 因此,擁有一個fork-join執行器,並且在一定數量的總CPU數量上過度配置了一定數量的線程,再加上工作偷竊,將確保更好地利用CPU資源。

我對forkjoin執行器的上述假設和理解是否正確,如果不正確,請指出空白。

為什么要設計ForkJoinTask來限制阻塞的IO任務?

分叉聯接池的底層是共享的線程數量,如果這些線程上有一些IO工作受阻,則用於CPU密集型工作的線程會更少。 其他沒有人阻止工作。

如果我確實執行阻塞IO任務,該怎么辦?

通常,FJPool為線程分配有關處理器數量的信息。 因此,如果必須在線程上使用IO阻塞,請確保為其他任務分配足夠的線程。

您還可以在與FJ池不共享的專用線程上隔離IO工作。 但您調用blocking IO,則線程被阻止並安排執行其他任務,直到取消阻止

spring和play框架為何都包含使用fork-join執行程序進行數據庫調用的示例?

play也沒什么不同。 他們將專用pools用於IO任務,因此其他任務不會受到影響。

框架不限制任何類型的處理。 不建議進行阻塞等。幾年前,我對這個框架進行了評論,這是建議的重點。 該版本適用於Java7版本,但仍適用於Java8。

阻塞不是致命的,沖刺和游戲阻塞,它們工作得很好。 使用Java8時需要小心,因為有一個默認的公共叉/連接池,並且綁定線程可能會對其他用戶造成影響。 您總是可以使用額外的開銷定義自己的f / j池,但是至少您不會使用公共池來干擾其他人。

您的情況看起來還不錯。 您不必等待來自互聯網的回復。 試試看。 如果遇到使線程停止的困難,請查看ForkJoinPool.ManagedBlocker接口。 使用該接口會通知f / j池您正在執行阻塞調用,框架將創建補償線程。

暫無
暫無

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

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