文谷首页 | 业界传真 | 网络技术 | 服务器 | 数据库 | 存储技术 | 系统安全 | 无线技术 | Cisco | .Net | Windows | Linux | Unix | Java
电子商务 | 网站工程 | 网页设计 | 平面设计 | 多媒体 | 编程语言 | Oracle | MSSQL | Photoshop | ASP | PHP | 实用技巧 | 进程查询 | 文谷论坛
Java频道
 资讯动态   考试认证   新手入门   核心技术   高级技术   J2EE   J2ME   XML   开源技术   其他技术
您现在的位置: IT文谷 >> 开发平台 >> Java >> 高级技术 >> 设计模式 >> 文章正文
谨慎使用类变量及正确使用单例模式谨慎使用类变量及正确使用单例模式2006-7-19 21:31:19谨慎使用类变量及正确使用单例模式2006-7-19 21:31:19谨慎使用类变量及正确使用单例模式
谨慎使用类变量及正确使用单例模式
谨慎使用类变量及正确使用单例模式谨慎使用类变量及正确使用单例模式2006-7-19 21:31:19谨慎使用类变量及正确使用单例模式2006-7-19 21:31:19谨慎使用类变量及正确使用单例模式
谨慎使用类变量及正确使用单例模式谨慎使用类变量及正确使用单例模式2006-7-19 21:31:19谨慎使用类变量及正确使用单例模式2006-7-19 21:31:19谨慎使用类变量及正确使用单例模式
CowNew开源团队网站 http://www.cownew.com 
论坛 http://www.cownew.com/newpeng/ 
转载请注明此版权信息 
        
        昨天发现JDBMonitor在多数据源的情况下会有问题,这个问题就是对单例模式理解不深造成的。为了减少系统中的对象数目,我用单例模式设计DBLogger,也就是提供一个getLogger方法返回一个日志处理器,getLogger则返回的是一个缓存了的DBLogger实例。昨天我用一个大型的信息系统测试了一下,发现当有多个数据源存在的时候,所有的日志都记录到了第一个启动的JDBMonitor的配置文件指定的监听器中了。经过分析得知,虽然多个数据源启动了多个JDBMonitor,但是由于这些JDBMonitor实例是运行在同一个JVM中的,而一个类变量在同一个JVM是唯一的,所以这些实例调用getLogger的时候得到的都是第一个JDBMonitor中配置的了。
        我采用如下方式解决:为getLogger增加一个connectionId参数,将原先的单例去掉,改成一个hash表的静态变量instanceMap。在调用getLogger的时候,先以connectionId为key到instanceMap中找是不是已经有一个实例了,如果有则直接返回这个实例,否则构造一个DBLogger,将此DBLogger以connectionId为key保存到instanceMap中,然后返回实例。
        根据JDBMonitor的功能特点配置文件的路径就可以做为这个connectionId了,也就是如果是多个数据源指向一个配置文件,那么这几个数据源其实还是共用一个DBLogger,这个也是合理的,而且也可以节省很多资源。
        从这个例子我们可以看出,单例模式并不一定是只创建一个实例这么简单。Log4j的getLogger就是很好的证明。
        但是多个数据源共用一个DBLogger又引来了另一个问题,就是当有一个数据源的Connection被close掉以后,DBLogger也会随之close掉,其他数据源再访问的时候就会报错。我采用类似GC、COM等的引用机制解决此问题。在DBLogger内部维护一个计数器refCounter,初始值是0,当调用getLogger访问到此实例的时候,就refCounter自动加1,当调用DBLogger的close的时候就自动减1,当refCounter降到0的时候就说明没有对象引用到它了,这个时候再释放DBLogger中的各种资源。当然addRef、releaseRef、close等方法都要标识成synchronized的。
        同理,以前的这些channel、dbListeners类变量也要改成实例变量。consumerthread也要改成实例变量,在close中再关闭这个线程。这样就保证了每一个JDBMonitor都有自己的消费者线程。
        为了使语意更加明确,我将getLogger重命名为createLogger。
        代码已经提交到CVS,今天晚些时候将打包放到团队网站上。
        向大家汇报,SQL解析引擎已经有阶段成果,强类型AST节点都已定义完毕,也已经可以生成最简单的CommonAST。

谨慎使用类变量及正确使用单例模式谨慎使用类变量及正确使用单例模式2006-7-19 21:31:19谨慎使用类变量及正确使用单例模式2006-7-19 21:31:19谨慎使用类变量及正确使用单例模式
  • 上一篇文章:

  • 下一篇文章:
  • 进入论坛讨论

    相关文章
    我的Thinking in Java学习笔记
    使用JBoss和Eclipse创建J2EE应用
    SpringFramework(9)
    NoTitle385
    向Web Service进军--Axis+Tomcat模拟一个银行存取款
    JAVA中的指针,引用及对象的clone
    JAVA中用动态代理类实现记忆功能(二)
    JAVA中用动态代理类实现记忆功能(一)
    DB Test
    基金系统的初步研究(1)
    SpringFramework(8)
    深入浅出Java clone技术(2)
    热门文章最新推荐

    版权与免责声明:
    ① 本网转载其他媒体稿件是为传播更多的信息,此类稿件不代表本网观点,版权归原作者所有,本网不承担此类稿件侵权行为的连带责任。
    ② 本站原创文章,转载时请注明出自文谷及作者姓名
    ③在本网BBS上发表言论者,文责自负。
    ④如您因版权等问题需要与本网联络,请在30日内联系 。
    谨慎使用类变量及正确使用单例模式谨慎使用类变量及正确使用单例模式2006-7-19 21:31:19谨慎使用类变量及正确使用单例模式2006-7-19 21:31:19谨慎使用类变量及正确使用单例模式
    谨慎使用类变量及正确使用单例模式谨慎使用类变量及正确使用单例模式2006-7-19 21:31:19谨慎使用类变量及正确使用单例模式2006-7-19 21:31:19谨慎使用类变量及正确使用单例模式

    全站热点
    最新推荐
    关于文谷 | 联系文谷 | 免责声明 | 文谷论坛
    Tel: 0577-65690019      E-mail: ichenjian@gmail.com    MSN:ichenjian@hotmail.com    QQ:2911194
    Copyright © 2004-2008 wengu.com 文谷 All Rights Reserved
    浙ICP备05000327号