提高Seam系统性能测试点

提高Seam系统性能测试点
作者:岳乡成
系统的运行环境及用到的技术是:JSF + Jboss-seam-2.1.1.GA. + Jboss 4.2.3 GA + EJB 3.0 + OpenJPA + PostgreSQL + JDK 1.6。
基于这些环境和技术,我们提出提高性能的如下建议:
以下是基于Seam的性能优化:
1、 避免过量的使用Seam中的双向注入。
原因:(1)增加阅读代码的难度,因为开发者必须费心的理清每个组件是从哪里被注入的。
(2)双向注入增加运行的开销,因为双向注入总是在运行时发生,在调用双向注入属性的前后触发Seam的拦截器。
解决方法:将数据组件作为业务组件的属性。实例如下:
双向注入的实例
@Stateful
@Name(”manager”)
Public class ManagerAction implements Manage{
@In @Out
private Person person;
……
}
建议不用双向注入的实例
@Stateful
@Name(”manager”)
Public class ManagerAction implements Manage{
private Person person;
public Person getPerson(){
return person;
}
public void setPerson(Person person){
this. Person = person;
}
……
}
2、 Seam中的@DataModel注解用于把一个列表转变成可单击的数据表格,意味着@Out,所以建议也不要使用。
3、 绕过拦截器
为重复值绑定,比如那些建立在JSF dataTable中或其他迭代控件(如ui:repeat)中的, 对于每个被引用的Seam组件的调用都会调用全部的拦截器堆栈。这种作用可能导致大量的性能击中,尤其在多次访问组件时。通过在调用组件时禁用拦截器堆栈会达到一个显着的性能增益。为禁用组件的拦截器,添加 @BypassInterceptors 注释到组件类。
警告
知道禁用一个Seam组件的拦截器的实现是非常重要的。当一个组件用 @BypassInterceptors标记时,功能比如说双向注入、被注释的安全约束、同步和其他等等是不可用了。然而在多数情况下,弥补这些损失的功能是可能的(例如,不是用@In注入一个组件,你可以使用 Component.getInstance()代替。),知道这个结论是重要的。
下面的代码清单演示了一个Seam组件禁用它的拦截器:
@Name("foo")
@Scope(EVENT)
@BypassInterceptors
public class Foo
4、RichFaces标签的性能比较差,如果有可以代替的标签就可以不使用RichFaces标签。
{
public String getRowActions()
{
// 执行内联的基于角色的安全检查,而不是使用@Restrict 或其它安全注释
Identity.instance().checkRole("user");
// 内联代码查找组件,而不是使用@In
Bar bar = (Bar) Component.getInstance("bar");
String actions;
// some code here that does something
return actions;
}
}
5、 EJB标准中的 @Remove 注解指定了一个有状态的Session Bean应该在注解的方法被调用后被删除且其状态应该被销毁。 在Seam里,所有有状态的Session Bean都应该定义一个标有 @Destroy @Remove 的方法。 这是Seam在销毁Session上下文时要调用的EJB删除方法。实际上 @Destroy 注解更有用,因为它能在Seam上下文结束时被用来做各种各样的清理工作。如果没有一个 @Destroy @Remove 方法,那么状态会泄露,你就会碰到性能上的问题。
6、 force-parser — 强制Richfaces的XMl语法检验器去验证所有的JSF页面。 如果为 false,则只有AJAX响应才被验证并被转换成合适的XML。 设置force-parser 为 false 可以提高性能,但会在AJAX更新时提供可视化的工件。
7、 在集群环境中,把Entity Bean直接绑定到Conversation或者Session范围的Seam上下文变量,与在有状态Session Bean中保持一个对Entity Bean的引用相比,性能比较差。因此,并非所有的Seam应用程序都会把Entity Bean定义为Seam组件。
8、 在很多应用服务器中,对Conversation或Session 范围的Seam JavaBean组件集群操作,要比对有状态Session Bean组件集群慢。
9、 用@Restrict注解对权限的check比直接写代码check权限效率低。
10、 用js效验页面输入的正确性(例如:长度,必输项),这样效率比较高。
11、 Ajax4jsf与常规的JSF具有相同的生命周期,它必须在每个Ajax请求中提交所有的JSF状态信息,这就导致了大量的带宽被占用,而且在用户使用保存于JSF中的客户端状态时响应速度很慢。
解决方案:直接集成JavaScript
Seam提供的JavaScript远程框架允许从JavaScript UI访问任意的Seam后端组件,这样就能很容易把从JavaScript的UI控件中捕获的用户输入与后端的组件进行绑定,然后再用后端组件生成ajax数据来动态改变web页面的显示。
以下是基于JBOSS服务器的性能优化:
12、 避免值调用
当从GUI安装JBOSS AS时,开发者就会被询问是否允许值调用和隔离部署。Seam自动产生动态代理对象实现从JSF组件到EJB 3.0会话bean的调用。如果允许值调用,调用参数和返回值在进程中就被序列化了,其优点是应用程序的JSF和EJB 3.0层可以适当分离。这对于在同一台服务器上部署一个Java类的多个版本或从其他程序服务器移植到Jboss AS服务器时是非常有用的。
但是,值调用方法的速度也比较慢,因为对象的序列化和反序列化都是非常占有CPU的,所以值调用方法要比常规的引用调用方法至少慢10倍。大多数Seam应用程序是为了在Jboss AS的同一个JVM中运行而设计的,所以我们应该设置不允许值调用和隔离部署。
13、 JVM选项
(1) 总是用-server选项启动jvm。
(2) 为jvm提供尽可能多的资源是非常重要的,对于JVM而言最重要的资源是RAM数,因为所以服务器端的状态数据(例如:HTTP Session和有状态的Session bean)都存储在RAM里,这对于拥有大量RAM的重载服务器(例如:大量的并发用户)而言是非常重要的。在一个典型的服务器上,应该至少75%的物理RAM分配给JVM。但是太大的内存也可能会带来性能的损伤,这是因为垃圾收集器清理内存空间时要占用太多的时间。
14、 减少日志记录
在默认情况下,seam和myfaces都会记录非常多的信息,其中很多信息是提供给软件开发人员的,在生产环境下并没有什么用。
15、 优化HTTP线程池
在Jboss AS中对每个HTTP请求的回答需要一个单独的线程。当应用程序有很多并发的用户时,大量的CPU时间被浪费在管理这些线程上了。优化线程管理是重负荷下提高应用程序性能的一个关键技术。
16、 在客户端和服务器端状态存储中的选择
Jsf可以在用户HTTP的Session(服务器端状态存储)中存储其内部组件状态,也可以在浏览器中以隐藏表单域的形式(客户端状态存储)存储,因为在集群中需要复制Session数据,所以服务器状态存储要消耗服务器的内存并且通常很难确定其大小。另一方面,客户端状态存储把状态管理的负荷分配给用户浏览器。但是谈到CPU的性能,客户端状态存储更加慢,因为需要把对象序列化。于是开发者必须决定是内存还是cpu更有可能成为应用程序的瓶颈,并进而选择合适的状态存储方法。
17、 使用生产数据源
Jboss AS默认的数据源Java:/DefaultDS指向服务器自带的嵌入式HSQL数据库。尽管HSQL数据库对于应用程序开发而言是好的,但并不适合于生产环境,这是一个主要的性能瓶颈,并且在高负荷下会变得不稳定。所以开发者一定要为自己的应用程序设置一个生产数据库的数据源。
18、 使用一个二级数据库高速缓存
Seam应用程序使用EJB 3.0实体bean模拟关系数据表格,大多数应用程序中,只有很少的一部分数据库记录被频繁的使用。为提高性能,我们应该对那些需要频繁访问的实体bean的形式高速缓存到应用程序的内存中,而不是对同一个bean对象进行重复读取。
以下是基于EJB 3.0的性能优化:
19、 根据是否可以维持会话状态,Session Bean分为有状态的Bean和无状态的Bean。有状态的Bean可以维护会话的状态,无状态的bean不维护会话状态。无状态的会话bean能够支持多个用户,并且通常在EJB容器中共享,可以为需要大量客户的应用提供更好的扩充能力,无状态的bean比有状态的会话bean更具有性能优势。在条件允许的情况下开发人员应该首先考虑使用无状态的会话bean。
以下是基于Java语言的性能优化:
20、 Java中本身的性能问题,比如,String和StringBuffer,Iterator和For,ArrayList和LinkedList的性能。这方面的内容比较多以后再慢慢补充。
以下是Dan Allen(Seam in Action的作者)提高JSF/Seam Application性能的建议:
21、 使用可以编辑的DateTable,使对数据的增删改查可以放在同一地方实现。具体实例如下图所示:

