- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我是 RequestFactory 的新手,但得到了 Thomas Broyer 的慷慨帮助在查看下面的文档后,它变得更好了:)
但是你能解释一下为什么吗 Locator<>.find()
经常被如此不必要地(在我看来)调用?
在我的示例项目中,我有两个保持父子关系的实体 Organization 和 Person。当我获取 Organization Objectify 时,自动 获取子 Person。我还在我的服务层中创建了两个方法 findOrganizationById
和 saveOrganization
加载和持久化对象。
现在考虑两种情况:
当我调用 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();
}
}
最佳答案
末尾的 getId
和 find
是 Locator#isLive
的默认实现:它假定一个对象是 live(即仍然存在于数据存储中)如果通过其 ID 找到它返回一个非空值。
RF 在构造响应时检查在请求/响应期间看到的每个 EntityProxy
active ,以在实体已被删除时通知客户端(在客户端,然后它会触发一个 EntityProxyChange
事件和一个 DELETE
写操作。
如果您可以提供一个更优化的实现,您当然可以在您的 Locator
中覆盖 isLive
。
关于java - RequestFactory 理论 : Why is Locator<>. find() 被如此频繁地调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9476341/
我有一个包含值的字符串数组(duh...)。 有没有一种简单的方法可以获取出现次数最多的条目?有点像 values[37].getMostOften(); 干杯:) 最佳答案 您可以使用GroupBy
我目前正在将一款用 C#(适用于 Windows Phone)开发的游戏移植到 Java (Android)。 我们在 Java 版本中遇到了内存问题,在分析之后,似乎是由于内存中的大量 String
对于播放音频文件的 iPhone 应用程序,我正在开发一个系统来跟踪用户在他们听过的任何一集中的进度(例如,他们听 file1 的前 4:35,然后开始另一个文件,然后返回到文件 1,它从 4:35
如果您按下 UIbutton 显示 UITextView,将请求代码 Ì 再次按下 UIbutton 再次显示 UITextView :/ 最佳答案 .h 文件中只有一个 int 变量,如下所示..
我在 Application_End 上处理的项目中使用临时数据库: protected void Application_End() { if (_db != null) _db.Dispo
我是一名优秀的程序员,十分优秀!