0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

公用池化包Commons Pool 2

Android編程精選 ? 來源:CSDN ? 2023-05-04 10:36 ? 次閱讀

			

						

在我們平常的編碼中,通常會(huì)將一些對象保存起來,這主要考慮的是對象的創(chuàng)建成本。比如像線程資源、數(shù)據(jù)庫連接資源或者 TCP 連接等,這類對象的初始化通常要花費(fèi)比較長的時(shí)間,如果頻繁地申請和銷毀,就會(huì)耗費(fèi)大量的系統(tǒng)資源,造成不必要的性能損失。

并且這些對象都有一個(gè)顯著的特征,就是通過輕量級(jí)的重置工作,可以循環(huán)、重復(fù)地使用。這個(gè)時(shí)候,我們就可以使用一個(gè)虛擬的池子,將這些資源保存起來,當(dāng)使用的時(shí)候,我們就從池子里快速獲取一個(gè)即可。

Java 中,池化技術(shù)應(yīng)用非常廣泛,常見的就有數(shù)據(jù)庫連接池、線程池等,本文主講連接池,線程池我們將在后續(xù)的博客中進(jìn)行介紹。

公用池化包 Commons Pool 2

簡介

我們首先來看一下 Java 中公用的池化包 Commons Pool 2,來了解一下對象池的一般結(jié)構(gòu)。根據(jù)我們的業(yè)務(wù)需求,使用這套 API 能夠很容易實(shí)現(xiàn)對象的池化管理。



org.apache.commons
commons-pool2
2.11.1


GenericObjectPool 是對象池的核心類,通過傳入一個(gè)對象池的配置和一個(gè)對象的工廠,即可快速創(chuàng)建對象池。

publicGenericObjectPool(
finalPooledObjectFactoryfactory,
finalGenericObjectPoolConfigconfig)

案例

Redis 的常用客戶端 Jedis,就是使用 Commons Pool 管理連接池的,可以說是一個(gè)最佳實(shí)踐。下圖是 Jedis 使用工廠創(chuàng)建對象的主要代碼塊。對象工廠類最主要的方法就是makeObject,它的返回值是 PooledObject 類型,可以將對象使用 new DefaultPooledObject<>(obj) 進(jìn)行簡單包裝返回。
redis.clients.jedis.JedisFactory,使用工廠創(chuàng)建對象。

@Override
publicPooledObjectmakeObject()throwsException{


Jedisjedis=null;
try{


jedis=newJedis(jedisSocketFactory,clientConfig);
//主要的耗時(shí)操作
jedis.connect();
//返回包裝對象
returnnewDefaultPooledObject<>(jedis);
}catch(JedisExceptionje){


if(jedis!=null){


try{


jedis.quit();
}catch(RuntimeExceptione){


logger.warn("ErrorwhileQUIT",e);
}
try{


jedis.close();
}catch(RuntimeExceptione){


logger.warn("Errorwhileclose",e);
}
}
throwje;
}
}

我們再來介紹一下對象的生成過程,如下圖,對象在進(jìn)行獲取時(shí),將首先嘗試從對象池里拿出一個(gè),如果對象池中沒有空閑的對象,就使用工廠類提供的方法,生成一個(gè)新的。

publicTborrowObject(finalDurationborrowMaxWaitDuration)throwsException{


//此處省略若干行
while(p==null){


create=false;
//首先嘗試從池子中獲取。
p=idleObjects.pollFirst();
//池子里獲取不到,才調(diào)用工廠內(nèi)生成新實(shí)例
if(p==null){


p=create();
if(p!=null){


create=true;
}
}
//此處省略若干行
}
//此處省略若干行
}

那對象是存在什么地方的呢?這個(gè)存儲(chǔ)的職責(zé),就是由一個(gè)叫作 LinkedBlockingDeque的結(jié)構(gòu)來承擔(dān)的,它是一個(gè)雙向的隊(duì)列。
接下來看一下 GenericObjectPoolConfig 的主要屬性:

