最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

利用Apache?Common將java對象池化的問題

 更新時(shí)間:2022年06月14日 09:39:44   作者:范閑  
對象被創(chuàng)建后,使用完畢不是立即銷毀回收對象,而是將對象放到一個容器保存起來,下次使用的時(shí)候不用創(chuàng)建對象,而是從容器中直接獲取,這篇文章主要介紹了利用Apache?Common將java對象“池化”,需要的朋友可以參考下

什么是對象池化?

對象被創(chuàng)建后,使用完畢不是立即銷毀回收對象,而是將對象放到一個容器保存起來,下次使用的時(shí)候不用創(chuàng)建對象,而是從容器中直接獲取。

什么樣的對象需要池化?

一般需要池化的對象往往都是比"重量級"較的對象,創(chuàng)建和銷毀都比較耗時(shí),比如我們的"線程","數(shù)據(jù)庫鏈接對象","tcp鏈接對象", "FTP鏈接對象" 等等。

對象池化的好處?

這些對象池化后,之后使用的時(shí)候不用創(chuàng)建,直接使用即可,可以大大縮短程序的運(yùn)行時(shí)間,以及創(chuàng)建對象時(shí)對CPU資源的消耗,以及對系統(tǒng)資源的控制(池化的對象數(shù)量有限,不會一直創(chuàng)建對象,導(dǎo)致系統(tǒng)資源耗盡,或者造成程序OOM的情況)進(jìn)而提高系統(tǒng)的穩(wěn)定性。

對象池化后需要注意什么?

這些被池化的對象都有一個特點(diǎn),都是"活的",比如數(shù)據(jù)庫鏈接對象內(nèi)部一般保存了一個TCP鏈接,所以,這個對象"能用"的前提是這個TCP鏈接是有效的,線程對象"能用"的前提是線程的狀態(tài)不是"凋亡"狀態(tài),所以我們有必要定期對對象的"健康狀態(tài)"進(jìn)行檢查,剔除掉"不能用"的對象,并填充新的對象給"對象池"。

使用apache-common-pool池化對象

  • 引入依賴
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
            <version>2.9.0</version>
        </dependency>
  • 需要池化的對象示例
public class Foo {
    private final String username;
    public Foo(String username) {
        this.username = username;
    }
    public String getUsername() {
        return username;
    }
}
  • 構(gòu)建對象創(chuàng)建工廠

可以直接實(shí)現(xiàn)org.apache.commons.pool2.PooledObjectFactory<T>接口實(shí)現(xiàn)創(chuàng)建、銷毀、鈍化、取消等接口,也可以使用他的抽象類,實(shí)現(xiàn)創(chuàng)建和包裝方法即可。

public class FooPoolObjectFactory extends BasePooledObjectFactory<Foo> {
    @Override
    public Foo create() throws Exception {
        return new Foo(String.valueOf(RandomUtils.randomInt(0, 10)));
    }
    @Override
    public PooledObject<Foo> wrap(Foo obj) {
        return new DefaultPooledObject<>(obj);
    }
}
  • 實(shí)現(xiàn)驅(qū)逐策略

一般數(shù)據(jù)庫鏈接對象,要定期進(jìn)行心跳,確保鏈接可用,如果鏈接斷開,需要銷毀對象,并重新創(chuàng)建新的對象。common-pool中,我們可以實(shí)現(xiàn)驅(qū)逐策略,對對象進(jìn)行定期檢查

public class FooEvictionPolicy implements EvictionPolicy<Foo> {
    @Override
    public boolean evict(EvictionConfig config, PooledObject<Foo> underTest, int idleCount) {
        // todo  定期檢查對象某些功能是否可用
        return true;
    }
}
  • 構(gòu)建&配置對象池
    public GenericObjectPool<Foo> fooGenericObjectPool() {
        GenericObjectPoolConfig<Foo> poolConfig = new GenericObjectPoolConfig<>();
        poolConfig.setEvictionPolicy(new FooEvictionPolicy());
        poolConfig.setBlockWhenExhausted(true);
        poolConfig.setJmxEnabled(false);
        poolConfig.setMaxWaitMillis(1000 * 10);
        poolConfig.setTimeBetweenEvictionRunsMillis(60 * 1000);
        poolConfig.setMinEvictableIdleTimeMillis(20 * 1000);
        poolConfig.setTestWhileIdle(true);
        poolConfig.setTestOnReturn(true);
        poolConfig.setTestOnBorrow(true);
        poolConfig.setMaxTotal(3);
        // 設(shè)置拋棄策略
        AbandonedConfig abandonedConfig = new AbandonedConfig();
        abandonedConfig.setRemoveAbandonedOnMaintenance(true);
        abandonedConfig.setRemoveAbandonedOnBorrow(true);
        return new GenericObjectPool<>(new FooPoolObjectFactory(), poolConfig, abandonedConfig);
    }

