分手快乐 发表于 2015-1-18 11:35:22

JAVA网页设计将Spring用于高并发情况的隐忧仓酷云

而学习JAVA我觉得最应该避免的就是:只学习,不思考,只记忆,不实践!比来帮忙一些BEA客户做调优,他们利用了Spring,呈现了林林总总的功能成绩,这些成绩实在都是不简单重现的,个中,我本人捕捉了一些ThreadDump,并report了给SpringJIRA。这个Case的情形是:Spring会偶尔呈现CPU100%的情形,WebLogicServer溃散,我厥后剖析了线程Dump,以为是一种LockContention的情况,幸亏,JuergenHoeller很快给我Fixed了这个Bug:
http://jira.springframework.org/browse/SPR-4664

利用Java编程的同砚都倡议Review一下,呵呵:

这是2.5.4之前的代码:
/**
*CacheofTransactionAttributes,keyedbyDefaultCacheKey(Method+targetClass).
*<p>AsthisbaseclassisnotmarkedSerializable,thecachewillberecreated
*afterserialization-providedthattheconcretesubclassisSerializable.
*/
finalMapattributeCache=newHashMap();

/**
*Determinethetransactionattributeforthismethodinvocation.
*<p>Defaultstotheclass"stransactionattributeifnomethodattributeisfound.
*@parammethodthemethodforthecurrentinvocation(never<code>null</code>)
*@paramtargetClassthetargetclassforthisinvocation(maybe<code>null</code>)
*@returnTransactionAttributeforthismethod,or<code>null</code>ifthemethod
*isnottransactional
*/
publicTransactionAttributegetTransactionAttribute(Methodmethod,ClasstargetClass){
//First,seeifwehaveacachedvalue.
ObjectcacheKey=getCacheKey(method,targetClass);
synchronized(this.attributeCache){
Objectcached=this.attributeCache.get(cacheKey);
if(cached!=null){
//Valuewilleitherbecanonicalvalueindicatingthereisnotransactionattribute,
//oranactualtransactionattribute.
if(cached==NULL_TRANSACTION_ATTRIBUTE){
returnnull;
}
else{
return(TransactionAttribute)cached;
}
}
else{
//Weneedtoworkitout.
TransactionAttributetxAtt=computeTransactionAttribute(method,targetClass);
//Putitinthecache.
if(txAtt==null){
this.attributeCache.put(cacheKey,NULL_TRANSACTION_ATTRIBUTE);
}
else{
if(logger.isDebugEnabled()){
logger.debug("Addingtransactionalmethod["+method.getName()+"]withattribute["+txAtt+"]");
}
this.attributeCache.put(cacheKey,txAtt);
}
returntxAtt;
}
}
}
这是2.5.4Fixed后的代码:
/**
*CacheofTransactionAttributes,keyedbyDefaultCacheKey(Method+targetClass).
*<p>AsthisbaseclassisnotmarkedSerializable,thecachewillberecreated
*afterserialization-providedthattheconcretesubclassisSerializable.
*/
finalMapattributeCache=CollectionFactory.createConcurrentMapIfPossible(16);


/**
*Determinethetransactionattributeforthismethodinvocation.
*<p>Defaultstotheclass"stransactionattributeifnomethodattributeisfound.
*@parammethodthemethodforthecurrentinvocation(never<code>null</code>)
*@paramtargetClassthetargetclassforthisinvocation(maybe<code>null</code>)
*@returnTransactionAttributeforthismethod,or<code>null</code>ifthemethod
*isnottransactional
*/
publicTransactionAttributegetTransactionAttribute(Methodmethod,ClasstargetClass){
//First,seeifwehaveacachedvalue.
ObjectcacheKey=getCacheKey(method,targetClass);
Objectcached=this.attributeCache.get(cacheKey);
if(cached!=null){
//Valuewilleitherbecanonicalvalueindicatingthereisnotransactionattribute,
//oranactualtransactionattribute.
if(cached==NULL_TRANSACTION_ATTRIBUTE){
returnnull;
}
else{
return(TransactionAttribute)cached;
}
}
else{
//Weneedtoworkitout.
TransactionAttributetxAtt=computeTransactionAttribute(method,targetClass);
//Putitinthecache.
if(txAtt==null){
this.attributeCache.put(cacheKey,NULL_TRANSACTION_ATTRIBUTE);
}
else{
if(logger.isDebugEnabled()){
logger.debug("Addingtransactionalmethod["+method.getName()+"]withattribute["+txAtt+"]");
}
this.attributeCache.put(cacheKey,txAtt);
}
returntxAtt;
}
}
可是2.5.4snapshot是未经很好测试的版本,客户一样平常不太敢用。我不晓得实在有几客户真正地把Spring投进到高并发性情况下利用,假如有,他们应当会能碰着我所碰着的情况。
批评

