gpt4 book ai didi

java - 将 BLOB 从一个数据库读取到另一个数据库

转载 作者:行者123 更新时间:2023-11-29 07:14:45 25 4
gpt4 key购买 nike

我正在尝试从一个 mysql 集移动到一个 postgres 集,我在移动时遇到问题的字段之一是 mysql LBLOB。我正在尝试将它移动到 postgres 中的 LargeObject 类型,但我遇到了一些速度问题。我在 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。一个 1MB 的文件大约需要 7 分钟。我的直觉告诉我这应该比第二个更有效率,但事实并非如此。

我将保留写入文件版本的代码片段,但它非常基础。它以相同的方式从数据库读取,然后将输出写入磁盘上的文件。然后我从磁盘读取文件并将其写入 LO。对于同一文件,该方法大约需要 8 秒。

这是怎么回事?

最佳答案

obj.write(b.toInteger().byteValue())

这种方法看起来效率不高。

尝试缓冲 I/O:

  public void drain(InputStream in, OutputStream out) throws IOException {
byte[] buffer = new byte[1024];
int r;
while ((r = in.read(buffer)) > -1) {
out.write(buffer, 0, r);
}
}

适当调整缓冲区大小。

如果文件很大,您可能会发现操作系统在执行磁盘缓存(磁盘 I/O,以及内存管理)时出现问题。从互联网的这一端很难确定。尝试分析和比较这两种方法(至少,您可以使用 -Xprof command line switch )。

关于java - 将 BLOB 从一个数据库读取到另一个数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2081367/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com