Производительность SQL-соединения - PullRequest
2 голосов
/ 20 октября 2010

Я пытаюсь загрузить журнал 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);
    }
}

Есть ли лучшая идея?

Кстати, если ребята считают, что моя проблема слишком элементарна, чтобы отвечать, вы можете отказаться отвечать, но, пожалуйста, не голосуйте за мой пост, я едва зарабатываю репутацию.:)

1 Ответ

2 голосов
/ 20 октября 2010

Если вы используете пул соединений, то нет фактических издержек на то, что «MySQLDbManager будет постоянно получать и освобождать соединение во время отправки журнала», потому что вы фактически не будете открывать и закрывать физические соединения для каждого запроса. Это все назначение пула соединений.

Кроме того, в любое время, когда вы боитесь, как что-то будет работать, лучшее, что вы можете сделать, - это просто проверить это самостоятельно. Напишите быстрое тестовое окружение и посмотрите, насколько быстро работает этот код - сколько журналов вы можете отправить в базу данных в секунду? Сколько времени требуется, чтобы протолкнуть журнал размером 100 МБ в базу данных?

Только при фактическом тестировании кода вы наверняка узнаете какие-либо ответы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...