发帖    主题    评论    推荐    标签    作者    订阅    查搜    注册   登陆   关注
 
面向对象 设计模式 领域驱动设计 企业架构 框架 开发教程 微服务 大数据 扩展性 并发编程 事件驱动 分布式 SOA

Servlet中利用全局对象提高性能!!!

    
2006-06-24 18:03
赞助商链接

众所周知,Servlet是在Servlet pool中的,所以当系统并发数很多的时候同一个Servlet可能会被多个客户使用,那么Servlet中的全局变量就可以在多个客户之间共享,起到“缓存”的作用
我们可以把一些很耗性能的对象,设置为全局变量,例如 数据库连接,
因为加载类尤其是大类的时候也是很耗性能的,所以我们可以把这些类也设置为全局对象,具体使用的时候先判断这些对象是否为null,如果为null的时候再生成。 例如我们可以把一些大的DAO类,工具类都设置为全局对象;需要注意的是那些带有客户特有属性的类不能设置为全局变量,

其实这个原理和Session bean的原理差不多,当然是指无状态session bean ;bean里的对象被多个客户共享起到“缓存”作用

个人的一点见解,欢迎讨论

2006-06-26 12:46

数据库连接是绝对不能共享的,一个线程一个,用完关闭

另外servlet本身是线程安全的,一个实例就够了,根本不需要pool,除非你用SingleThreadModel

2006-06-26 18:55

全局变量也就是单例,也就是Singleton和静态,确实可以做缓存,但是有其致命的性能可能陷阱,可见本站以前的相关讨论。

提升性能除了单例以外,还有多例池Pool,Servlet是多线程池,数据库连接池也是一种Pool,无态Session bean更是对象池。

一个请求、一个线程、一个对象、一个数据库连接,专用通道,是最安全性能也是正常的。这个过程有的可以通过Pool完成,有的可以通过单例完成,但是不能都用单例,就危险了,至于哪个环节用Pool;哪里用单例,讲起来相当于我在做培训了,很多。

我一直强调如果一个程序员了解Pool和Cache区别,表明其Java水准达到高级(掌握反射Reflection和Bean反射是中级;掌握Java语法是初级,说Java好学的人往往是初级者,以为学java就是学语言的也是初级者)。

2006-06-27 13:46

如果你的软件性能出现了问题,那么请你首先考虑结构上是否存在缺陷;其次看看是否有一两处细节上的实现采取了相当奢侈的方式。初级的程序员也会将全局变量用在自己的Web程序中以提高性能或者用来降低程序开发的难度。但如果把复杂(复合)形对象以全局或者单态的方式来实用则是危险的。你必须控制好并发和总量控制的问题。
以我的经验看,导致大多数的Web程序的性能问题的因素不是什么Class Create。其原因一半是结构根本设计得不合理,一半在于忽视了I/O――网络或者磁盘或者数据库的读写的优化。
我的结论是全局变量可用,单在Dao这类的对象中要甚用。如果你必须用Cache或者Pool来优化的时候,一定万分小心,或者挂在成熟的框架上来实现。

2006-07-02 19:57

谢谢!
受教了:)

赞助商链接

赞助商链接

返回顶部

移动版 关于本站 使用帮助 联系管理员 最佳分辨率1366x768
OpenSource JIVEJDON Powered by JdonFramework Code © 2002-20 jdon.com