LOB概述

神通ACCI包含在大对象lob上执行操作的类和方法。lob可以是内部的,也可以是外部的,这取决于它们相对于数据库的位置。

引入内部LOB

内部lob以一种优化空间并支持有效访问的方式存储在数据库表空间中。内部lob使用复制语义并参与服务器的事务模型。您可以在事务或介质故障后恢复内部LOB,并且可以提交或回滚对内部LOB值的任何更改。定义内部lob实例的SQL数据类型有两种:

  • BLOB:一个LOB,它的值由非结构化二进制(原始)数据组成
  • CLOB:一个LOB,它的值由字符数据组成,这些字符数据对应于为神通数据库定义的数据库字符集

LOB的复制语义规定,当您使用同一表中另一行的LOB插入或更新LOB时,LOB定位符和LOB值都会被复制。换句话说,每一行都有一个LOB值的副本。

引入外部LOB

BFILE是存储在数据库表空间外的操作系统文件中的大型二进制(原始)数据对象;因此,它们被称为外部lob。这些文件使用引用语义,当插入或更新同一表时,只有LOB的定位器被复制。除了传统的辅助存储设备,如硬盘,BFILE也可以位于三级块存储设备上,如cd - rom, photocd和dvd。BFILE数据类型允许只读字节流访问数据库服务器文件系统上的大文件。如果底层服务器操作系统支持流模式访问这些文件,神通可以访问BFILEs。

外部lob不参与事务。对完整性和持久性的任何支持都必须由底层文件和操作系统提供。外部LOB必须位于单个设备上;它不能跨磁盘阵列分段。

存储LOB

LOB值的大小决定了它的存储位置。LOB值要么与行数据内联存储,要么存储在行外。
  • 定位器存储:LOB定位器,指向LOB值实际位置的指针,与行数据存储在一起,并指示LOB值存储的位置。

    对于内部LOB, LOB列存储存储在数据库表空间中的LOB值的定位符。特定行的每个内部LOB列和属性都有自己唯一的LOB定位器和存储在数据库表空间中的LOB值的不同副本。

    对于外部LOB, LOB列存储了存放BFILE的外部操作系统文件的定位器。给定行的每个外部LOB列和属性都有自己的BFILE定位器。但是,两个不同的行可以包含指向相同操作系统文件的BFILE定位器。

  • 内联存储:存储在LOB中的数据称为LOB值。内部LOB的值可能与其他行数据内联存储,也可能不存储。如果未设置DISABLE STORAGE IN ROW,并且内部LOB值小于大约4,000字节,则将该值内联存储。否则,它存储在行之外。

    因为lob是大型对象,所以只有在应用程序混合了小型和大型lob时,内联存储才有用。当LOB值扩展到大约4,000字节以上时,它将自动移出行。

在ACCI程序中创建LOB

按照以下步骤在你的应用程序中使用lob定位器:

  • 在数据库中初始化一个新的LOB。

  • 给LOB分配一个值。如果是BFILEs,分配一个引用到一个有效的外部文件。

  • 要访问和操作lob,请参阅5.4读取和写入lob

  • 每当您希望使用写入、复制、删除和类似操作修改内部LOB列或属性时,您必须锁定包含目标LOB的行。使用一个SELECT...FOR UPDATE语句,以选择LOB定位符。

  • 在LOB 写命令成功之前,事务必须打开。因此,您必须在提交事务之前写入数据(因为COMMIT关闭事务)。否则,必须通过重新发出SELECT...FOR UPDATE再次锁定行。ACCI中的每个LOB类实现都有open()和close()方法。要检查LOB是否打开,可以调用类的isOpen()方法。

  • open()、close()和isOpen()方法也应该用来标记一系列LOB操作的开始和结束。每当对LOB进行修改时,就会触发可扩展索引的更新。如果这些修改是在open()…close()代码块中进行的,那么在调用close()之前,各个触发器都将被禁用,然后所有触发器都将同时发出。当lob关闭时,此实现支持有效地处理维护操作,例如更新索引。然而,这也意味着在open()…close()代码块的执行期间,扩展索引是无效的。

    注意,对于内部LOB,打开的概念与LOB相关,而不是与LOB定位器相关。LOB定位器不存储关于它所引用的LOB是否打开的任何信息。多个LOB定位器可能指向同一个已经打开的LOB。但是,对于外部LOB,打开与特定的外部LOB定位器相关联。因此,可以使用不同的外部LOB定位器对同一个BFILE进行多个open()调用。

LOB的打开和关闭的限制

必须关闭已打开的 LOB值的事务的定义如下:

  • 在SET TRANSACTION和COMMIT之间
  • 在DATA MODIFYINGDML和COMMIT之间
  • 在SELECT...FOR UPDATE和COMMIT之间
  • 在自发事务块中

LOB开闭机制有以下限制:

  • 在提交事务之前,应用程序必须关闭所有以前打开的lob。如果不这样做,就会导致错误。如果回滚一个事务,那么所有打开的lob都会随所做的更改一起丢弃,因此不会触发相关的触发器。
  • 虽然对打开的内部lob的数量没有限制,但对打开的文件的数量有限制。请注意,将一个打开的定位器分配给另一个定位器并不算打开一个新的LOB。
  • 在同一事务中使用不同定位器或相同定位器两次打开或关闭相同内部LOB都是错误的。
  • 关闭尚未打开的LOB是错误的。