目前在Java App Engine上使用Firebase 3.0.2。我正在部署到基本的扩展模块。我的目标是将一些数据从数据存储区导出到firebase。我使用任务队列一次从数据存储区处理一个实体。我正在尝试将数据存储区中的Car对象添加到Firebase中。完成事务后(我希望保持相同的ID并能够更新此数据,因此事务)我想将数据添加到autosuggest / cars / path并更新计数器(也使用事务)。
所以我正在构建的结构是:
{
"autosuggest": {
"cars" {
"bu": {
"123": {
"name": "buick"
}
}
},
"cars": {
"123": {
"name" : "buick",
"desc": "Big car"
}
},
"stats": {
"carCt": 1
}
}
然而,我得到了奇怪的结果,例如交易没有完成。我也在/ autosuggest / cars /中获取数据,以carIds为关键。 CarIds仅用于代码中的/ key中的键 FirebaseDatabase.getInstance()。getReference()。child(" cars")。child(String.valueOf(cars.getId()))。runTransaction(new Handler(){ @覆盖 public Result doTransaction(MutableData mutableData){ mutableData.setValue(部门); return Transaction.success(mutableData); }
@Override
public void onComplete(DatabaseError databaseError, boolean b, DataSnapshot dataSnapshot) {
if (databaseError != null) {
} else {
addToAutoSuggestForString(car, String.valueOf(car.getId()));
incrementCarCounter();
}
}
});
private void incrementCarCounter() {
FirebaseDatabase.getInstance().getReference().child("stats").child("carCt").runTransaction(new Handler() {
@Override
public Result doTransaction(MutableData mutableData) {
Integer currentData = mutableData.getValue(Integer.class);
if (currentData == null) {
mutableData.setValue(1);
} else {
mutableData.setValue(currentData + 1);
}
return com.google.firebase.database.Transaction.success(mutableData);
}
@Override
public void onComplete(DatabaseError databaseError, boolean b, DataSnapshot dataSnapshot) {
if (databaseError != null) {
log.info("error");
} else {
log.info("Firebase counter increment succeeded.");
}
}
});
}
private void addAutoSuggestForString(final AutoCompleteResult result, String name) {
FirebaseDatabase.getInstance().getReference().child("autosuggest/cars").child(searchStr + "/" + result.getKey()).setValue(result);
}
}
上面的代码中是否有任何会导致奇怪行为和/或交易失败的内容?运行这是一个最大速率为10 / s的任务问题吗? Firebase sdk的内部有点神秘。是否一遍又一遍地调用Firebase.getInstance()。getReference(),或者每次打开一个单独的websocket?