缓冲&缓存&对象池概念的理解

倖福魔咒の 提交于 2021-01-16 04:55:06

一)、缓冲

作用:缓解程序上下层之间的性能差异。

1)、当上层组件的性能优于下层组件时加入缓冲机制可以减少上层组件对下

	   层组件的等待时间。

2)、上层组件不需要等待下层组件接收全部数据,即可返回操作,加快了上

	    层组件的处理速度。

缓冲的应用:

JDK的I/O组件提供了缓冲功能。

例:当对文件进行写操作时需要从内存中读取数据写入到硬盘,此时,文件从

	内存中的读取速度比写入硬盘的速度快,此时就出现了上层组件的性能优

	于下层组件的情况,此时可以加入缓冲机制BufferInputStream()先将数据

	写入缓冲区,再将数据写道硬盘中。

二)、缓存

定义:是一块为提高系统性能的内存空间。

作用:暂存数据处理结果,并提供下次访问使用。

应用场景:

数据处理或数据获取可能会非常耗时,当数据的请求量很大时,频繁的数据处

理会耗尽cpu资源。

简单缓存的实现:直接使用HashMap

弊端:

1)、不知道应该何时清理无效数据。

2)、如何防止数据过多导致内存溢出。

基于java的缓存框架:
  1. EHCache: Hibernate默认的数据缓存解决方案。

  2. OSCache: 由OpenSymphony设计的,可以缓存任何对象,甚至是缓存 部分JSP页面,或者Http请求。

  3. JBossCache: 由JBoss开发,可用于JBoss集群间数据共享的缓存框架。

    缓存的应用:建议在频繁使用且重负载的的函数中加入缓存,以提高它在频繁调用的性能,可以根据传入的参数构建key。

    基于动态代理的缓存解决方案:

     1).在方法中加入缓存的弊端:缓存组件和业务层代码紧密耦合,依赖性强。
    
    1. . 使用动态代理实现缓存好处:在业务层,无需关注对缓存的操作,代码被完全独立并隔离,对一个新的函数方法,加入缓存不会影响原有方法的实现。

三)、对象复用池

对象池化:若一个类被频繁请求使用,则将这个类的实例保存在一个池中,使用时,直接从池中获取。

对象池可以是一个数组、链表或任何集合类。

对象池的应用:

1)、线程池:

2)、数据库连接池

广泛使用的数据连接池组件:

1)、c3p0连接池 2)、ProXool连接池

c3p0连接池的实现:

Connection con = pool.getConnection()

con的类类型:com.mchange.V2.c3p0.impl.NewProxyConnection

1)、通过数据连接池对象调用getConnection获取数据库连接对象,此时得到的 Connection对象时一个NewProxyConnection代理对象.

2)、实际的数据库连接对象是在Connection中的一个内部类对象来连接获取的

    Object re = f.get()

    re的类类型:com.msql.jdbc.JDBC4Connection

 Field  f =  con.getClass().getDeclaredFiled("inner") //通过反射获取内部类对象
 Object re = f.get() //获取实际的数据库连接

结论:当调用con.close()并没有真正的关闭数据库的连接,而是将数据库连接放入数据库连接池保存,当用户第二次调用getConnection时从连接池中获取 连接对象。

四)、Jakarta commons Pool对象池组件

Jakarta commons Poll对象池组件由Apache提供。

定义了两个接口:

ObjectPool(对象池接口)

public interface ObjectPool{
    //从对象池中取一个对象
    T boorowObject();
    //将对象返回给对象池
    void returnObject(T boorowed);
}

PoolableObjectFactory : 对象池管理工厂

public interface PoolableObjectFactory{
    //创建对象,若对象池没有对象,在borrowObject()时会自动调用
    T MakeObject();
    //在创建对象前使用,激活对象
    void activateObject(T Object);
    //在对象返回对象池时使用
    void passivateObject(T Object);
    //判断对象是否可用
    void validateObject(T Object);
    //pool.close()对象从对象池中销毁使用
    void destoryObject(T Object);
}

内置定义了3个对象池

1)、StackObjectPool

使用java.util.Stack来保存对象,可以指定初始化大小,当空间不够时,可以自

     动增长,无可用对象时,可以自动创建新对象。

2)、GenericObjectPool

通用对象池,可以设定对象池的容量,可设定无可用对象时,对象池的表现行

    为(等待或创建新实例),可以设置对象有效性检查

3)、softReferenceObjectPool

使用ArrayList保存对象,不保存对象的强引用,只保存对象的弱引用,对对象

数量没有限制,当没有对象时会自动创建对象,当内存紧张时,Jvm自动回收

具有弱引用对象。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!