22、 如果要实现一个工作单元,建议使用会话(convenience),选择会话的原因如下:
(1) 减少对数据库访问的次数。
(2) 确保整个操作过程中的数据都存在于持久化上下文中(persistence context),取和拿都比较方便。
(3) 可以保存搜索条件和分页的页码。
(4) 使用返回按钮返回上一页面非常快。
有这么多的好处,但是它的性能也有缺陷,一下是Dan Allen提供的几个提高会话性能的建议:
23、 对于页面的初始化,如果数据暂时不需要加载,在初始化的时候就不需要对其初始化,直到需要其显示时再对其进行初始化(使用Ajax对其进行初始化)。如果必须对所有的数据进行初始化可以考虑使用比较高效的属性,比如cache。
24、 如果使用如下图所示的可编辑table,下图所示:

Action列,Excluded列和Details列的图片数据会产生重新(数据冗余),如果数据量大的话会非常影响效率,Dan Allen建议把这些数据统一做成一个下拉列表选择框,需要什么操作可以通过它进行选择。示例如下:
Jsf页面如下:
<h:column> <f:facet name="header">Taxonomic Unit</f:facet>
<h:outputText value="#{_item.taxon.name}"
rendered="#{!benthicMsmntEditor.editing(_item)}"/> <h:selectOneMenu
id="taxonomicUnit" rendered="#{benthicMsmntEditor.editing(_item)}"
defaultLabel="No value set" value="#{_item.taxon}"> <s:selectItems
value="#{taxonValues}" var="_taxon" label="#{_taxon.name}" noSelectionLabel="No
value set"/> <s:convertEntity/> </h:selectOneMenu>
</h:column>
Session Bean中的代码如下:
public boolean editing(T itemInRow) { return itemInEditMode == itemInRow; }
25、 拦截器对Seam应用的性能影响很大,@BypassInterceptors可以绕过拦截器,多用于方法是只读的组件。
26、 不要调用拦截器方法在Data Table的内部。

