资源对象的池化, java极简实现,close资源时,自动回收

在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对象可能还需要进行可用性检测等。

 

posted @   周双  阅读(795)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示