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 раз дольше, чем первый