如果我們使用的是spring容器,一般我們需要將該對象交由spring管理。

  • 獲取&歸還對象
    private final GenericObjectPool<Foo> fooGenericObjectPool = fooGenericObjectPool();
    public Foo borrowFoo () throws Exception {
        return fooGenericObjectPool.borrowObject();
    }
    public void returnObject(Foo foo){
        fooGenericObjectPool.returnObject(foo);
    }

到此這篇關(guān)于利用Apache Common將java對象“池化”的文章就介紹到這了,更多相關(guān)Apache Common java對象池化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • CentOS7增加或修改SSH端口號的方法

    CentOS7增加或修改SSH端口號的方法

    這篇文章主要介紹了CentOS7增加或修改SSH端口號的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • Ubuntu配置靜態(tài)IP的兩種方法

    Ubuntu配置靜態(tài)IP的兩種方法

    在本教程中,您將了解有關(guān) Ubuntu 靜態(tài) IP 地址配置的所有信息,我們將為讀者Ubuntu配置靜態(tài)IP的兩種方法以及詳細(xì)的配置過程,通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2024-10-10
  • linux創(chuàng)建用戶,添加及修改shell方式

    linux創(chuàng)建用戶,添加及修改shell方式

    這篇文章主要介紹了linux創(chuàng)建用戶,添加及修改shell方式。具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • linux系統(tǒng)下MongoDB單節(jié)點(diǎn)安裝教程

    linux系統(tǒng)下MongoDB單節(jié)點(diǎn)安裝教程

    這篇文章主要給大家介紹了在linux系統(tǒng)下mongo在單節(jié)點(diǎn)安裝的方法教程,文中將實(shí)現(xiàn)的方法一步步介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起看看吧。
    2017-10-10
  • 淺談Linux下免密碼切換到root用戶當(dāng)注意的問題

    淺談Linux下免密碼切換到root用戶當(dāng)注意的問題

    下面小編就為大家?guī)硪黄獪\談Linux下免密碼切換到root用戶當(dāng)注意的問題。小編覺得挺不錯的?,F(xiàn)在就分享給大家。也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • linux命令行報(bào)錯bash command not found問題及解決

    linux命令行報(bào)錯bash command not found問題及解決

    這篇文章主要介紹了linux命令行報(bào)錯bash command not found問題及解決,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Linux中/var/spool/postfix/maildrop占空間很大的原因解析

    Linux中/var/spool/postfix/maildrop占空間很大的原因解析

    這篇文章主要給大家介紹了關(guān)于Linux中/var/spool/postfix/maildrop占空間很大的原因解析,文中介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-04-04
  • Linux系統(tǒng)文件的默認(rèn)權(quán)限和特殊權(quán)限

    Linux系統(tǒng)文件的默認(rèn)權(quán)限和特殊權(quán)限

    這篇文章主要介紹了Linux系統(tǒng)文件的默認(rèn)權(quán)限和特殊權(quán)限的相關(guān)知識,非常不錯,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-10-10
  • centos7之如何進(jìn)行ip和端口限制

    centos7之如何進(jìn)行ip和端口限制

    這篇文章主要介紹了centos7之如何進(jìn)行ip和端口限制問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Apache服務(wù)器關(guān)閉TRACE Method請求方式的方法

    Apache服務(wù)器關(guān)閉TRACE Method請求方式的方法

    這篇文章主要介紹了Apache服務(wù)器關(guān)閉TRACE Method請求方式的方法,因?yàn)橹С衷摲绞降姆?wù)器存在跨站腳本漏洞,需要的朋友可以參考下
    2014-06-06

最新評論

瑞丽市| 广昌县| 合江县| 固始县| 河津市| 育儿| 洛隆县| 中江县| 玉山县| 城固县| 泗阳县| 新泰市| 图木舒克市| 湘阴县| 平安县| 诸暨市| 塔河县| 鹤壁市| 云霄县| 定陶县| 冕宁县| 益阳市| 项城市| 秭归县| 马尔康县| 岑巩县| 南木林县| 阿拉尔市| 建平县| 沭阳县| 临夏市| 桃江县| 杨浦区| 瓮安县| 五台县| 通江县| 临泉县| 呼伦贝尔市| 左云县| 剑河县| 达孜县|