//GenericObjectPoolConfig本身的屬性
privateintmaxTotal=DEFAULT_MAX_TOTAL;
privateintmaxIdle=DEFAULT_MAX_IDLE;
privateintminIdle=DEFAULT_MIN_IDLE;
//其父類BaseObjectPoolConfig的屬性
privatebooleanlifo=DEFAULT_LIFO;
privatebooleanfairness=DEFAULT_FAIRNESS;
privatelongmaxWaitMillis=DEFAULT_MAX_WAIT_MILLIS;
privatelongminEvictableIdleTimeMillis=DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS;
privatelongevictorShutdownTimeoutMillis=DEFAULT_EVICTOR_SHUTDOWN_TIMEOUT_MILLIS;
privatelongsoftMinEvictableIdleTimeMillis=DEFAULT_SOFT_MIN_EVICTABLE_IDLE_TIME_MILLIS;
privateintnumTestsPerEvictionRun=DEFAULT_NUM_TESTS_PER_EVICTION_RUN;
privateEvictionPolicyevictionPolicy=null;
//Only2.6.0applicationssetthis
privateStringevictionPolicyClassName=DEFAULT_EVICTION_POLICY_CLASS_NAME;
privatebooleantestOnCreate=DEFAULT_TEST_ON_CREATE;
privatebooleantestOnBorrow=DEFAULT_TEST_ON_BORROW;
privatebooleantestOnReturn=DEFAULT_TEST_ON_RETURN;
privatebooleantestWhileIdle=DEFAULT_TEST_WHILE_IDLE;
privatelongtimeBetweenEvictionRunsMillis=DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS;
privatebooleanblockWhenExhausted=DEFAULT_BLOCK_WHEN_EXHAUSTED;

參數(shù)很多,要想了解參數(shù)的意義,我們首先來看一下一個(gè)池化對象在整個(gè)池子中的生命周期。如下圖所示,池子的操作主要有兩個(gè):一個(gè)是業(yè)務(wù)線程,一個(gè)是檢測線程。

2d447c16-e897-11ed-ab56-dac502259ad0.png

對象池在進(jìn)行初始化時(shí),要指定三個(gè)主要的參數(shù):

  • maxTotal 對象池中管理的對象上限
  • maxIdle 最大空閑數(shù)
  • minIdle 最小空閑數(shù)

其中maxTotal 和業(yè)務(wù)線程有關(guān),當(dāng)業(yè)務(wù)線程想要獲取對象時(shí),會(huì)首先檢測是否有空閑的對象。如果有,則返回一個(gè);否則進(jìn)入創(chuàng)建邏輯。此時(shí),如果池中個(gè)數(shù)已經(jīng)達(dá)到了最大值,就會(huì)創(chuàng)建失敗,返回空對象。

對象在獲取的時(shí)候,有一個(gè)非常重要的參數(shù),那就是最大等待時(shí)間(maxWaitMillis),這個(gè)參數(shù)對應(yīng)用方的性能影響是比較大的。該參數(shù)默認(rèn)為 -1,表示永不超時(shí),直到有對象空閑。

如下圖,如果對象創(chuàng)建非常緩慢或者使用非常繁忙,業(yè)務(wù)線程會(huì)持續(xù)阻塞 (blockWhenExhausted 默認(rèn)為 true),進(jìn)而導(dǎo)致正常服務(wù)也不能運(yùn)行。

2d613162-e897-11ed-ab56-dac502259ad0.png

面試題

一般面試官會(huì)問:你會(huì)把超時(shí)參數(shù)設(shè)置成多大呢?

我一般都會(huì)把最大等待時(shí)間,設(shè)置成接口可以忍受的最大延遲。比如,一個(gè)正常服務(wù)響應(yīng)時(shí)間 10ms 左右,達(dá)到 1 秒鐘就會(huì)感覺到卡頓,那么這個(gè)參數(shù)設(shè)置成 500~1000ms 都是可以的。超時(shí)之后,會(huì)拋出 NoSuchElementException 異常,請求會(huì)快速失敗,不會(huì)影響其他業(yè)務(wù)線程,這種 Fail Fast 的思想,在互聯(lián)網(wǎng)應(yīng)用非常廣泛。

帶有evcit字樣的參數(shù),主要是處理對象逐出的。池化對象除了初始化和銷毀的時(shí)候比較昂貴,在運(yùn)行時(shí)也會(huì)占用系統(tǒng)資源。比如,連接池會(huì)占用多條連接,線程池會(huì)增加調(diào)度開銷等。業(yè)務(wù)在突發(fā)流量下,會(huì)申請到超出正常情況的對象資源,放在池子中。等這些對象不再被使用,我們就需要把它清理掉。

超出minEvictableIdleTimeMillis參數(shù)指定值的對象,就會(huì)被強(qiáng)制回收掉,這個(gè)值默認(rèn)是 30 分鐘;softMinEvictableIdleTimeMillis參數(shù)類似,但它只有在當(dāng)前對象數(shù)量大于 minIdle 的時(shí)候才會(huì)執(zhí)行移除,所以前者的動(dòng)作要更暴力一些。