[*]#re:将Spring用于高并发情况的隐忧[未登录]BeanSoftPosted@2008-04-1910:03
没错,我们之前的公司也是Weblogic+Hibernate,出了功能成绩了,固然调剂办理了,但不论怎样说,由于这些开源软件之前开辟的时分并没有思索高并发和集群的情形,仍是对照简单呈现成绩的,特别是没有经由严厉的压力测试。我团体以为,今朝做的对照好的软件,仍然是贸易的。
[*]
[*]#re:将Spring用于高并发情况的隐忧flyislandPosted@2008-04-1910:56
1.切实其实,很多开源软件在版本公布之前是不是有才能往做高并发压力测试,值得嫌疑
2.我想,看到david此次发明的成绩,用户更应当小心的是下次假如某个开源产物出了成绩怎样办。
3.不外今朝来讲是,不是“用不必开源的成绩”(能够是必定要用),而是“用了开源怎样办”的成绩。以是这是开源贸易形式的一个时机,好比david就能够往做开源调优的服务撑持了,哈
4.这篇blog在我的firefox3.0b5下排版凌乱,不能不到IE上面来留言
[*]
[*]#re:将Spring用于高并发情况的隐忧[未登录]afPosted@2008-04-1917:43
我一向以为开源代码是用来进修的,实践项目中仍是不要用的好。
[*]
[*]#re:将Spring用于高并发情况的隐忧[未登录]ljPosted@2008-04-1921:08
我很想晓得在spring1.2.9或spring2.0.8有无这个成绩
[*]
[*]#re:将Spring用于高并发情况的隐忧GoGoPosted@2008-04-2013:24
@flyisland
FireFox不单单3.0乱,2.0也乱,因而IE留言之。
来自:http://www.blogjava.net/security/archive/2008/04/19/spring_bug.html

到时我们不用学struts,不用学spring,不用学Hibernate,只要能把jsf学会了,完全可以替代所有的框架,包括AJAX,都知道AJAX并不是新技术,虽说我没深入学习jsf但我认为jsf应该已经能通过其它技术替代AJAX,实现无缝刷新。

因胸联盟 发表于 2015-1-21 10:38:27

那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧!

再现理想 发表于 2015-1-30 15:30:40

科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。

若天明 发表于 2015-2-2 22:30:52

你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?

再见西城 发表于 2015-2-8 15:45:44

是一种突破用户端机器环境和CPU

飘飘悠悠 发表于 2015-2-8 15:45:58

Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站

灵魂腐蚀 发表于 2015-2-25 19:49:04

是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能

金色的骷髅 发表于 2015-3-11 06:06:07

当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?

愤怒的大鸟 发表于 2015-3-15 22:57:29

你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。

老尸 发表于 2015-3-16 03:58:37

是一种使用者不需花费很多时间学习的语言

简单生活 发表于 2015-3-18 09:02:12

是一种语言,用以产生「小应用程序(Applet(s))

莫相离 发表于 2015-3-25 04:04:15

任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言

兰色精灵 发表于 2015-3-28 19:51:38

你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?

冷月葬花魂 发表于 2015-4-13 05:53:30

如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。

分手快乐 发表于 2015-4-16 01:11:11

多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。

小魔女 发表于 2015-4-25 09:36:14

象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。

只想知道 发表于 2015-5-3 09:38:20

学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。

飘灵儿 发表于 2015-5-4 06:06:06

J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。

活着的死人 发表于 2015-5-5 12:42:03

自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。

精灵巫婆 发表于 2015-5-11 02:45:01

任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言
页: [1]
查看完整版本: JAVA网页设计将Spring用于高并发情况的隐忧仓酷云