在Oracle中将对象序列化为BLOB

时间:2008-12-16 17:55:12

标签: oracle serialization blob

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

7 个答案:

答案 0 :(得分:4)

以下是一篇供您阅读的文章:Pounding a Nail: Old Shoe or Glass Bottle

我没有听说过你的应用程序的底层架构,但我可以立刻告诉你, never 是你需要以这种方式使用HashMap的原因。这是一项简单而简单的技术。

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

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

HashMaps
--------
MapID (pk int)
Key   (pk varchar)
Value

在数据库中获得哈希映射的内容之后,查询数据库以查看数据是否已存在或产生任何其他类型的聚合数据是微不足道的:

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

答案 1 :(得分:2)

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

你如何序列化HashMap?有很多方法可以序列化数据和像HashMap这样的对象。比较两个地图,特别是序列化形式,不是微不足道的,除非您的序列化技术保证两个等效的地图总是以相同的方式序列化。

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

答案 2 :(得分:2)

查看dbms_crypto.hash以生成blob的哈希值。将哈希存储在blob旁边,它将为您提供一些将搜索范围缩小到可管理范围的功能。我不建议存储哈希映射,但这是一种搜索blob之间精确匹配的通用技术。 另请参阅SQL - How do you compare a CLOB

答案 3 :(得分:1)

我不能不同意,但我被告知要这样做。 我很欣赏你的解决方案,这就是我之前的想法。 感谢

答案 4 :(得分:0)

我没有必要比较BLOB,但看起来它是通过dbms_lob包支持的。

http://www.psoug.org/reference/dbms_lob.html

上查看dbms_lob.compare()

答案 5 :(得分:0)

Oracle可以使用Java(或Windows上的.net)定义新的数据类型,您可以为序列化对象定义数据类型,并定义查询的工作方式。

如果你试试这个就好了......

答案 6 :(得分:0)

如果将数据序列化为xml,并将数据存储在xml中,则可以在sql查询中使用xpath。 (对不起,因为我更像是一个SqlServer人,我不知道如何在Oracle中执行此操作的详细信息。)

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