本文介紹了從Java啟動(dòng)的數(shù)據(jù)庫查詢是否總是阻塞I/O?的處理方法,對(duì)大家解決問題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!
問題描述
假設(shè)一些阻塞I/O是在Java中完成的,例如長時(shí)間運(yùn)行的數(shù)據(jù)庫查詢。在Java中,通常有沒有一種方法可以讓一些Java數(shù)據(jù)庫驅(qū)動(dòng)程序告訴JVM調(diào)度器,調(diào)用已經(jīng)離開JVM,現(xiàn)在正在由某個(gè)外部系統(tǒng)處理?然后,JVM可以將服務(wù)數(shù)據(jù)庫查詢的線程分配給某個(gè)其他操作,直到來自數(shù)據(jù)庫的回復(fù)到達(dá)為止。這樣,阻塞數(shù)據(jù)庫查詢將有效地變?yōu)榉亲枞?/p>
我只是想知道是否可以在一般的JVM上這樣做。我使用Java已經(jīng)有很多年了,但我必須承認(rèn),我不知道Java調(diào)度程序在這種情況下會(huì)做什么。
推薦答案
假設(shè)一些阻塞I/O是在Java中完成的,例如長時(shí)間運(yùn)行的數(shù)據(jù)庫查詢。在Java中,通常有沒有一種方法可以讓一些Java數(shù)據(jù)庫驅(qū)動(dòng)程序告訴JVM調(diào)度程序,調(diào)用已經(jīng)離開JVM,現(xiàn)在正在由某個(gè)外部系統(tǒng)處理?
呃,不。線程的全部意義在于,如果它們阻塞,則可以調(diào)度一個(gè)不同的線程接管處理器或其他資源。您不希望JVM以某種方式使用相同的線程,該線程保存所有的JDBC狀態(tài)、堆棧幀、變量等。您確實(shí)希望將相同的處理器和其他系統(tǒng)資源用于不同線程的任務(wù)。請(qǐng)記住,線程的開銷相對(duì)較低。在現(xiàn)代系統(tǒng)上,當(dāng)JVM中有數(shù)千個(gè)堆棧時(shí),您可能會(huì)開始遇到問題,主要是因?yàn)樗鼈兠總€(gè)都分配了一個(gè)固定的堆棧空間區(qū)域。
作為程序員,我們對(duì)此進(jìn)行優(yōu)化的方法是使用多線程、線程池、數(shù)據(jù)庫連接池等。然后,當(dāng)查詢阻塞時(shí),其他線程和查詢可以并行工作,以最大化系統(tǒng)吞吐量。
這篇關(guān)于從Java啟動(dòng)的數(shù)據(jù)庫查詢是否總是阻塞I/O?的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,