我遇到了问题,每次我从gwt请求工厂检索一个集合时,都会有“findEntity()” - 为该集合中的每个实体调用的方法。而这个“findEntity()” - 方法调用SQL-Database。
我发现这是因为请求工厂检查“ServiceLayerDecorator.isLive()”方法中的每个实体的“活跃度” - 方法(也在此处描述:requestfactory and findEntity method in GWT)
所以我提供了自己的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;
}
}
到目前为止这种方法有效,而且我没有对数据库进行大量的查询。
现在我想知道我是否会遇到其他问题?或者有更好的方法来解决这个问题吗?
答案 0 :(得分:2)
RequestFactory期望每个请求的会话模式与会话保证每个实体一个实例(即使用缓存)。
正确的修复是让isLive
命中该缓存,而不是数据库。如果您使用JPA或JDO,他们应该免费为您执行此操作。重要的是“请求”认为关于它(如果您发出了删除请求,isLive
应该返回false
),而不是真正存储在数据库中的内容,考虑到其他用户可以同时做的事情。
话虽如此,isLive
仅用于在客户端驱动EntityProxyChange
事件,因此如果您不使用它们,则不应导致无条件返回{{1}的任何问题就像你一样。