J'ai un jeu où toutes les X secondes, il écrira les valeurs modifiées en mémoire dans ma base de données. Ces valeurs sont stockées dans des conteneurs (HashMaps et ArrayLists) lorsque les données qu'ils contiennent sont modifiées.
Pour simplifier, faisons comme si je n'avais qu'un seul conteneur à écrire dans la base de données:
public static HashMap dbEntitiesDeletesBacklog = new HashMap();
Ma boucle d'écriture dans la base de données:
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("Temps d'enregistrement dans la base de données : " + (System.nanoTime() - startTime) / 1000000 + " millisecondes");
}
}, 0, 10000); //TODO:: trouver le délai d'enregistrement parfait
Ma méthode de mise à jour:
private boolean UpdateEntitiesTable() {
Iterator> it = dbEntitiesDeletesBacklog.entrySet().iterator();
while (it.hasNext()) {
Entry 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("L'entité " + tmpEntityId + " n'a pas pu être supprimée.");
return false;
}
it.remove();
dbEntitiesDeletesBacklog.remove(tmpEntityId);
}
Dois-je créer une sorte de mécanisme de verrouillage pendant la 'sauvegarde dans la base de données' pour le HashMap dbEntitiesDeletesBacklog et d'autres conteneurs non inclus dans cet extrait ? Je pense que oui, car il crée son itérateur, puis boucle. Que se passe-t-il si quelque chose est ajouté après la création de l'itérateur et avant la fin de la boucle à travers les entrées. Désolé, c'est plus une question de processus que d'aide au code (puisque j'ai inclus autant de code d'exemple), mais je voulais m'assurer que c'était facile à comprendre ce que j'essaie de faire et de demander.
Même question pour mes autres conteneurs que j'utilise comme ceci:
public static ArrayList dbCharacterDeletesBacklog = new ArrayList();
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("Personnage (deleteSuccess) : " + deleteSuccess);
return false;
}
}
dbCharacterDeletesBacklog.clear();
return true;
}
Merci beaucoup, comme toujours, pour toute aide sur ce sujet. C'est grandement apprécié !!