還有4 個(gè) test 參數(shù):testOnCreate、testOnBorrow、testOnReturn、testWhileIdle,分別指定了在創(chuàng)建、獲取、歸還、空閑檢測的時(shí)候,是否對池化對象進(jìn)行有效性檢測。

開啟這些檢測,能保證資源的有效性,但它會(huì)耗費(fèi)性能,所以默認(rèn)為 false。生產(chǎn)環(huán)境上,建議只將testWhileIdle設(shè)置為 true,并通過調(diào)整空閑檢測時(shí)間間隔(timeBetweenEvictionRunsMillis),比如 1 分鐘,來保證資源的可用性,同時(shí)也保證效率。

JMH 測試

使用連接池和不使用連接池,它們之間的性能差距到底有多大呢?下面是一個(gè)簡單的 JMH 測試?yán)樱ㄒ妭}庫),進(jìn)行一個(gè)簡單的 set 操作,為 redis 的 key 設(shè)置一個(gè)隨機(jī)值。

@Fork(2)
@State(Scope.Benchmark)
@Warmup(iterations=5,time=1)
@Measurement(iterations=5,time=1)
@BenchmarkMode(Mode.Throughput)
publicclassJedisPoolVSJedisBenchmark{


JedisPoolpool=newJedisPool("localhost",6379);

@Benchmark
publicvoidtestPool(){


Jedisjedis=pool.getResource();
jedis.set("a",UUID.randomUUID().toString());
jedis.close();
}

@Benchmark
publicvoidtestJedis(){


Jedisjedis=newJedis("localhost",6379);
jedis.set("a",UUID.randomUUID().toString());
jedis.close();
}
//此處省略若干行
}

將測試結(jié)果使用 meta-chart 作圖,展示結(jié)果如下圖所示,可以看到使用了連接池的方式,它的吞吐量是未使用連接池方式的 5 倍!

2d7f3270-e897-11ed-ab56-dac502259ad0.png

數(shù)據(jù)庫連接池 HikariCP

HikariCP 源于日語“光る”,光的意思,寓意軟件工作速度和光速一樣快,它是 SpringBoot 中默認(rèn)的數(shù)據(jù)庫連接池。數(shù)據(jù)庫是我們工作中經(jīng)常使用到的組件,針對數(shù)據(jù)庫設(shè)計(jì)的客戶端連接池是非常多的,它的設(shè)計(jì)原理與我們在本文開頭提到的基本一致,可以有效地減少數(shù)據(jù)庫連接創(chuàng)建、銷毀的資源消耗。

同是連接池,它們的性能也是有差別的,下圖是 HikariCP 官方的一張測試圖,可以看到它優(yōu)異的性能,官方的 JMH 測試代碼見 Github。

2da5ffae-e897-11ed-ab56-dac502259ad0.png

一般面試題是這么問的:HikariCP 為什么快呢?主要有三個(gè)方面:

  • 它使用 FastList 替代 ArrayList,通過初始化的默認(rèn)值,減少了越界檢查的操作;
  • 優(yōu)化并精簡了字節(jié)碼,通過使用 Javassist,減少了動(dòng)態(tài)代理的性能損耗,比如使用 invokestatic 指令代替 invokevirtual 指令;
  • 實(shí)現(xiàn)了無鎖的 ConcurrentBag,減少了并發(fā)場景下的鎖競爭。

HikariCP 對性能的一些優(yōu)化操作,是非常值得我們借鑒的,在之后的博客中,我們將詳細(xì)分析幾個(gè)優(yōu)化場景。

數(shù)據(jù)庫連接池同樣面臨一個(gè)最大值(maximumPoolSize)和最小值(minimumIdle)的問題。這里同樣有一個(gè)非常高頻的面試題:你平常會(huì)把連接池設(shè)置成多大呢?

很多同學(xué)認(rèn)為,連接池的大小設(shè)置得越大越好,有的同學(xué)甚至把這個(gè)值設(shè)置成 1000 以上,這是一種誤解。根據(jù)經(jīng)驗(yàn),數(shù)據(jù)庫連接,只需要 20~50 個(gè)就夠用了。具體的大小,要根據(jù)業(yè)務(wù)屬性進(jìn)行調(diào)整,但大得離譜肯定是不合適的。

