高吞吐量系统(3)

由于 EhCache 是进程中的缓存系统,一旦将应用部署在集群环境中,每一个节点维护各自的缓存数据,当某个节点���缓存数据进行更新,这些更新的数据无法在其它节点中共享,这不仅会降低节点运行的效率,而且会导致数据不同步的情况发生。例如某个网站采用 A、B 两个节点作为集群部署,当 A 节点的缓存更新后,而 B 节点缓存尚未更新就可能出现用户在浏览页面的时候,一会是更新后的数据,一会是尚未更新的数据,尽管我们也可以通过 Session Sticky 技术来将用户锁定在某个节点上,但对于一些交互性比较强或者是非 Web 方式的系统来说,Session Sticky 显然不太适合。所以就需要用到 EhCache 的集群解决方案。清单 7 所示是 EHCache 示例代码。

清单 7.EHCache 示例代码 import net.sf.ehcache.Cache; import net.sf.ehcache.CacheManager; import net.sf.ehcache.Element; /** * 第一步:生成 CacheManager 对象 * 第二步:生成 Cache 对象 * 第三步:向 Cache 对象里添加由 key,value 组成的键值对的 Element 元素 * @author mahaibo * */ public class EHCacheDemo{ public static void main(String[] args) { //指定 ehcache.xml 的位置 String fileName="E://1008//workspace//ehcachetest//ehcache.xml"; CacheManager manager = new CacheManager(fileName); //取出所有的 cacheName String names[] = manager.getCacheNames(); for(int i=0;i<names.length;i++){ System.out.println(names[i]); } //根据 cacheName 生成一个 Cache 对象 //第一种方式: Cache cache=manager.getCache(names[0]); //第二种方式,ehcache 里必须有 defaultCache 存在,"test"可以换成任何值 // Cache cache = new Cache("test", 1, true, false, 5, 2); // manager.addCache(cache); //向 Cache 对象里添加 Element 元素,Element 元素有 key,value 键值对组成 cache.put(new Element("key1","values1")); Element element = cache.get("key1"); System.out.println(element.getValue()); Object obj = element.getObjectValue(); System.out.println((String)obj); manager.shutdown(); } }

对象复用

对象复用池是目前很常用的一种系统优化技术。它的核心思想是,如果一个类被频繁请求使用,那么不必每次都生成一个实例,可以将这个类的一些实例保存在一个“池”中,待需要使用的时候直接从池中获取。这个“池”就称为对象池。在实现细节上,它可能是一个数组,一个链表或者任何集合类。对象池的使用非常广泛,例如线程池和数据库连接池。线程池中保存着可以被重用的线程对象,当有任务被提交到线程时,系统并不需要新建线程,而是从池中获得一个可用的线程,执行这个任务。在任务结束后,不需要关闭线程,而将它返回到池中,以便下次继续使用。由于线程的创建和销毁是较为费时的工作,因此,在线程频繁调度的系统中,线程池可以很好地改善性能。数据库连接池也是一种特殊的对象池,它用于维护数据库连接的集合。当系统需要访问数据库时,不需要重新建立数据库连接,而可以直接从池中获取;在数据库操作完成后,也不关闭数据库连接,而是将连接返回到连接池中。由于数据库连接的创建和销毁是重量级的操作,因此,避免频繁进行这两个操作对改善系统的性能也有积极意义。目前应用较为广泛的数据库连接池组件有 C3P0 和 Proxool。

以 C3P0 为例,它是一个开源的 JDBC 连接池,它实现了数据源和 JNDI 绑定,支持 JDBC3 规范和 JDBC2 的标准扩展。目前使用它的开源项目有 Hibernate,Spring 等。如果采用 JNDI 方式配置,如清单 8 所示。

清单 8.Tomcat 数据源配置 <Resource type="com.mchange.v2.c3p0.ComboPooledDataSource" maxPoolSize="50" minPoolSize="5" acquireIncrement="2" initialPoolSize="10" maxIdleTime="60" factory="org.apache.naming.factory.BeanFactory" user="xxxx" password="xxxx" driverClass="Oracle.jdbc.driver.OracleDriver" jdbcUrl="jdbc:oracle:thin:@192.168.x.x:1521:orcl" idleConnectionTestPeriod="10" />

参数说明:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/00bb3cbe12d967967bc77e1009c7df48.html