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

标签 java mysql postgresql stream blob

我正在尝试从一个 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/

相关文章:

asp.net - 将 Entity Framework 、ASP.NET MVC Core 和 PostgreSQL 与 Heroku 结合使用

java - 如何获得 View 的结束 (x,y) 坐标?

java - 从另一个类调用时更改 TextView 的函数不起作用

MYSQL 双 WHERE 子句不适用于 = 和 AND

mysql - 在mysql查询中将字符转换为日期

在WHERE中使用IF语句的Mysql查询?

java - PostgreSQL并发事务冲突如何解决

java - Android - Firebase RTDB 检索和显示数据

java - QT 与 Flex/Flash/AIR 的多媒体对比

c# - 将 postgres box 转换为 .Net NpgsqlBox