Вставка или обновление нескольких записей в базе данных многопоточным способом в Java - PullRequest
1 голос
/ 22 сентября 2011

Я обновляю несколько записей в базе данных.Теперь, когда пользовательский интерфейс отправляет список записей для обновления, я должен просто обновить эти записи в базе данных.Для этого я использую шаблон JDBC.

Предыдущий регистр

Раньше, чем я был, когда получал записи из пользовательского интерфейса, я просто делал

jdbcTemplate.batchUpdate(Query, List<object[]> params)

Когда бы ни было исключение, я использовал откат всей транзакции.

( Обновлено : Является ли batchUpdate многопоточным или каким-либо образом быстрее пакетного обновления?)

Более поздний случай

Но позже, как требование изменилось, когда было исключение.Поэтому, когда есть какое-то исключение, я должен знать, какие записи не удалось обновить.Поэтому мне пришлось отправлять записи обратно в пользовательский интерфейс в случае возникновения исключительной причины, почему они потерпели неудачу.

, поэтому мне пришлось сделать что-то похожее на это:

for(Record record : RecordList)
{
   try{
       jdbcTemplate.update(sql, Object[] param)
   }catch(Exception ex){
       record.setReason("Exception : "+ex.getMessage());
       continue;
   }
}

Я делаю это правильно, используя цикл?

Если да, может кто-нибудь подсказать мне, как сделать его многопоточным.Или в этом случае что-то не так?По правде говоря, я не решался использовать try catch block внутри цикла :(.

Пожалуйста, поправьте меня, действительно нужно учиться лучше, потому что я сам чувствую, что должен быть лучший способ, спасибо.

Ответы [ 2 ]

1 голос
/ 22 сентября 2011

выполнить все операции обновления для вызываемой коллекции <>, отправить ее в java.util.concurrent.ThreadPoolExecutor.пул многопоточный.

make Callable:

class UpdateTask implements Callable<Exception> {
  //constructor with jdbctemplate,sql,param goes here.
  @Override
    public Exception call() throws Exception {
        try{
              jdbcTemplate.update(sql, Object[] param)
            }catch(Exception ex){
                   return ex;
           }

        return null;
    }

вызов вызова:

<T> List<Future<T>> java.util.concurrent.ExecutorService.invokeAll(Collection<? extends Callable<T>> tasks) throws InterruptedException
1 голос
/ 22 сентября 2011

Ваш случай выглядит так, как будто вам нужно использовать проверку в java, отфильтровывать только действительные данные и отправлять в базу данных для обновления.

BO layer
-> filter out the Valid Record.
-> Invalid Record should be send back with some validation text.

In DAO layer
-> batch update your RecordList

Это даст вамлучшее представление.

Никогда не используйте исключение вставки базы данных в качестве механизма проверки.

  1. Исключения являются дорогостоящими, так как необходимо создать трассировку стека
  2. Соединение с базой данных - это еще один дорогостоящий процесс, для получения которого потребуется время
  3. Java If-Еще будет работать намного быстрее для той же проверки базы данных
...