Очень быстро вставьте много строк в базу данных Oracle - PullRequest
0 голосов
/ 15 ноября 2011

Мне нужно очень быстро вставить много строк SQL в базу данных Oracle.IndexData - это класс, который содержит метод save для вставки в базу данных oracle.

while ((line = in.readLine()) != null) {
    if(line.contains("numDocs")) {
        numDocs = in.readLine().trim();
//For Inserting 
IndexData id = new IndexData(timeStamp, 1, 2, numcDocs);
id.save();
    }  else if(line.contains("indexSize")) {
        indexSize = in.readLine().trim();
//For Inserting 
IndexData id = new IndexData(timeStamp, 1, 3, indexSize);
id.save();
        } else if(line.contains("indexReplicatedAt")) {
   replicationTime = in.readLine().trim();           
//For Inserting         
IndexData id = new IndexData(timeStamp, 1, 4, replicationTime );
id.save();
    } 
    }

    BufferedReader inUrl   = new BufferedReader (new InputStreamReader (isUrl));
    String lineUrl;
    Pattern regex = Pattern.compile("<str name=\"status\">(.*?)</str>");

    while ((lineUrl = inUrl.readLine()) != null) {
    if(lineUrl.contains("str name=\"status\"")) {
        Matcher regexMatcher = regex.matcher(lineUrl);
        if (regexMatcher.find()) {
        status = regexMatcher.group(1);
//For Inserting
IndexData id = new IndexData(timeStamp, 1, 5, status);
id.save();
        }                   


}  
}

А это мой класс IndexData -

public IndexData(String timestamp, String serveId, String informationId, String value ) {
this.timestamp=timestamp;
this.serverId=serverId;
this.informationId=informationId;
this.value=value;
}
//For Inserting
public void save() throws SQLException {

ps = DataSource.conn.prepareStatement (
"INSERT INTO table(timestamp, serverId, informationId, value) VALUES(?,?,?,?)");

ps.setString (1, timestamp);
ps.setString (2, serverId);
ps.setString (3, informationId);
ps.setString (4, value);

ps.executeUpdate();
ps.close ();
}

несколько множественных SQL-операторов для вставки.Так как я снова и снова открываю класс IndexData для вставки только одной строки в БД для каждой информации.Есть ли другой способ, который быстрее, чем этот.Любые предложения будут оценены ..

Ответы [ 4 ]

6 голосов
/ 15 ноября 2011

Посмотрите на PreparedStatement.addBatch и PreparedStatement.executeBatch - вы можете создать один подготовленный оператор, добавить несколько наборов параметров для выполнения, а затем выполнить пакет.Возможно, вы захотите выбрать некоторое количество вставок в пакете, ограничивая объем отложенной работы в памяти.

2 голосов
/ 15 ноября 2011

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

1 голос
/ 15 ноября 2011

Я чувствую неприятный запах в вашем дизайне, так как объект вашей сущности отвечает за создание и закрытие оператора подготовки, соединение с базой данных является "глобальным" и т. Д.

Есть несколько распространенных способов взглянуть на:

  1. Выполните оператор подготовки только один раз и используйте его для многократного обновления
  2. Использовать пакетную вставку / обновление

Тем не менее, оба способа требуют пересмотра вашего дизайна (но я думаю, что это стоит сделать).

(И, если вы публикуете свой код, пожалуйста, убедитесь, что вы правильно сделали отступ. Теперь это просто беспорядок)

0 голосов
/ 15 ноября 2011

Одна вещь, которую вы можете сделать, это записать запросы в файл и загрузить файл в БД в отдельном потоке.Это потому, что все ваши запросы просто запросы вставки.Это дает сбой, хотя, если загрузка файла не удалась, вы не знаете, где это неправильно.Таким образом, вы можете уменьшить отпечаток и работать быстрее.

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