6

我尝试使用 SQL 开发人员插入 BLOB 数据。但我找不到实际用于插入 BLOB 数据的插入语句。

除此之外,数据库速度真的很慢。对于小文件,它执行得很好。但是当我尝试将 50 mb avi 文件导入 BLOB 时,花了 3-4 分钟,但仍然没有完成。当我尝试将 BLOB 数据导出到文件时,导出过程也很慢。我使用的是 Oracle 10g Express Edition。如果数据库速度甚至比文件系统速度还慢,那么为什么要使用数据库来存储 BLOB 数据呢?有没有其他方法可以优化性能?

4

2 回答 2

5

首先,您应该期望将 BLOB 存储在数据库中(有时会慢一些,通常会显着)慢,但肯定不会比将它们存储在文件系统中快。将它们存储在数据库中的原因不在于性能,而在于例如:

  • 在集群或负载平衡场景中(共享)文件系统不可用
  • 易于备份:单个进程,使用文件和数据库时 2 个进程
  • 交易安全:一个 BLOB 要么存在,要么不完整,但不处于半生不熟的阶段
  • 其他我现在想不到的。

一般的经验法则是,如果您不关心这些,您应该将文件存储为 ... 文件。将元数据和路径名存储在数据库中是恕我直言的好习惯和常见做法。

关于 Oracle 调优:有相关书籍。我怀疑以死树平装书格式将它们加起来远远超过一吨。您可能首先查看 Oracle 进程的内存消耗 - 经验法则:如果它小于一个 gig 并且您使用 BLOB,那么您就有麻烦了。阅读不同的内存池以及如何增加它们。速成版可能有一些限制。

于 2012-08-31T17:19:13.587 回答
1

这不是您可以与 sql-developer 一起使用的代码,它是使用 StringBuffer 来插入 blob 的 Java 代码。希望它会有用:

private void addBlob(oracle.jdbc.OracleConnection oracleConn, StringBuffer content) throws Exception
{    
      PreparedStatement st = null;
      try {                
            oracle.sql.BLOB blob = oracle.sql.BLOB.createTemporary(oracleConn, true, oracle.sql.BLOB.DURATION_SESSION);

            blob.setBytes(1, content.toString().getBytes("UTF-8"));

            st = oracleConn.prepareStatement("INSERT INTO MYTABLE (id, content) VALUES (MYTABLE_S.NEXTVAL, ?)");
            st.setBlob(1, blob);
            st.execute();
            st.close();
        }
        catch (Exception e) {
            utils.writeLog("Blob insertion Failed", e, utils.ERR);
            throw e;
        }        
        finally{
            st.close();
        }
  }
于 2012-08-31T18:40:54.283 回答