HikariCP 官方是不推薦設(shè)置 minimumIdle 這個(gè)值的,它將被默認(rèn)設(shè)置成和 maximumPoolSize 一樣的大小。如果你的數(shù)據(jù)庫Server端連接資源空閑較大,不妨也可以去掉連接池的動(dòng)態(tài)調(diào)整功能。

另外,根據(jù)數(shù)據(jù)庫查詢和事務(wù)類型,一個(gè)應(yīng)用中是可以配置多個(gè)數(shù)據(jù)庫連接池的,這個(gè)優(yōu)化技巧很少有人知道,在此簡要描述一下。

業(yè)務(wù)類型通常有兩種:一種需要快速的響應(yīng)時(shí)間,把數(shù)據(jù)盡快返回給用戶;另外一種是可以在后臺(tái)慢慢執(zhí)行,耗時(shí)比較長,對時(shí)效性要求不高。如果這兩種業(yè)務(wù)類型,共用一個(gè)數(shù)據(jù)庫連接池,就容易發(fā)生資源爭搶,進(jìn)而影響接口響應(yīng)速度。雖然微服務(wù)能夠解決這種情況,但大多數(shù)服務(wù)是沒有這種條件的,這時(shí)就可以對連接池進(jìn)行拆分。

如圖,在同一個(gè)業(yè)務(wù)中,根據(jù)業(yè)務(wù)的屬性,我們分了兩個(gè)連接池,就是來處理這種情況的。

2db8fc58-e897-11ed-ab56-dac502259ad0.png

HikariCP 還提到了另外一個(gè)知識(shí)點(diǎn),在 JDBC4 的協(xié)議中,通過 Connection.isValid() 就可以檢測連接的有效性。這樣,我們就不用設(shè)置一大堆的 test 參數(shù)了,HikariCP 也沒有提供這樣的參數(shù)。

結(jié)果緩存池

到了這里你可能會(huì)發(fā)現(xiàn)池(Pool)與緩存(Cache)有許多相似之處。

它們之間的一個(gè)共同點(diǎn),就是將對象加工后,存儲(chǔ)在相對高速的區(qū)域。我習(xí)慣性將緩存看作是數(shù)據(jù)對象,而把池中的對象看作是執(zhí)行對象。緩存中的數(shù)據(jù)有一個(gè)命中率問題,而池中的對象一般都是對等的。

考慮下面一個(gè)場景,jsp 提供了網(wǎng)頁的動(dòng)態(tài)功能,它可以在執(zhí)行后,編譯成 class 文件,加快執(zhí)行速度;再或者,一些媒體平臺(tái),會(huì)將熱門文章,定時(shí)轉(zhuǎn)化成靜態(tài)的 html 頁面,僅靠 nginx 的負(fù)載均衡即可應(yīng)對高并發(fā)請求(動(dòng)靜分離)。

這些時(shí)候,你很難說清楚,這是針對緩存的優(yōu)化,還是針對對象進(jìn)行了池化,它們在本質(zhì)上只是保存了某個(gè)執(zhí)行步驟的結(jié)果,使得下次訪問時(shí)不需要從頭再來。我通常把這種技術(shù)叫作結(jié)果緩存池(Result Cache Pool),屬于多種優(yōu)化手段的綜合。

小結(jié)

下面我來簡單總結(jié)一下本文的內(nèi)容重點(diǎn):

我們從Java 中最通用的公用池化包 Commons Pool 2 說起,介紹了它的一些實(shí)現(xiàn)細(xì)節(jié),并對一些重要參數(shù)的應(yīng)用做了講解;Jedis 就是在 Commons Pool 2 的基礎(chǔ)上封裝的,通過 JMH 測試,我們發(fā)現(xiàn)對象池化之后,有了接近 5 倍的性能提升;接下來介紹了數(shù)據(jù)庫連接池中速度速快的 HikariCP ,它在池化技術(shù)之上,又通過編碼技巧進(jìn)行了進(jìn)一步的性能提升,HikariCP 是我重點(diǎn)研究的類庫之一,我也建議你加入自己的任務(wù)清單中。

總體來說,當(dāng)你遇到下面的場景,就可以考慮使用池化來增加系統(tǒng)性能:

  • 對象的創(chuàng)建或者銷毀,需要耗費(fèi)較多的系統(tǒng)資源;
  • 對象的創(chuàng)建或者銷毀,耗時(shí)長,需要繁雜的操作和較長時(shí)間的等待;
  • 對象創(chuàng)建后,通過一些狀態(tài)重置,可被反復(fù)使用。

