【问题标题】:Serializing objects as BLOBs in Oracle在 Oracle 中将对象序列化为 BLOB
【发布时间】:2010-09-27 04:36:29
【问题描述】:

我有一个 HashMap,我在 BLOB 数据类型字段中对 Oracle 数据库进行序列化和反序列化。 我想使用此字段执行查询。 例如,应用程序将创建一个新的 HashMap,并具有一些键值对。 我想查询数据库以查看数据库中是否已存在具有此数据的 HashMap。 我不知道该怎么做,如果我必须去数据库中的每条记录,反序列化它,然后比较,这似乎很奇怪,SQL 是否处理比较 BLOB,所以我可以...从 PROCESSES where foo = ?....而且 foo 是 BLOB 类型,而 ?是新HashMap的一个实例吗? 谢谢

【问题讨论】:

    标签: oracle serialization blob


    【解决方案1】:

    这里有一篇文章供你阅读:Pounding a Nail: Old Shoe or Glass Bottle

    我没有听到太多关于您应用程序的底层架构的信息,但我可以立即告诉您,从不您应该以这种方式使用 HashMap 的理由。这是一种糟糕的技术,简单明了。

    您的问题的答案不是一个聪明的 Oracle 查询,而是对您应用程序架构的重新设计。

    首先,您不应该将 HashMap 序列化到数据库(更一般地说,您不应该序列化需要查询的任何内容)。在您的应用程序中创建一个表来表示哈希图要容易得多,如下所示:

    哈希映射 -------- MapID (pk int) 密钥(pk varchar) 价值

    一旦您的数据库中包含哈希图的内容,查询数据库以查看数据是否已经存在或生成任何其他类型的聚合数据很简单:

    SELECT Count(*) FROM HashMaps where MapID = ? AND Key = ?
    

    【讨论】:

      【解决方案2】:

      在数据库中存储序列化对象几乎总是一个坏主意,除非您提前知道不需要查询它们。

      你是如何序列化 HashMap 的?有很多方法可以序列化数据和像 HashMap 这样的对象。比较两个映射(尤其是序列化形式)并非易事,除非您的序列化技术保证两个等效映射始终以相同的方式序列化。

      解决这种混乱的一种方法是对一些很少需要查询的对象使用 XML 序列化。例如,在我工作的地方,我们有一个日志表,其中某个日志消息作为 XML 文件存储在 CLOB 字段中。此 xml 数据表示一个序列化的 Java 对象。通常我们查询记录中的其他列,并且只在单个原子步骤中读取/写入 blob。然而,有一次或两次需要对 blob 进行深入检查,而使用 XML 允许这种情况发生(Oracle 支持在 varchar2 或 CLOB 字段中查询 XML 以及本机 XML 对象)。如果谨慎使用,这是一项有用的技术。

      【讨论】:

        【解决方案3】:

        查看 dbms_crypto.hash 以对您的 blob 进行哈希处理。将散列存储在 blob 旁边,它可以让您将搜索范围缩小到可管理的范围内。我不建议存储散列图,但这是搜索 blob 之间完全匹配的通用技术。 另见SQL - How do you compare a CLOB

        【讨论】:

        • 两个hashmap实例无论其内容如何都有不同的hashcode,除非你编写自己的结构化散列算法。这不是一个很好的解决方案,因为它脆弱、效率低下,而且这种方式的哈希不允许用户在数据库中搜索哈希图的子集。
        【解决方案4】:

        我不能不同意,但有人告诉我这样做。 我很欣赏您的解决方案,这就是我以前所拥有的。 谢谢

        【讨论】:

          【解决方案5】:

          我不需要比较 BLOB,但似乎通过 dbms_lob 包支持它。

          dbms_lob.compare()http://www.psoug.org/reference/dbms_lob.html

          【讨论】:

            【解决方案6】:

            Oracle 可以使用 Java(或 Windows 上的 .net)定义新的数据类型,您可以为序列化对象定义数据类型并定义查询如何处理它。

            如果你试试这个,那就太缺乏了......

            【讨论】:

              【解决方案7】:

              如果您将数据序列化为 xml,并将数据存储在 xml 中,则您可以在 sql 查询中使用 xpath。 (对不起,我是一个SqlServer的人,我不知道在Oracle中如何做到这一点的细节。)

              • 如果您只需要更新部分序列化数据,请不要这样做。
              • 同样,如果任何数据被其他数据指向或指向其他数据,则不要这样做。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2020-03-03
                • 1970-01-01
                • 2014-08-05
                • 2013-01-23
                • 1970-01-01
                • 2020-06-13
                • 2012-09-29
                • 1970-01-01
                相关资源
                最近更新 更多