我有以下Entity
:
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "DCOL", discriminatorType = DiscriminatorType.STRING)
@DiscriminatorValue("Alias")
public class Alias
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Key key;
@Basic
private UUID from;
@Basic
private UUID to;
@Extension(vendorName="datanucleus", key="gae.unindexed", value="true")
private Date createdOn;
public Alias() { /* intentionally blank */ }
public Alias(@Nonnull final UUID from, @Nonnull final UUID to)
{
this.key = KeyFactory.createKey(Alias.class.getSimpleName(), from.toString());
this.from = from;
this.to = to;
this.createdOn = new Date();
}
}
这是保留它的代码:
final EntityManager em = EMF.TRANSACTIONS_OPTIONAL.createEntityManager();
try
{
final Alias a = new Alias(from, to);
em.persist(a);
}
finally
{
em.close();
}
目前需要对Datastore
执行6
写入操作才能持久化此Entity
。
我通过使用@Extension
标记createdOn
将其从自动索引中排除,将数字从10
减少到6
。写入操作减少了40%
!
有什么方法可以减少这么简单的事情的写入次数吗?
直接使用低级Datastore
API 会有任何改进吗?
正如您提到的,您的实体需要 6 个写入操作,划分如下:
- 1 写入实体本身
- 内置
EntitiesByKind
索引写入 1 次 - 2 次写入
from
属性(1 次写入内置索引EntitiesByProperty
,另一次写入内置索引EntitiesByPropertyDesc
(。 - 2 次写入
to
属性(1 次写入内置索引EntitiesByProperty
,另一次写入内置索引EntitiesByPropertyDesc
(。
此时减少写入次数的唯一机会是将任何from
或to
属性也标记为未编制索引(从而将每个属性的写入次数减少 2(。
您可以在此处查看更多信息:https://developers.google.com/appengine/docs/java/datastore/entities#Java_Understanding_write_costs