我有一个 HashMap,我在 BLOB 数据类型字段中对 Oracle 数据库进行序列化和反序列化。我想使用此字段执行查询。例如,应用程序将创建一个新的 HashMap,并具有一些键值对。我想查询数据库以查看数据库中是否已存在具有此数据的 HashMap。我不知道该怎么做,如果我必须去数据库中的每条记录,反序列化它,然后比较,这似乎很奇怪,SQL 是否处理比较 BLOB,所以我可以...从 PROCESSES where foo = ?....而且 foo 是 BLOB 类型,而 ? 是新HashMap的一个实例吗?谢谢
7 回答
这里有一篇文章供您阅读:敲钉子:旧鞋或玻璃瓶
我没有听说太多关于您的应用程序的底层架构,但我可以立即告诉您,您没有理由需要以这种方式使用 HashMap。这是一种糟糕的技术,简单明了。
您的问题的答案不是一个聪明的 Oracle 查询,而是对您的应用程序架构的重新设计。
首先,您不应该将 HashMap 序列化到数据库(更一般地说,您不应该序列化需要查询的任何内容)。在您的应用程序中创建一个表来表示哈希图要容易得多,如下所示:
哈希映射 -------- MapID (pk int) 密钥(pk varchar) 价值
一旦您在数据库中获得了 hashmap 的内容,查询数据库以查看数据是否已经存在或生成任何其他类型的聚合数据就很简单了:
SELECT Count(*) FROM HashMaps where MapID = ? AND Key = ?
将序列化对象存储在数据库中几乎总是一个坏主意,除非您提前知道不需要查询它们。
你是如何序列化 HashMap 的?有很多方法可以序列化数据和像 HashMap 这样的对象。比较两个映射,尤其是序列化形式的映射,并非易事,除非您的序列化技术保证两个等效映射始终以相同的方式序列化。
解决这种混乱的一种方法是对一些很少需要查询的对象使用 XML 序列化。例如,在我工作的地方,我们有一个日志表,其中某个日志消息作为 XML 文件存储在 CLOB 字段中。此 xml 数据表示一个序列化的 Java 对象。通常我们查询记录中的其他列,并且仅以单个原子步骤读取/写入 blob。然而,有一次或两次需要对 blob 进行深入检查,而使用 XML 允许这种情况发生(Oracle 支持在 varchar2 或 CLOB 字段中查询 XML 以及本机 XML 对象)。如果谨慎使用,这是一项有用的技术。
查看 dbms_crypto.hash 以对您的 blob 进行哈希处理。将散列存储在 blob 旁边,它可以让您将搜索范围缩小到可管理的范围内。我不建议存储散列映射,但这是搜索 blob 之间完全匹配的通用技术。另请参阅SQL - 你如何比较 CLOB
我不能不同意,但有人告诉我这样做。我很欣赏你的解决方案,这就是我以前所拥有的。谢谢
我不需要比较 BLOB,但它似乎是通过dbms_lob
包支持的。
请参阅dbms_lob.compare()
http://www.psoug.org/reference/dbms_lob.html
Oracle 可以使用 Java(或 Windows 上的 .net)定义新的数据类型,您可以为序列化对象定义数据类型并定义查询如何处理它。
如果你试试这个,那就太缺乏了......
如果将数据序列化为 xml,并将数据存储在 xml 中,则可以在 sql 查询中使用 xpath。(对不起,因为我是一个 SqlServer 人,我不知道如何在 Oracle 中执行此操作的详细信息。)
- 如果您只需要更新部分序列化数据,请不要这样做。
- 同样,如果任何数据被其他数据指向或指向其他数据,则不要这样做。