如何确保执行顺序

时间:2014-06-01 14:45:47

标签: java multithreading mongodb database

当涉及不同的数据库操作且一个操作依赖于其他操作时,有哪些不同的方法和最佳方法来确保执行顺序。 像这样的代码中的东西:

String countryName = "name";
Country countryObj = new Country();
countryObj.setName(countryName);
countryObj.setStates(new ArrayList<State>());
// update database
PersistenceManager manager = new PersistenceManager();
List<Country> countries = manager.getAllCountries();                    
if (countries != null && !countries.isEmpty()) {
    for (Country country2 : countries) {
        if (country2.getName().equalsIgnoreCase(countryName)) {
            return;
        }
    }
}
manager.saveCountry(countryObj, country);

这里manager.getAllCountries()从数据库中检索所有国家,manager.saveCountry依赖于以前的操作

1 个答案:

答案 0 :(得分:0)

我认为您需要从查看数据建模的角度开始使用atomic operations

您所描述的是插入数据(如果不存在)。您可以使用upsert执行此操作,并根据您的逻辑查看该国家/地区是否存在您不想更改任何内容(因为您刚刚退出方法)。因此,您只需使用$setOnInsert运算符即可,只有<{>}} 才能保存countryObj的值,如果它还不存在的话。

最后一个障碍是名称匹配 - 因为您正在测试名称的小写版本的等效性 - 您可以在查询中使用regular expression,但这样可以对集合中的文档进行全面扫描 - 所以另一个选择是存储小写名称以匹配。

使用shell语法查询和插入的示例如下:

db.collection.update(
   {lname: countryName.toLowerCase()},
   { $setOnInsert: { name: countryName, states: [{name: "Victoria"}]  } },
   { upsert: true }
)

当然,如果您想在country存在的情况下更新任何信息,即使该国家/地区存在,您也可以使用$set运算符进行更新。