将BLOB从一个DB读取到另一个DB

时间:2010-01-17 14:55:57

标签: 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分钟。我的直觉告诉我这应该比第二个更有效,但事实并非如此。

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

发生了什么事?

1 个答案:

答案 0 :(得分:2)

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)。