J'essaie de charger le journal tomcat du pattern combiné dans MySQL db, maintenant je pousse chaque enregistrement à db quand il est analysé.Performance de la connexion SQL
D'abord, lire une ligne du InputStream,
analyser ensuite à un Logitem qui est utilisé pour envelopper un enregistrement de journal,
puis en utilisant le MySQLDbManager pour insérer l'enregistrement db,
MySQLDbManager contient une référence d'un pool de connexion à la base de données, une fois qu'il est appelé pour pousser un journal, il demande une connexion pour faire l'opération sql, puis le relâcher
Je crains que ce soit une faible performance MySQLDbMana ger obtiendra et relâchera la connexion tous les temps pendant la poussée du journal.
J'ai pensé créer une liste pour sauvegarder tous les LogItems, après avoir lu le fichier journal, je passe cette liste à MySQLDbManager, mais le fichier journal contient peut-être trop d'enregistrements, c'est-à-dire qu'il provoque un Log de LogItems à mettre dans la liste, est-ce sûr?
Voici deux méthode:
MySQLDbManager dbm = MySQLDbManager.getInstance();
private void pushLogToDbByStream(BufferedReader br) {
String line;
int total = 0;
int error = 0;
try {
while ((line = br.readLine()) != null) {
LogItem li = LogParser.parser(line);
dbm.writeLogItemToDb(li);
total++;
}
} catch (IOException e) {
log.error("Error occur when read log from file");
} catch (IllegalStateException e) {
error++;
total++;
}
log.info(total + " items have been processed, " + error + " failed");
}
public int writeLogItemToDb(LogItem item) {
//get a connect from the connect pool
DBConnection dbc = pool.alloc();
String insertSql = "insert into log values" + item.buildSQLInsertValues();
//The buildSQLInsertValues() will return something like this--('127.0.0.1','GET','http://www.google.com'...)
int res;
try {
res = dbc.updateSQL(insertSql);
return res;
} catch (SQLException e) {
log.error("error occur when try to insert the item to db +\n" + insertSql + "\n");
return 0;
} finally {
//release the connection
pool.release(dbc);
}
}
est-il une meilleure idée?
BTW, si les gars pensent que mon problème est trop élémentaire pour répondre, vous pouvez refuser de répondre, mais s'il vous plaît ne pas voter mon poste, je gagne à peine la réputation. :)
Oui, c'est vrai, je peux tester le temps nécessaire pour pousser log à db, mais je n'ai aucune idée de tester combien d'objets peuvent être mis à une liste ou une carte au maximum, il suffit de leur mettre un objet lui-même arrêter le travail? Quoi qu'il en soit, votre réponse "vous ne serez pas en train d'ouvrir et de fermer les connexions physiques pour chaque requête." est plutôt utile pour moi. Merci. – hguser