我迷路下列關於數據存儲:數據存儲 - 在一個單一的實體組資源爭 -
建議非規範化的數據作爲數據存儲不支持連接查詢。這意味着相同的信息在多個實體複製
非規範化意味着,只要你有更新 數據,就必須在不同的實體
更新,但有1個寫的限制/秒一個單一的實體組織。因此
我的問題是:
爲了更新記錄,我打開一個交易然後
更新所需的所有實體。要更新的實體是相同的實體組內,但涉及到不同種類的
我得到一個「資源爭奪」異常
==>因此它似乎只有這樣才能更新非規格化數據在交易之外。但是這樣做非常糟糕,因爲有些實體可能會更新,而其他實體則不會。
我是唯一有這個問題的人嗎?你是如何解決它的?
謝謝,
格·
的代碼(簡化版本)如下:
Objectify ofy=ObjectifyService.beginTransaction();
try {
Key<Party> partyKey=new Key<Party>(realEstateKey, Party.class, partyDTO.getId());
//--------------------------------------------------------------------------
//-- 1 - We update the party
//--------------------------------------------------------------------------
Party party=ofy.get(partyKey);
party.update(partyDTO);
//---------------------------------------------------------------------------------------------
//-- 2 - We update the kinds which have Party as embedded field, all in the same entity group
//---------------------------------------------------------------------------------------------
//2.1 Invoices
Query<Invoice> q1=ofy.query(Invoice.class).ancestor(realEstateKey).filter("partyKey", partyKey);
for (Invoice invoice: q1) {
invoice.setParty(party);
ofy.put(invoice);
}
//2.2Payments
Query<Payment> q2=ofy.query(Payment.class).ancestor(realEstateKey).filter("partyKey", partyKey);
for (Payment payment: q2) {
payment.setParty(payment);
ofy.put(payment);
}
}
ofy.getTxn().commit();
return (RPCResults.SUCCESS);
}
catch (Exception e) {
final Logger log = Logger.getLogger(InternalServiceImpl.class.getName());
log.severe("Problem while updating party : " + e.getLocalizedMessage());
return (RPCResults.FAILURE) ;
}
finally {
if (ofy.getTxn().isActive()) {
ofy.getTxn().rollback();
partyDTO.setCreationResult(RPCResults.FAILURE);
return (RPCResults.FAILURE) ;
}
}
您能否發佈錯誤的代碼和堆棧跟蹤? – mjibson 2012-07-31 17:19:17
@mjibson堆棧跟蹤:com.plugimmo.web.server.internal.service.InternalServiceImpl requestUpdateLease:更新租約時出現問題:對這些數據存儲實體的爭用太多。請再試一次。 – Hugues 2012-07-31 17:33:57
如果您發佈您的代碼,或許我們可以提供更多幫助。 – mjibson 2012-07-31 17:50:41