gpt4 book ai didi

java - RequestFactory 理论 : Why is Locator<>. find() 被如此频繁地调用?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:50:42 25 4
gpt4 key购买 nike

我是 RequestFactory 的新手,但得到了 Thomas Broyer 的慷慨帮助在查看下面的文档后,它变得更好了:)

但是你能解释一下为什么吗 Locator<>.find()经常被如此不必要地(在我看来)调用?

在我的示例项目中,我有两个保持父子关系的实体 Organization 和 Person。当我获取 Organization Objectify 时,自动 获取子 Person。我还在我的服务层中创建了两个方法 findOrganizationByIdsaveOrganization加载和持久化对象。

现在考虑两种情况:

当我调用 findOrganizationById在客户端中,以下调用发生在服务器端:

OrderDao.findOrganizationById(1)
PojoLocator.getId(Key<?>(Organization(1)))
PojoLocator.getId(Key<?>(Organization(1)/Person(2)))
PojoLocator.getId(Key<?>(Organization(1)))
PojoLocator.find(Key<?>(Organization(1)))
PojoLocator.getId(Key<?>(Organization(1)/Person(2)))
PojoLocator.find(Key<?>(Organization(1)/Person(2)))

调用 OrderDao.findOrganizationById我已经收到了完整的对象图。为什么叫.find除此之外还有两次? Datastore 上的额外负载让我花了钱。当然,我缓存了它,但修复它会很好。我怎样才能避免这些额外的调用?

当我通过调用 saveOrganization 保存对象时会发生类似的事情在客户端。以下调用发生在服务器端:

PojoLocator.find(Key<?>(Organization(1)))
PojoLocator.find(Key<?>(Organization(1)/Person(2)))
OrderDao.saveOrganization(1)
PojoLocator.getId(Key<?>(Organization(1)))
PojoLocator.find(Key<?>(Organization(1)))
PojoLocator.getId(Key<?>(Organization(1)/Person(2)))
PojoLocator.find(Key<?>(Organization(1)/Person(2)))

我可以理解需要在 更新 DataStore 之前从 DataStore 中获取两个对象。 RequestFactory 将增量发送到服务器,因此它需要在持久化之前拥有整个对象。尽管如此,因为我一次加载了完整的图表,所以最好不要第二次调用 PojoLocator.find(Key<?>(Organization(1)/Person(2))) .我真的无法理解需要 .find()坚持之后调用。

想法?

我的代理

@ProxyFor(value = Organization.class, locator = PojoLocator.class)
public interface OrganizationProxy extends EntityProxy
{
public String getName();
public void setName(String name);
public String getAddress();
public void setAddress(String address);
public PersonProxy getContactPerson();
public void setContactPerson(PersonProxy contactPerson);
public EntityProxyId<OrganizationProxy> stableId();
}

@ProxyFor(value = Person.class, locator = PojoLocator.class)
public interface PersonProxy extends EntityProxy
{
public String getName();
public void setName(String name);
public String getPhoneNumber();
public void setPhoneNumber(String phoneNumber);
public String getEmail();
public void setEmail(String email);
public OrganizationProxy getOrganization();
public void setOrganization(OrganizationProxy organization);
}

我的服务

public interface AdminRequestFactory extends RequestFactory
{
@Service(value = OrderDao.class, locator = InjectingServiceLocator.class)
public interface OrderRequestContext extends RequestContext
{
Request<Void> saveOrganization(OrganizationProxy organization);
Request<OrganizationProxy> findOrganizationById(long id);
}

OrderRequestContext contextOrder();
}

最后是我的定位器<>

public class PojoLocator extends Locator<DatastoreObject, String>
{
@Inject Ofy ofy;

@Override
public DatastoreObject create(Class<? extends DatastoreObject> clazz)
{
try
{
return clazz.newInstance();
} catch (InstantiationException e)
{
throw new RuntimeException(e);
} catch (IllegalAccessException e)
{
throw new RuntimeException(e);
}
}

@Override
public DatastoreObject find(Class<? extends DatastoreObject> clazz, String id)
{
Key<DatastoreObject> key = Key.create(id);
DatastoreObject load = ofy.load(key);
return load;
}

@Override
public Class<DatastoreObject> getDomainType()
{
return null; // Never called
}

@Override
public String getId(DatastoreObject domainObject)
{
Key<DatastoreObject> key = ofy.fact().getKey(domainObject);
return key.getString();
}

@Override
public Class<String> getIdType()
{
return String.class;
}

@Override
public Object getVersion(DatastoreObject domainObject)
{
return domainObject.getVersion();
}
}

最佳答案

末尾的 getIdfindLocator#isLive 的默认实现:它假定一个对象是 live(即仍然存在于数据存储中)如果通过其 ID 找到它返回一个非空值。

RF 在构造响应时检查在请求/响应期间看到的每个 EntityProxy active ,以在实体已被删除时通知客户端(在客户端,然后它会触发一个 EntityProxyChange 事件和一个 DELETE 写操作

如果您可以提供一个更优化的实现,您当然可以在您的 Locator 中覆盖 isLive

关于java - RequestFactory 理论 : Why is Locator<>. find() 被如此频繁地调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9476341/

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