- 1、本文档共8页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Apache的对象池化工具commons-pool.doc
Apache的对象池化工具commons-pool
刘岩
Email:suhuanzheng7784877@163.com
前言
当我们的应用中创建一个十分最重量级的对象的时候,往往为了节省资源成本,使用单例模式,整个的应用中就只有一个对象供大家使用。这样是节省了不少资源,也是大多数应用的做法。不过如果遇到并发量十分大的情况下,并发访问的问题也就出现了。OK即使您不用加锁synchronized,利用ThreadLoacl进行安全变量的副本,但是维持变量副本的资源也是需要消耗资源的。而且对于一个重量级的对象的多个方法多个线程同时调用此对象的同一个局部变量,多个副本的维护实际上也是挺占用资源的。
轻量级对象
当然不是说所有的对象都适合池化的。池化的对象是一个重量级对象,什么是重量级对象。回答这个问题先说说什么是轻量级对象。比如我们做Web系统的DAO(注意:这里绝对不包括EJB的EAO),就是为了调用持久层框架完成增、删、改、查原子性操作。实际就算是轻量级的对象,DAO没必要含有太复杂的其他对象,如果需要其他辅助对象为其服务:比如事务插入、日志操作记录。使用AOP面向他的切面进行拦截即可。Spring有整套方案,不做扩展。创建这些对象,在启动Web应用的时候实例化放到容器中即可,想要,容器自动为您注入。容器保证了对象的线程安全,所以这些对象是轻量级对象。
重量级对象
那什么又是重量级对象呢,咱们用一个谁都能想到的例子,数据库连接java.sql.Connection。为何说Connection是一个重量级对象呢?我们在JDBC编程的时候仅仅使用了很少量的代码即完成了数据库的连接操作。一个Connection对象为我们操作数据库做了什么?
1):通过JDBC的驱动Driver屏蔽底层数据库网络协议,让我们不必关心具体的数据库通讯协议(Mysql有Mysql的协议、Oracle有Oracle的通讯协议)
2):通过数据库网络协议打开网络socket连接管道
3):根据建立的网络通道发送握手指令(所谓握手指令就是包含数据库用户名、数据库密码的二进制信息)
4):接收数据库端的握手结果信息再决定下面的通讯是否进行
关键是建立网络socket通道耗费资源着实不小。而且java.sql.Connection需要一直维持着这个网络通道。
相比于上面提到的DAO对象的创建,这个Connection对象创建的时候是不是确实显得历经沧桑。咱们举个例子,就像唐僧取经一样,李世民想要经书超度为他建功立业的亡魂,唐三藏就去了,历经千辛万苦取回来了,李世民让其诵念经文超度亡魂后发现这段时间那些死去的冤魂没再缠着他了,取回来的经文这个时候被李世民看经书占地方,下令烧掉了(垃圾回收器回收了)。过了一段时间又有亡魂开始缠着他了!怎么办?李世民说:“哦,御弟,麻烦你再去见佛祖一趟吧!”唐三藏之后又花了12年,再去西天见佛祖,取回了真经超度亡魂~~如果当时唐三藏说:“阿妹喂,陛下,当时您要是不下令烧掉,将经书交给我的大徒弟去管理,就不必这么麻烦~等我取回经书了,您也就快那什么啦”。
对象池
对象池的概念和现实生活中的图书馆的管理极其相似。阅读这项看一本书,用读书卡去借一本书、看完了还回来,如果图书馆的书不够用了怎么办?那就麻烦图书采购小刘去市场买几本回来吧。这个本书太受欢迎了,原始的书的数量不够用啊。对象池就像是一个图书馆,图书管理员就像是对象调度器,借书人就像是调用对象的客户端。需要维护的就是图书馆和借书的记录凭证。这样看来资源需要维护图书馆和借书系统。但是这种维护在某种程度上来说是值得的。回到我们的编程世界中,Apache的common-pool组件就是一个开源的对象池工具,我们可以借助它的接口,就可以将重量级的对象做池化。
环境搭建
首先从apache站点下载commons-pool组件包。将lib下面的jar包拷贝到项目classpath中。因为此实话组件还依赖于其他的apache的commos组件——commons-collections。所以还需要将此jar包加入到classpath。笔者搭建好的环境如下
/ApacheCommonPool/lib/commons-collections-2.1.1.jar
/ApacheCommonPool/lib/commons-pool-1.5.6-javadoc.jar
/ApacheCommonPool/lib/commons-pool-1.5.6-sources.jar
/ApacheCommonPool/lib/commons-pool-1.5.6.jar 简单的池化环境已经搭建完毕
使用例程
在此历程中,我们测试一下Java常用对像,也是最通用的轻量级对象String的池化。再测试一下自定义的实体对象的
文档评论(0)