2010-10-20 6 views
2

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. :)

Répondre

2

Si vous utilisez un pool de connexion, il n'y a pas de surcharge réelle de "MySQLDbManager obtiendra et relâchera la connexion toutes les fois pendant le push du journal", car vous n'ouvrirez pas et ne fermerez pas réellement les connexions physiques. chaque demande. C'est le but entier d'un pool de connexion.

En outre, chaque fois que vous avez peur de la performance, la meilleure chose à faire est de le tester vous-même. Ecrire un testbench rapide et voir à quelle vitesse ce code est - combien de journaux pouvez-vous pousser à la base de données par seconde? Combien de temps faut-il pour insérer un journal de 100 Mo dans la base de données? Ce n'est qu'en testant réellement le code que vous connaîtrez les réponses à coup sûr.

+0

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