將對象池化之后,只是開啟了第一步優(yōu)化。要想達(dá)到最優(yōu)性能,就不得不調(diào)整池的一些關(guān)鍵參數(shù),合理的池大小加上合理的超時(shí)時(shí)間,就可以讓池發(fā)揮更大的價(jià)值。和緩存的命中率類似,對池的監(jiān)控也是非常重要的。

如下圖,可以看到數(shù)據(jù)庫連接池連接數(shù)長時(shí)間保持在高位不釋放,同時(shí)等待的線程數(shù)急劇增加,這就能幫我們快速定位到數(shù)據(jù)庫的事務(wù)問題。

2dd30300-e897-11ed-ab56-dac502259ad0.png

平常的編碼中,有很多類似的場景。比如 Http 連接池,Okhttp 和 Httpclient 就都提供了連接池的概念,你可以類比著去分析一下,關(guān)注點(diǎn)也是在連接大小和超時(shí)時(shí)間上;在底層的中間件,比如 RPC,也通常使用連接池技術(shù)加速資源獲取,比如 Dubbo 連接池、 Feign 切換成 httppclient 的實(shí)現(xiàn)等技術(shù)。

你會(huì)發(fā)現(xiàn),在不同資源層面的池化設(shè)計(jì)也是類似的。比如線程池,通過隊(duì)列對任務(wù)進(jìn)行了二層緩沖,提供了多樣的拒絕策略等,線程池我們將在后續(xù)的文章中進(jìn)行介紹。線程池的這些特性,你同樣可以借鑒到連接池技術(shù)中,用來緩解請求溢出,創(chuàng)建一些溢出策略?,F(xiàn)實(shí)情況中,我們也會(huì)這么做。那么具體怎么做?有哪些做法?這部分內(nèi)容就留給大家思考了,歡迎你在下方留言,與大家一起分享討論。

點(diǎn)也是在連接大小和超時(shí)時(shí)間上;在底層的中間件,比如 RPC,也通常使用連接池技術(shù)加速資源獲取,比如 Dubbo 連接池、 Feign 切換成 httppclient 的實(shí)現(xiàn)等技術(shù)。


審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • API
    API
    +關(guān)注

    關(guān)注

    2

    文章

    1507

    瀏覽量

    62214
  • TCP
    TCP
    +關(guān)注

    關(guān)注

    8

    文章

    1374

    瀏覽量

    79159
  • 數(shù)據(jù)庫
    +關(guān)注

    關(guān)注

    7

    文章

    3839

    瀏覽量

    64543

原文標(biāo)題:換上 HikariCP 連接池,太快了!

