Как я могу скопировать/клонировать одну строку из ResultSet в Java? Многопоточная реализация

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

Итак, что я хотел бы сделать, это:

ResultSet rs;

public void loadResultSet(){

    ...
    rs = _preparedStatement.executeQuery();

    int rowSize = 0;

    while (rs.next()) {
       rowSize++;
    }


    //this method starts 10 threads simultaneously
    runThreads(rowSize);

     ...

}

И...

@Override
public void run() {


    //Unknown object that allows me to store a copy of a single row from ResultSet
    Foo foo = rs.absolute(index);

    //Then i can retrieve data just like a normal ResultSet
    String s = foo.getString(1);

    ....
    ....

} 

Любое предложение?

Образцы очень ценятся! Спасибо!


person Immortal    schedule 05.04.2013    source источник
comment
Вы запускаете поток для каждой строки, так зачем запускать набор результатов только для того, чтобы получить подсчет? просто запустите поток для каждой строки... если вы хотите ограничить свои потоки, используйте службу Executors и используйте пул потоков с максимальным N (например, 10 потоков), а затем направьте потоки на выполнение задачи для каждой строки.   -  person Eran Medan    schedule 05.04.2013
comment
Не в этом дело. В любом случае я не могу читать из нескольких потоков в один и тот же ResultSet в другой позиции, и проблема будет такой же.   -  person Immortal    schedule 05.04.2013
comment
Единственная причина, по которой я бы использовал потоки, заключается в том, что обработка каждой строки занимает много времени, например. вы можете получить следующую строку, но вы блокируете обработку предыдущей, нет другой реальной выгоды от создания многопоточности. Не могли бы вы объяснить, что мне не хватает?   -  person Eran Medan    schedule 05.04.2013
comment
У меня много рядов. Для каждой строки я должен проверить, находится ли она в списке, добавить одну часть своих данных в список, а другую часть в другой список, проверить что-то в поле даты (один столбец в строке - это дата) и многое другое. Поскольку это простая конструкция с несколькими контекстами данных, я подумал, что многопоточность будет оценена по достоинству!   -  person Immortal    schedule 05.04.2013
comment
Я бы проверил и посмотрел, сколько времени тратится на обработку строки, но в любом случае у вас не должно быть одного потока на строку. вы должны открыть пул потоков с настраиваемой длиной рабочих, каждый из которых получает КОПИЮ значений набора результатов и делает с ним все, что нужно сделать, таким образом, вы не блокируете строку, хотя я бы сделал некоторые тесты и посмотреть если это действительно дает вам видимый прирост производительности. Обычно ваша база данных является узким местом, а не обработкой... что вы МОЖЕТЕ сделать, так это увеличить размер выборки по умолчанию из базы данных и уменьшить количество вызовов TCP к ней...   -  person Eran Medan    schedule 05.04.2013


Ответы (1)


Если бы я был на вашем месте, я бы предпочел выполнять запросы в отдельных потоках, например:

выберите * из table_name, где mod(id,threadCount)=threadId

Просто дайте идентификатор каждому потоку и выполните их. При этом каждый поток будет иметь разные данные для обработки.

person Neron    schedule 05.04.2013
comment
Я использую PostgreSQL и, к сожалению, такая вещь кажется довольно медленной. - person Immortal; 05.04.2013
comment
нет, это зависит от вашего стола, конечно. у нас есть таблица, и каждый день в нее вставляется 6 миллионов элементов. На самом деле мы используем его с датой вставки ограничения, но для нас это довольно быстро. - person Neron; 08.04.2013