Отличные параллельные sql-запросы

#sql #multithreading #groovy #gpars

#sql #многопоточность #отличный #gpar

Вопрос:

Я пытаюсь запускать параллельные sql-запросы с использованием GPAR. Но почему-то это работает не так, как я ожидал. Поскольку я относительно новичок в параллелизме groovy / java, я не уверен, как решить мою проблему.

Я следую коду:

     def rows = this.sql.rows(
        "SELECT a_id, b_id FROM data_ids LIMIT 10 OFFSET 10"
    )
  

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

Для получения подробных данных я использую следующий код:

 GParsPool.withPool() {
result = rows.collectParallel {
    // 2. Get the data for each source and save it in an array.
    def tmpData = [:]
    def row = it

    sql.withTransaction {
        if (row.a_id != null) {
            tmpData.a = sql.firstRow("SELECT * FROM data_a WHERE id = '"   row.a_id   "'")
        }

        if (row.b_id != null) {
            tmpData.b = sql.firstRow("SELECT * FROM data_b WHERE id = '"   row.b_id   "'")
        }
    }

    return tmpData
}

// 3. Return the loaded data.
return result
  

Теперь я запускаю код, и все работает нормально, за исключением того, что код не выполняется параллельно. Используя JProfiler, я вижу, что у меня заблокированы потоки и ожидающие потоки, но 0 выполняемых потоков.

Спасибо за любую помощь. Если вам нужна дополнительная информация, я ее предоставлю 🙂

Даниэль

Комментарии:

1. Вы повторно используете один и тот же Sql объект во всех этих потоках? Вот как это выглядит, и я не советую этого делать; Я сомневаюсь, что соединения JDBC потокобезопасны. Также обратите внимание, что запросы блокируют текущий поток до тех пор, пока данные не будут возвращены. Таким образом, даже если все потоки запущены, как только они достигнут точки вызова базы данных, они заблокируются. Попробуйте использовать Sql экземпляр для каждого потока. Sql Класс имеет конструктор, который принимает другой Sql экземпляр.

2. Или создайте экземпляр Sql с использованием источника данных. Это предоставит gpar пул соединений.

3. Спасибо, ребята, за вашу помощь! Я использую экземпляр Sql для каждого потока.