基于LRU算法的Java对象池设计

 基于LRU算法的Java对象池设计
刘伟军
(赣南师范学院物理与电子信息学院,江西赣州Mlooo)

对象池是管理与共享系统资源的一种缓存机制,亦称资源池⋯.使用对象池可以获得两大好处:一是可
以降低资源创建与撤销的成本,从而提高系统整体性能;二是有效控制系统资源的使用总量,避免系统因资
源耗尽而崩溃,从而提高系统的可伸缩性.对象池应用很广,例如,管理数据库连接对象池称为数据库连接
池 ;管理组件实例的对象池称为实例池,诸如EJB容器、COM +容器等.而weh服务器则利用H’兀.P连接
池增强对客户访问的处理效率.
1 设计原理
对象池技术就是在当对象第1次被访问后,将其保存在对象池中,第2次读取时,就直接从池中读取.对
象的持久状态存放在关系数据库中或其它介质上.
1.1 对象池命中率命中率是指从缓存中得到请求对象的百分比,它是考察对象池优劣的关键参数.
1.2 对象生命周期对象的生命周期结束时,它必须被替换出对象池.因此,对象何时该消亡,以什么样的
策略被更新,也是对象池必须要解决的问题1.3 对象的一致性对象池内的对象是原对象的副本,设计对象池时必须考虑如何保证对象池内的对象与
原对象的一致性,当对象池内的对象发生变化时,应及时更新对象在数据库中的持久状态.
2 基于LRU算法的对象池框架的实现
对象池框架主要类图如图1所示,这里假设对象池中存放的是银行帐户对象Account,其对象持久状态

 

在框架图l中PoolLru继承AbstractPool类,是采用LRU算法的对象池.当客户程序请求访问的帐户对
象不在池内时,AbstractPool会请求PooledObjectFactory,要求得到一个新的帐户对象,而AccountPooledObject—
Factory是具体的实现类,用于产出新的帐户对象.
为实现图l框架,需要解决对象替换策略,对象池大小,对象一致性,以及对象池命中率等问题.
2.1 基于LRU算法的对象替换策略
对象替换,指当对象池内的对象数量已经达到上限,但有新的对象要加入时,需按照某种算法从对象池
选择一个删除,以便添加新的对象.在对象池类PoolLRU中定义基于LRU算法的替换策略程序如下:

  1. public boolean addAccount(Account account){
  2. boolean flag false;
  3. double maxUseTime=0;
  4. double timeDur;//
  5. int curlndex=0;
  6. Account tempAccount=null;
  7. if(currentObjects<maxObjects){
  8. accountPool
  9. . add(account);
  10. currentObjects++;
  11. flag true:
  12. }else{
  13. for(int i-O;i<accountPool_.size();i++){
  14. tempAccount=(Account)accountPool一.elementAt(i);
  15. timeDur:System.currentTimeMillis()一tempAccount.retumLastUsage();
  16. if(timeDur>maxUseTime){
  17. maxUseTime=timeDur;
  18. curIndex=i;
  19. }
  20. accountPool一
  21. . remove(curlndex);
  22. accountPool一
  23. . add(account);
  24. flag true;
  25. }
  26. }
  27. return nag;
  28. }
复制代码

2.2 命中率设计
对象池的命中率用来判断对象池设计的优劣.在对象池类PoolLRU中定义private int hits=0,private int
misses=O;每发生对象池命中时,hits++,而当访问对象不在对象池中时,就从关系数据库中读取,misses+
+,这两个变量用于评价对象池的效率.
2.3 基于LRU算法的对象池类实现
图l所示的PoolLRU类是对象池类,它继承AbstractPool类,实现了acquire()和release()两个方法.定
义了Vector容器变量存储被池化的对象.当需要创建新的帐户对象时,AbstractPool依靠AccountPooledOb.
jectFactory创建帐户对象.该类的具体定义如下:

  1. public class PoolLRU extends AbstractPool{
  2. String accountid;
  3. long ctime;
  4. String name=null;
  5. double balance=0;
  6. //对象池大小
  7. private int maxObjects;
  8. private Jut currentObjects;
  9. //定义对象池
  10. protected Vector accountPool一 ;
  11. private static DbCorm ectionPool dbConnPool:
  12. private AccountObserver aecountObserver;
  13. private int hits=0;
  14. private int misses=0:
  15. public PoolLRU(){
  16. accountPool一 =new Vector();
  17. dbConnPool=DbConnectionPoo1.getlnstance();
  18. maxObjects=8000;
  19. currentObjects=0:
  20. accountObserver=new AccountObserver();
  21. }
  22. public Resource acquire(String
  23. Account account=null;
  24. id){
  25. account getAccountByld(id);
  26. if(account! :nul1)hits++;
  27. if(account== nul1)l
  28. try{
  29. Connection conn=dbCormPoo1.acquire();
  30. Statement stmt=conn.createStatement();
  31. ResuhSet rs=strut.executeQuery(”Select id,name,balance FROM Accounts’’);
  32. while(IX3.next()){
  33. accounfid=1"5.getString(”id”);
  34. if(accountid.equals(id)){
  35. name=rs.getString(”nanle”);
  36. balance=rs.getDouble(”balance”);
  37. ctime=System.currentTimeMillis();
  38. account=new Account(aecounrid,llanle,balance,crime);
  39. misses+ + ;
  40. break;
  41. }
  42. }catch
  43. }catch
  44. }
  45. rs.close();
  46. stint.close();
  47. dbConnPoo1.retumConnection(corm);
  48. (SQLException e)}
  49. e.printStackTrace();
  50. return null;
  51. (Exception e){
  52. e.printStackTrace();
  53. retum null;
  54. }
  55. }
  56. return account;
  57. }
  58. public void release(Acount acount)
  59. retumAccount(account);
  60. }
  61. public void retumAccount(Account account){
  62. addAccount(account);
  63. accountObserver.update(this,account);
  64. }
  65. }
复制代码

2.4 对象的一致性设计
对象池中对象是原对象的映射,系统实现必须保证对象池中对象和关系数据库中对象状态一致,当池内
对象状态发生变化时,处于关系数据库中对象的持久状态也应当立即更新.观察者模式是一种非常好的设计
模式,当池内中的一个对象状态发生变化,所有依赖于它的对象都得到通知并被更新,实现对象间的低耦合.
在图l所示的框架中,Observer接口表示“观察者”的接口,AccountObserver实现该接口,当帐户对象被归还
对象池内时,“观察者”会被通知,“观察者”将调用Update()方法将对象状态写人数据库中以保持和数据库
同步.
3 结束语
对象池技术是提高服务端性能的有效技术,能够减少对象创建次数,节省对象访问时间,同时可以控制
服务端内存资源,避免内存耗尽.本文在J2EE平台上实现了一个基于LRU算法的对象池框架.进一步的研
究内容主要包括:(1)研究在不同对象池大小情况下,LRU对象池性能;(2)在对象池内尝试其它经典算法,
比较各种算法的性能;(3)研究新的算法,提高对象池的命中率.

(文章来源:www.nba114.com 转载请注明)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值