gpt4 book ai didi

seam - 范围类型如何影响EntityQuery对象的重用方式

转载 作者:行者123 更新时间:2023-12-02 04:15:13 25 4
gpt4 key购买 nike

for (...) {
UserList userList = (UserList) Component.getInstance(UserList.class, ScopeType.METHOD);
userList.getUserByEmailAddress(emailId);
}

Seam支持不同的ScopeType(例如,METHOD,PAGE,EVENT,APPLICATION)。当前,我们使用METHOD范围通过电子邮件ID检索User对象。上面的代码存在于for循环中(即,对于我们检索用户对象的用户电子邮件地址的集合)。这是正确的ScopeType还是最好将UserList声明移到for循环上方

我们已经观察到在某些范围类型中,userList对象被重用了,有人可以阐明它的真正工作原理。接缝中是否有任何工具可以帮助您了解如何重用这些对象(我们打开了一些跟踪日志记录,但是正在进行过多的调用,而且还不太清楚)

最佳答案

ScopeType.METHOD说

每次对 session bean或JavaBean组件的调用都会将新的方法上下文放到与当前线程关联的方法上下文堆栈中。方法返回时,上下文将被破坏。

Seam的许多功能都是作为一组内置的Seam拦截器实现的。下面是一段API说明的MethodContextInterceptor(内置Seam拦截器)代码

设置METHOD上下文并在通话期间取消代理SFSB

MethodContextInterceptor.java请参见下面的注释,并与上方突出显示的文本进行比较

@AroundInvoke
public Object aroundInvoke(InvocationContext ctx) throws Exception {
Component comp = getComponent();

String name = comp.getName();
Object target = ctx.getTarget();
Method method = ctx.getMethod();
Object[] parameters = ctx.getParameters();

/**
* beginMethod
*
* Takes care of putting a NEW method context onto the stack of method contexts
*/
Context outerMethodContext = Lifecycle.beginMethod();

try {
Contexts.getMethodContext().set(name, target);
Contexts.getMethodContext().set("org.jboss.seam.this", target);
Contexts.getMethodContext().set("org.jboss.seam.method", method);
Contexts.getMethodContext().set("org.jboss.seam.parameters", parameters);
Contexts.getMethodContext().set("org.jboss.seam.component", comp);

/**
* And after method return
*/
return ctx.proceed();
} finally {
/**
* endMethod Takes care of destroying The previous added method context
*/
Lifecycle.endMethod(outerMethodContext);
}
}

如您所见,我没有看到ScopeType.METHOD提供的任何特殊行为。我认为,Seam项目的创始人Gavin King创建了ScopeType.METHOD,作为可以在后面使用的附加范围。甚至Seam in Action本书也不涵盖ScopeType.METHOD范围。

因此,每次调用getUserByEmailAddress时,都会执行上述例程。关于上下文,Seam in Action书清晰

上下文定义了在哪里可以找到变量名 以及它在周围的悬挂时间。

因此,您所需的范围应引起您的业务需求。

关于EntityQuery ???这就是Seam in Action书中所说的

如果每次需要显示结果时都执行查询,则将undo pressure 放在数据库中。在另一个极端,如果您将结果保持太长时间,最终会给用户提供 过时的信息,这些信息可能会使他们感到困惑,甚至导致他们做出错误的决定。

默认情况下,某些查询方法通过将结果缓存在类的 private 属性中来避免冗余数据库查询。但是,由于您进行了更改,因此可以覆盖它
  • 查询限制参数
  • 排序顺序
  • 最大结果值
  • 第一个结果偏移量
  • 通过调用refresh()
  • 手动清除结果

    当您更新某些@Entity并需要刷新存储的结果集时,最后一项很有用。您可以使用Seam事件来完成它。但是,如果您始终想要一个新的结果集,请将EntityQuery设置为ScopeType.EVENT,然后在for循环之前使用它
    UserList userList = (UserList) Component.getInstance(UserList.class, ScopeType.EVENT);
    for (...) {
    userList.getUserByEmailAddress(emailId);
    }

    这里对Seam和Spring范围进行了并行比较
    Seam                               Spring            Suited for
    ScopeType.STATELESS singleton Service, repositories, Thread-safe components
    ScopeType.APPLICATION singleton Service, repositories, Thread-safe components
    ScopeType.SESSION session User login
    ScopeType.CONVERSATION - Page flow
    ScopeType.PAGE - Server-side based component model
    ScopeType.EVENT request Non Thread-safe components

    注意ScopeType.CONVERSATION不等于Spring Web流。 Seam ScopeType.CONVERSATION超出了Web层。 session 上下文中甚至可以包含一个持久性上下文。请记住,当您具有基于服务器端的组件模型框架(例如JSF,Wicket等)时,ScopeType.PAGE才有意义。通常,当您具有完全的Java EE环境时使用ScopeType.STATELESS,而当您具有完整的Java EE环境时使用ScopeType.APPLICATION您使用普通的POJO而不是EJB。

    关于seam - 范围类型如何影响EntityQuery对象的重用方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3170296/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com