JDBC становится экстремально медленным после нескольких больших SQL-запросов в Scala - PullRequest
0 голосов
/ 24 февраля 2019

atm Я пытаюсь получить много данных (26 миллионов записей) из базы данных sql, чтобы поместить их в LevelDB.

Я использую scala и connectionPool из JDBC.Это мой запрос:

"ВЫБЕРИТЕ ts.block_id, ts.sender, ts.fee, ts.recipient AS.tf.amount AS Transfer_amount FROM транзакций TS LEFT OUTER JOIN передает TF ON (tf.transaction_id = ts.transaction_id) ORDER BY ts.block_id ASC LIMIT "+ (x * sqlBatchSize) +", "+ sqlBatchSize)

Где sqlbatchSize - это параметр для того, сколько записей я хочу получить в одном операторе SQL, а x - это количество итераций.Так что просто я прошу выбрать **** Предел 0,10.000, а затем 10.000,10.000, а затем 20.000,10.000 и так далее.Я пробовал разные размеры от 5к до 10к, 100к, 500к, 5ккк и тд.Пробовал с некоторым начальным значением, поэтому я получаю только записи из последней половины базы данных и тому подобное.У меня всегда одна и та же проблема.Первый запрос быстрый, второй медленнее, а затем следующие медленнее и медленнее.Не имеет значения, если я запрашиваю 10x 10k или 10x 500k записей.Всегда одно и то же.

Вот мой код, немного закороченный:

import java.nio.ByteBuffer
import java.nio.charset.StandardCharsets
import java.sql.{Connection, DriverManager}
import org.apache.commons.dbcp2._
import com.google.common.primitives.Longs
import com.typesafe.config._
import scala.math.BigInt
import java.io.File
import java.util.Calendar
import org.iq80.leveldb
import org.iq80.leveldb.impl.Iq80DBFactory._
import org.iq80.leveldb.Options
object Datasource {
  // Load config
  val conf = ConfigFactory.load()
  val dbUrl = "jdbc:mysql://" + conf.getString("database.db_host") + ":" + conf.getString("database.db_port") + "/" + conf.getString("database.db_name")
  val connectionPool = new BasicDataSource()
  connectionPool.setUsername(conf.getString("database.db_user"))
  connectionPool.setPassword(conf.getString("database.db_password"))
  connectionPool.setDriverClassName("com.mysql.jdbc.Driver")
  connectionPool.setUrl(dbUrl)
  connectionPool.setInitialSize(3)
}
object main extends App {
  var durchlaufen = 1
  var x = 0
  var sqlBatchSize = 50000
  if(durchlaufen == 1){
    try{
      var grenze = 10
      while(x < grenze) {
        val connection = Datasource.connectionPool.getConnection
        val rs = connection.createStatement.executeQuery("SELECT ts.block_id, ts.sender, ts.fee, ts.recipient AS transaction_recipient, ts.amount AS transaction_amount, ts.type, tf.recipient AS transfer_recipient, tf.amount AS transfer_amount FROM transactions ts LEFT OUTER JOIN transfers tf ON (tf.transaction_id = ts.transaction_id) ORDER BY ts.block_id ASC  LIMIT " + (x*sqlBatchSize+10000000) + ","+sqlBatchSize)
        x += 1
        while (rs.next()) {
          // Do stuff
        }
        connection.close()
        rs.close()
      }
    } 
  }
}

Я тоже пытался удалить соединение закрытьи работает над одним и тем же соединением во всех итерациях времени.Тот же результат

Я проверил с помощью visualVm память, и есть один байтовый массив, который очень велик и максимально равен оперативной памяти.Но я понятия не имею, что это за байтовый массив

У кого-нибудь есть идея, почему запросы начинают работать слишком медленно?это будет замедляться, хорошо.Я могу понять, что.Но если я запрашиваю 10x 5k, он идет с той же скоростью, что и 10x 500k, только один запрос занимает больше времени.В конце третий запрос занимает вдвое больше времени, а седьмой - в 6-9 раз дольше, чем первый

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