文章出處:【微信號(hào):AndroidPush,微信公眾號(hào):Android編程精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    PostgreSQL 如何進(jìn)行緩存管理

    為了提高數(shù)據(jù)訪問的速度,一般數(shù)據(jù)庫操作系統(tǒng)都會(huì)引入內(nèi)存作為緩存,而為了方便管理和合并I/O,一般會(huì)開辟一個(gè)緩存(buffer pool)。
    發(fā)表于 11-01 09:41 ?2122次閱讀
    PostgreSQL 如何進(jìn)行緩存<b class='flag-5'>池</b>管理

    [分享]詳細(xì)解讀Hibernate的作用

    應(yīng)用中根據(jù)自己的需要進(jìn)行取舍。   下載Hibernate,例如2.0.3穩(wěn)定版本,解壓縮,可以看到一個(gè)hibernate2.jar和lib目錄下有22個(gè)jar:  
    發(fā)表于 03-23 15:29

    將網(wǎng)格服務(wù)器添加到現(xiàn)有

    我目前有一個(gè)xenserver,在4臺(tái)服務(wù)器上運(yùn)行大約500個(gè)xendesktops。我購買了一臺(tái)帶有2x k1網(wǎng)格的額外服務(wù)器,我想將它添加到池中。我將創(chuàng)建一個(gè)cad系統(tǒng)目錄,我將分配給該服
    發(fā)表于 09-05 09:35

    DevEco開發(fā)求助:找不到org.apache.commons.pool2.impl.GenericObjectPoolConfig的類文件

    華為DevEco Studio開發(fā)遇到的一個(gè)問題目前在嘗試跑通網(wǎng)上一個(gè)開源的服務(wù)器之前有過一個(gè)報(bào)錯(cuò),jedis的一個(gè)報(bào)錯(cuò),導(dǎo)入pool2后錯(cuò)誤解決,但是出現(xiàn)如下新的報(bào)錯(cuò)。運(yùn)行報(bào)錯(cuò):(如圖
    發(fā)表于 08-07 15:32

    線程創(chuàng)建的兩種方法

    ):print('running thread-{}:{}'.format(threading.get_ident(), i))time.sleep(1)# 創(chuàng)建一個(gè)最大容納數(shù)量為5的線程pool
    發(fā)表于 03-16 16:15

    詳解移動(dòng)通信領(lǐng)域里的組POOL

    在移動(dòng)通信領(lǐng)域,我們經(jīng)常會(huì)提到Pool的概念。Pool,通常譯為水塘、水池。在移動(dòng)通信中POOL通稱為“
    的頭像 發(fā)表于 03-19 16:15 ?7918次閱讀
    詳解移動(dòng)通信領(lǐng)域里的組<b class='flag-5'>POOL</b>

    比特幣現(xiàn)金的硬分叉臨近,SV-Pool已正式宣布面向礦工開放礦

    隨著比特幣現(xiàn)金協(xié)議升級(jí)的臨近,相關(guān)的組織正在積極為硬分叉做準(zhǔn)備。數(shù)據(jù)網(wǎng)站例如Coin Dance已經(jīng)添加關(guān)于特性支持、升級(jí)投票、公眾意見的統(tǒng)計(jì)數(shù)據(jù)。同時(shí),Nchain支持下的SV-Pool已正式宣布面向礦工開放礦
    發(fā)表于 10-26 11:02 ?1501次閱讀

    Linux 內(nèi)存源碼淺析

    內(nèi)存(Memery Pool)技術(shù)是在真正使用內(nèi)存之前,先申請分配一定數(shù)量的、大小相等(一般情況下)的內(nèi)存塊留作備用。當(dāng)有新的內(nèi)存需求時(shí),就從內(nèi)存池中分出一部分內(nèi)存塊,若內(nèi)存塊不夠
    發(fā)表于 04-02 14:32 ?263次閱讀

    如何利用階層Stratum V2協(xié)議來改善比特幣的去中心

    于2010年,自2013年以來一直運(yùn)營Slush Pool。因此他們有能力設(shè)計(jì)V2協(xié)議,從而解決一些礦和礦工使用原始協(xié)議時(shí),遇到最大的問題。
    發(fā)表于 12-10 08:49 ?921次閱讀

    如何正確使用SpringBoot中的線程

    來自丨CSDN https://blog.csdn.net/m0_37701381/article/details/81072774 使用步驟 先創(chuàng)建一個(gè)線程的配置,讓Spring Boot加載
    的頭像 發(fā)表于 09-02 17:14 ?2115次閱讀

    p2pool比特幣挖礦

    p2pool.zip
    發(fā)表于 06-06 14:43 ?1次下載
    p<b class='flag-5'>2pool</b>比特幣挖礦<b class='flag-5'>池</b>

    ModBus Pool下載

    ModBus Pool下載
    發(fā)表于 10-08 09:41 ?6次下載

    線程的線程怎么釋放

    從線程分組看,pool名開頭線程占616條,而且waiting狀態(tài)也是616條,這個(gè)點(diǎn)就非??梢闪?,我斷定就是這個(gè)pool開頭線程導(dǎo)致的問題。我們先排查為何這個(gè)線程池中會(huì)有600+的線程處于waiting狀態(tài)并且無法釋放,記接
    發(fā)表于 07-31 10:49 ?2315次閱讀
    線程<b class='flag-5'>池</b>的線程怎么釋放

    了解連接、線程、內(nèi)存、異步請求

    技術(shù) 技術(shù)能夠減少資源對象的創(chuàng)建次數(shù),提?程序的響應(yīng)性能,特別是在?并發(fā)下這種提?更加明顯。使用
    的頭像 發(fā)表于 11-09 14:44 ?1420次閱讀
    了解連接<b class='flag-5'>池</b>、線程<b class='flag-5'>池</b>、內(nèi)存<b class='flag-5'>池</b>、異步請求<b class='flag-5'>池</b>

    技術(shù)的應(yīng)用實(shí)踐

    作為一名Java開發(fā)人員,技術(shù)或多或少在業(yè)務(wù)代碼中使用。常見的包括線程、連接等。也是因?yàn)镴ava語言超級(jí)豐富的基建,基本上這些
    的頭像 發(fā)表于 11-24 10:22 ?551次閱讀
    <b class='flag-5'>池</b><b class='flag-5'>化</b>技術(shù)的應(yīng)用實(shí)踐