我有一个游戏,每X秒钟它会将内存中的更改值写回到我的数据库。这些值在编辑它们所包含的数据时存储在容器中(HashMap和ArrayList)。
为了简单起见,让我们假设我只有一个容器要写入数据库:
我的数据库写入循环:
我的更新方法:
“在‘保存到数据库’时,我需要为dbEntitiesDeletesBacklog HashMap和其他未在此节选中的容器创建某种锁定机制吗?我认为我需要这样做,因为它创建了迭代器,然后循环。如果在创建迭代器之后,在循环遍历条目之前添加了一些内容,会怎样呢?对于我的其他容器,我使用相同的方式,请问是否也需要这样做?抱歉,这更多是一个流程问题而不是代码帮助问题(因为我包含了如此多的示例代码),但我想确保易于理解我正在尝试做什么并且询问什么。”
非常感谢您一如既往的帮助。我们非常感激!
为了简单起见,让我们假设我只有一个容器要写入数据库:
public static HashMap<String, String> dbEntitiesDeletesBacklog = new HashMap<String, String>();
我的数据库写入循环:
Timer dbUpdateJob = new Timer();
dbUpdateJob.schedule(new TimerTask() {
public void run() {
long startTime = System.nanoTime();
boolean updateEntitiesTableSuccess = UpdateEntitiesTable();
if (!updateEntitiesTableSuccess){
try {
conn.rollback();
} catch (SQLException e) {
e.printStackTrace();
logger.fatal(e.getMessage());
System.exit(1);
}
} else { //everything saved to DB - commit time
try {
conn.commit();
} catch (SQLException e) {
e.printStackTrace();
logger.fatal(e.getMessage());
System.exit(1);
}
}
logger.debug("Time to save to DB: " + (System.nanoTime() - startTime) / 1000000 + " milliseconds");
}
}, 0, 10000); //TODO:: figure out the perfect saving delay
我的更新方法:
private boolean UpdateEntitiesTable() {
Iterator<Entry<String, String>> it = dbEntitiesDeletesBacklog.entrySet().iterator();
while (it.hasNext()) {
Entry<String, String> pairs = it.next();
String tmpEntityId = pairs.getKey();
int deletedSuccess = UPDATE("DELETE" +
" FROM " + DB_NAME + ".entities" +
" WHERE entity_id=(?)", new String[]{tmpEntityId});
if (deletedSuccess != 1) {
logger.error("Entity " + tmpEntityId + " was unable to be deleted.");
return false;
}
it.remove();
dbEntitiesDeletesBacklog.remove(tmpEntityId);
}
“在‘保存到数据库’时,我需要为dbEntitiesDeletesBacklog HashMap和其他未在此节选中的容器创建某种锁定机制吗?我认为我需要这样做,因为它创建了迭代器,然后循环。如果在创建迭代器之后,在循环遍历条目之前添加了一些内容,会怎样呢?对于我的其他容器,我使用相同的方式,请问是否也需要这样做?抱歉,这更多是一个流程问题而不是代码帮助问题(因为我包含了如此多的示例代码),但我想确保易于理解我正在尝试做什么并且询问什么。”
public static ArrayList<String> dbCharacterDeletesBacklog = new ArrayList<String>();
private boolean DeleteCharactersFromDB() {
for (String deleteWho : dbCharacterDeletesBacklog){
int deleteSuccess = MyDBSyncher.UPDATE("DELETE FROM " + DB_NAME + ".characters" +
" WHERE name=(?)",
new String[]{deleteWho});
if (deleteSuccess != 1) {
logger.error("Character(deleteSuccess): " + deleteSuccess);
return false;
}
}
dbCharacterDeletesBacklog.clear();
return true;
}
非常感谢您一如既往的帮助。我们非常感激!