Я пытаюсь загрузить журнал tomcat комбинированного шаблона в MySQL db, теперь я помещаю каждую запись в db, когда она анализируется.
Сначала прочитайте строку из InputStream,
затем проанализируйте его в LogItem, который используется для переноса записи журнала,
, затем, используя MySQLDbManager для вставки записи в базу данных,
MySQLDbManager удерживает ссылку на пул соединений с базой данных, один разон вызывается для отправки журнала, он запрашивает соединение для выполнения операции sql, а затем освобождает его。
Боюсь, если это низкое быстродействие, так как MySQLDbManager будет все время получать и освобождать соединениепроталкивание журнала.
Я думал создать список для сохранения всех LogItems, после того как файл журнала прочитан, я передаю этот список в MySQLDbManager, однако файл журнала может иметь слишком много записей, этоскажем, это приведет к тому, что журнал LogItems будет помещен в список, это безопасно?
Это два метода:
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);
}
}
Есть ли лучшая идея?
Кстати, если ребята считают, что моя проблема слишком элементарна, чтобы отвечать, вы можете отказаться отвечать, но, пожалуйста, не голосуйте за мой пост, я едва зарабатываю репутацию.:)