Я пытаюсь перейти от набора mysql к postgres, и одно из полей, с которыми у меня возникают проблемы при перемещении, - это mysql LBLOB. Я пытаюсь переместить его в тип LargeObject в Postgres, и у меня есть некоторые проблемы со скоростью. Я делаю это на Java / Groovy, и, честно говоря, потоковое вещание меня смущает.
Я испробовал два подхода: удерживать LBLOB в памяти и записать его непосредственно в LO, записать LBLOB на диск (в конце концов, это файл), а затем прочитать файл обратно в LO.
Второй подход намного быстрее, и я не могу понять почему, потому что я думаю, что он все еще слишком медленный.
Вот первый подход.
InputStream ins = rs.getBinaryStream(1);
def b
while ((b = ins.read()) > -1) {
obj.write(b.toInteger().byteValue())
}
«ins» - это ByteArrayInputStream, поэтому я читаю это в (в int), а затем записываю в «obj», LO. Это занимает около 7 минут для 1 МБ файла. Моя интуиция говорит мне, что это должно быть более эффективным, чем второе, но это не так.
Я сэкономлю фрагмент кода для версии записи в файл, но он довольно простой. Он читает из БД таким же образом, но затем записывает вывод в файл на диске. Затем я иду читать файл с диска и записываю его в LO. Этот подход занимает около 8 секунд для того же файла.
Что происходит?