[b][color=red]以上内容没有经过正规测试,仅作参考。[/color][/b]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VR(Virtual Reality)即虚拟现实,是一种可以创建和体验虚拟世界的计算机技术。它利用计算机生成一种模拟环境,是一种多源信息融合的、交互式的三维动态视景和实体行为的系统仿真,使用户沉浸到该环境中。VR技术通过模拟人的视觉、听觉、触觉等感觉器官功能,使人能够沉浸在计算机生成的虚拟境界中,并能够通过语言、手势等自然的方式与之进行实时交互,创建了一种适人化的多维信息空间。 VR技术具有以下主要特: 沉浸感:用户感到作为主角存在于模拟环境中的真实程度。理想的模拟环境应该使用户难以分辨真假,使用户全身心地投入到计算机创建的三维虚拟环境中,该环境中的一切看上去是真的,听上去是真的,动起来是真的,甚至闻起来、尝起来等一切感觉都是真的,如同在现实世界中的感觉一样。 交互性:用户对模拟环境内物体的可操作程度和从环境得到反馈的自然程度(包括实时性)。例如,用户可以用手去直接抓取模拟环境中虚拟的物体,这时手有握着东西的感觉,并可以感觉物体的重量,视野中被抓的物体也能立刻随着手的移动而移动。 构想性:也称想象性,指用户沉浸在多维信息空间中,依靠自己的感知和认知能力获取知识,发挥主观能动性,寻求解答,形成新的概念。此概念不仅是指观念上或语言上的创意,而且可以是指对某些客观存在事物的创造性设想和安排。 VR技术可以应用于各个领域,如游戏、娱乐、教育、医疗、军事、房地产、工业仿真等。随着VR技术的不断发展,它正在改变人们的生活和工作方式,为人们带来全新的体验。
VR(Virtual Reality)即虚拟现实,是一种可以创建和体验虚拟世界的计算机技术。它利用计算机生成一种模拟环境,是一种多源信息融合的、交互式的三维动态视景和实体行为的系统仿真,使用户沉浸到该环境中。VR技术通过模拟人的视觉、听觉、触觉等感觉器官功能,使人能够沉浸在计算机生成的虚拟境界中,并能够通过语言、手势等自然的方式与之进行实时交互,创建了一种适人化的多维信息空间。 VR技术具有以下主要特: 沉浸感:用户感到作为主角存在于模拟环境中的真实程度。理想的模拟环境应该使用户难以分辨真假,使用户全身心地投入到计算机创建的三维虚拟环境中,该环境中的一切看上去是真的,听上去是真的,动起来是真的,甚至闻起来、尝起来等一切感觉都是真的,如同在现实世界中的感觉一样。 交互性:用户对模拟环境内物体的可操作程度和从环境得到反馈的自然程度(包括实时性)。例如,用户可以用手去直接抓取模拟环境中虚拟的物体,这时手有握着东西的感觉,并可以感觉物体的重量,视野中被抓的物体也能立刻随着手的移动而移动。 构想性:也称想象性,指用户沉浸在多维信息空间中,依靠自己的感知和认知能力获取知识,发挥主观能动性,寻求解答,形成新的概念。此概念不仅是指观念上或语言上的创意,而且可以是指对某些客观存在事物的创造性设想和安排。 VR技术可以应用于各个领域,如游戏、娱乐、教育、医疗、军事、房地产、工业仿真等。随着VR技术的不断发展,它正在改变人们的生活和工作方式,为人们带来全新的体验。
基于GPT-SoVITS的视频剪辑快捷配音工具 GPT, 通常指的是“Generative Pre-trained Transformer”(生成式预训练转换器),是一个在自然语言处理(NLP)领域非常流行的深度学习模型架构。GPT模型由OpenAI公司开发,并在多个NLP任务上取得了显著的性能提升。 GPT模型的核心是一个多层Transformer解码器结构,它通过在海量的文本数据上进行预训练来学习语言的规律。这种预训练方式使得GPT模型能够捕捉到丰富的上下文信息,并生成流畅、自然的文本。 GPT模型的训练过程可以分为两个阶段: 预训练阶段:在这个阶段,模型会接触到大量的文本数据,并通过无监督学习的方式学习语言的结构和规律。具体来说,模型会尝试预测文本序列中的下一个词或短语,从而学习到语言的语法、语义和上下文信息。 微调阶段(也称为下游任务训练):在预训练完成后,模型会被应用到具体的NLP任务中,如文本分类、机器翻译、问答系统等。在这个阶段,模型会使用有标签的数据进行微调,以适应特定任务的需求。通过微调,模型能够学习到与任务相关的特定知识,并进一步提高在该任务上的性能。 GPT模型的优势在于其强大的生成能力和对上下文信息的捕捉能力。这使得GPT模型在自然语言生成、文本摘要、对话系统等领域具有广泛的应用前景。同时,GPT模型也面临一些挑战,如计算资源消耗大、训练时间长等问题。为了解决这些问题,研究人员不断提出新的优化方法和扩展模型架构,如GPT-2、GPT-3等,以进一步提高模型的性能和效率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值