1

我遇到了问题,每次我从 gwt 请求工厂检索一个集合时,都会为该集合中的每个实体调用“findEntity()”方法。而这个“findEntity()”方法调用 SQL 数据库。

我发现发生这种情况是因为请求工厂检查了“ServiceLayerDecorator.isLive()”方法中每个实体的“活跃度”(也在这里描述:GWT 中的 requestfactory 和 findEntity 方法

所以我提供了我自己的 RequestFactoryServlet:

public class MyCustomRequestFactoryServlet extends RequestFactoryServlet {


    public MyCustomRequestFactoryServlet() {
        super(new DefaultExceptionHandler(), new MyCustomServiceLayerDecorator());

    }

}

还有我自己的 ServiceLayerDecorator:

public class MyCustomServiceLayerDecorator extends ServiceLayerDecorator {

    /**
     * This check does normally a lookup against the db for every element in a collection
     * -> Therefore overridden
     */
    @Override
    public boolean isLive(Object domainObject) {
        return true;
    }
}

到目前为止,这有效,并且我没有对数据库进行如此大量的查询。

现在我想知道我是否会遇到其他问题?或者有没有更好的方法来解决这个问题?

4

1 回答 1

2

RequestFactory 期望每个请求的会话模式,会话保证每个实体有一个实例(即使用缓存)。

正确的解决方法是isLive命中该缓存,而不是数据库。如果您使用 JPA 或 JDO,他们应该免费为您做这些。重要的是“请求”对它的看法(如果您发出删除请求,isLive应该返回false),而不是真正存储在数据库中的内容,考虑到其他用户可能同时执行的操作。

话虽这么说,isLive仅用于EntityProxyChange在客户端驱动事件,因此如果您不使用它们,它不应该true像您一样无条件地返回任何问题。

于 2013-06-03T00:52:40.073 回答