在java程序中对于资源,例如数据库连接,这类不能并行共享的资源对象,一般采用资源池的方式进行管理。

资源池一般要实现 1)获取资源对象 getObject():   从资源池中取出对象

2) returnObject() :   资源用完以后,将资源放回对象池

3) 资源对象(代理)调用close()方法时, 资源返回对象池。  对于有close方法的资源,一般是采用此方式。

以下是一个非常简单的资源对象池的实现

public class SimplePool<T> {
// 回收资源的方法名
private String closemethod = "close";private LinkedBlockingQueue<T> sources = new LinkedBlockingQueue<T>();
private List<T> origins = new ArrayList<T>();
public SimplePool(){
} public T getSource() throws InterruptedException {
return this.sources.take();
} /**
* 将资源加入到池中, 并为资源对象生成代理对象,放到队列中。
* @param t
*/
public synchronized void addSource(T t) {
origins.add(t);
Handler handler = new Handler(t);
T pt = (T) Proxy.newProxyInstance(t.getClass().getClassLoader(), t.getClass().getInterfaces(), handler);
sources.offer(pt);
} /**
* Java 动态代理实现的InvocationHandler, 代理对象调用close方法时,
* 将资源带来对象放回到队列中,从而实现资源自动回收
*/
class Handler implements InvocationHandler {
Handler(T t) {
target = t;
}
T target;
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (method.getName().equalsIgnoreCase(SimplePool.this.closemethod)) {
SimplePool.this.sources.put((T) proxy);
return null;
}
return method.invoke(target, args);
}
} /**
* 获取可用资源数量
* @return
*/
public int count() {
return sources.size();
} /**
* 获取已放入池中的资源数量
* @return
*/
public int size(){
return this.origins.size();
}
}

这个资源池的代码非常简单, 当然,还可以在代码中增加 ObjectFactory<T> 的工厂对象,在getSource方法中,但资源不足时,就可以调用这ObjectFactory<T>生成新的资源对象。另外,像connection对象可能还需要进行可用性检测等。

资源对象的池化, java极简实现,close资源时,自动回收的更多相关文章

  1. java——极简handler机制

    handler机制要做的事情: 1.把一堆从四面八方传来的message加到一个队列中,这个队列就是MessageQueue. 2.将MessageQueue中的队头Message取出,并使用这个me ...

  2. 对象池化技术 org.apache.commons.pool

    恰当地使用对象池化技术,可以有效地减少对象生成和初始化时的消耗,提高系统的运行效率.Jakarta Commons Pool组件提供了一整套用于实现对象池化的框架,以及若干种各具特色的对象池实现,可以 ...

  3. [翻译] 编写高性能 .NET 代码--第二章 GC -- 将长生命周期对象和大对象池化

    将长生命周期对象和大对象池化 请记住最开始说的原则:对象要么立即回收要么一直存在.它们要么在0代被回收,要么在2代里一直存在.有些对象本质是静态的,生命周期从它们被创建开始,到程序停止才会结束.其它对 ...

  4. 池化 - Apache Commons Pool

    对于那些创建耗时较长,或者资源占用较多的对象,比如网络连接,线程之类的资源,通常使用池化来管理这些对象,从而达到提高性能的目的.比如数据库连接池(c3p0, dbcp), java的线程池 Execu ...

  5. 《Mybatis 手撸专栏》第6章:数据源池化技术实现

    作者:小傅哥 博客:https://bugstack.cn - 手写Mybatis系列文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 码农,只会做不会说? 你有发现吗,其实很大一部分码农 ...

  6. Java--对象池化技术 org.apache.commons.pool2.ObjectPool

    org.apache.commons.pool2.ObjectPool提供了对象池,开发的小伙伴们可以直接使用来构建一个对象池 使用该对象池具有两个简单的步骤: 1.创建对象工厂,org.apache ...

  7. 使用ArrayPool池化大型数组(翻译)

    原文链接:https://adamsitnik.com/Array-Pool/ 使用ArrayPool 简介 .NET的垃圾收集器(GC)实现了许多性能优化,其中之一就是,设定年轻的对象很快消亡,然而 ...

  8. [DeeplearningAI笔记]卷积神经网络1.9-1.11池化层/卷积神经网络示例/优点

    4.1卷积神经网络 觉得有用的话,欢迎一起讨论相互学习~Follow Me 1.9池化层 优点 池化层可以缩减模型的大小,提高计算速度,同时提高所提取特征的鲁棒性. 池化层操作 池化操作与卷积操作类似 ...

  9. 池化技术之Java线程池

     https://blog.csdn.net/jcj_2012/article/details/84906657 作用 线程池,通过复用线程来提升性能; 背景 线程是一个操作系统概念.操作系统负责这个 ...

随机推荐

  1. OKR案例——不同类型的OKR实例

    OKR是一种能将团队调动起来一起向着一个方向去努力的绝佳目标管理法,它让我们的团队去挑战自己的极限,去实现更大的价值,去将我们的战略最完美的转化为成果. 然而,想要让OKR在我们的团队中发挥作用,制定 ...

  2. ent 基本使用十七 分页与排序

    ent 提供了方便的数据分页以及排序处理 limit 分页 users, err := client.User. Query(). Limit(n). All(ctx) offset 分页 users ...

  3. zabbix_server [22842]: cannot open log: cannot create semaphore set: [28] No space left on device

    zabbix server服务没启动,查看日志显示 zabbix_server [22842]: cannot open log: cannot create semaphore set: [28] ...

  4. git 提交代码报错failed to push some refs to 解决笔记

    Administrator@SC- MINGW64 /e/gitrepository (master) $ git push django master To github.com:zgc137/dj ...

  5. luogu P1550 [USACO08OCT]打井Watering Hole

    题目背景 John的农场缺水了!!! 题目描述 Farmer John has decided to bring water to his N (1 <= N <= 300) pastur ...

  6. SQL基础-存储过程&触发器

    一.存储过程 1.存储过程简介 存储过程: 一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,然后通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它. 存储过程的创建: ...

  7. selenuim自动化爬取汽车在线谷米爱车网车辆GPS数据爬虫

    #为了实时获取车辆信息,以及为了后面进行行使轨迹绘图,写了一个基于selelnium的爬虫爬取了车辆gps数据. #在这里发现selenium可以很好的实现网页解析和处理js处理 #导包 import ...

  8. ERA-Interim数据学习

    1.气象再分析数据有很多种,看文献里用到的主要有这几种 ECWRF——ERA-Interim,分辨率0.125°,欧洲的 MERRA-2,分辨率0.625°*0.5°,NASA的 GEOS-5FP,分 ...

  9. UDF——查找单元的相邻单元

    Fluent版本:Fluent 19.2 Visual Studio版本:Visual Studio 2013 测试文件及源码下载链接: https://pan.baidu.com/s/1AZ59hs ...

  10. Content-type解析

    一.是什么? 是Http的实体首部字段,用于说明请求或返回的消息主体是用何种方式编码,在request header和response header里都存在. Content-Type(内容类型),一 ...