DB2 9 使用启示(733 查验)认证指南,第 2 局部: DB2 数据独霸(8)

进修基本看法
developerWorks








运用大型对象

什么是大型对象?

一些大型数据对象,比如图像和音频,频频需求存储在数据库中。DB2 为存储大型数据对象提供了公用的数据类型。这些数据类型便是所谓的大型对象(LOB)。在本节中,我们未来探讨一下 LOB。作为一名启示人员,您应该可以存储和检索使用法式中的 LOB。

DB2 提供了三种分比如类型的 LOB 数据类型。一切这些数据类型都可以包容最大为 2 GB 的数据:

  • CLOB —— 包罗最大 2 GB 的字符数据
  • BLOB —— 包罗最大 2 GB 的二进制数据。抱负上,这种二进制数据可所以任何工具(比如图像或音频文件)。
  • Double-Byte Character Large Object (DBCLOB) —— 包罗最大 2 GB 的双字节字符数据。过细,只需当创立的数据库为双字节数据停止了设置时,才干运用这种数据类型。
  • XML —— 包罗最大 2 GB 的 XML 数据。本教程不讨论 XML,但本系列前面的教程会触及到这一主题。

LOB 值不存储在数据库表中。在数据库表中存储的抱负上是一个描述符。该描述符指向 LOB 的抱负职位。抱负的 LOB 值存储在表空间中。表空间是物理存储单位。一个 LOB 列中存储的并不是抱负的 LOB 数据,而是指向 LOB 数据的一个指针。这种指针被称为“定位符(locator)”。这些所谓的定位符用于暗示 LOB 值。当检索一个 ResultSet 中的数据时,抱负上是在检索定位符,而不是这些定位符所暗示的抱负的 LOB 值。必需显式地哀告所检索的 LOB 值。这种检索被称为“弃世(materialization)”。

当创立一个表时,可以指定 COMPACT 或 NOT COMPACT 选项。假如指定 COMPACT 选项,那么所存储的 LOB 数据占用最少的空间。但是,假如对 LOB 列实施一次更新将增加所存储的 LOB 的大小,那么在恪守上要支付价格。另一方面,假如指定 NOT COMPACT(默许),那么 LOB 值抱负上另有增加的余地。

假如指定选项 LOGGED,那么对 LOB 列的更新会纪录在系统日记中。指定 LOGGED 选项可以为此中的数据提供最大限定的保护,当出现介质阻拦时,就可用议决一个向前规复进程重构数据。但是,这也会招致磁盘空间方面的资源(更不消说因将日记写到磁盘而破钞的工夫资源了)。假如不指定,则默许运用 LOGGED 选项。面前当今来看一些 Java 中的例子。

PREPAREDSTATEMENT PREPAREDSTATEMENT =  
      CONNECTION.PREPARESTATEMENT("INSERT INTO BOOKCOVERS VALUES(?,?)"); 
FILE IMAGEFILE = NEW FILE("C:\\REDBOOKCOVER.JPG"); 
INPUTSTREAM INPUTSTREAM = NEW FILEINPUTSTREAM(IMAGEFILE); 
PREPAREDSTATEMENT.SETSTRING(1," 0738425826"); 
PREPAREDSTATEMENT.SETBINARYSTREAM(2,INPUTSTREAM,(INT)(IMAGEFILE.LENGTH())); 
PREPAREDSTATEMENT.EXECUTEUPDATE(); 


上述代码片段将 C: 盘根目次中一个名为 redbookcover.jpg 的文件存储到数据库中。过细若何将文件与一个 InputStream 相干联。这个 InputStream 对象用于填充预置语句中 BLOB 列的值。

PREPAREDSTATEMENT PREPAREDSTATEMENT = 
CONNECTION.PREPARESTATEMENT(
   "SELECT BOOKCOVER FROM BOOKCOVERS WHERE BOOKISBN=?"); 
PREPAREDSTATEMENT.SETSTRING(1, "0738425826"); 
RESULTSET RESULTSET = PREPAREDSTATEMENT.EXECUTEQUERY(); 
WHILE (RESULTSET.NEXT()) { 
	// MATERIALIZATION OF THE BLOB 
	BLOB BLOB = RESULTSET.GETBLOB(1); 
	INPUTSTREAM INPUTSTREAM = BLOB.GETBINARYSTREAM(); 
	FILE FILEOUTPUT = NEW 
	  FILE("C:\\CLONEDREDBOOKCOVER.JPG"); 
	FILEOUTPUTSTREAM FO = NEW
	  FILEOUTPUTSTREAM(FILEOUTPUT); 
	INT C; 
	WHILE ((C = INPUTSTREAM.READ()) != -1) 
	FO.WRITE(C); 
	FO.CLOSE(); 
	SYSTEM.OUT.PRINTLN("BLOB RETRIEVED"); 


在上述 Java 代码片段中,首先实施一个预置语句,该语句选择在前一个代码片段中所拔出的 BLOB。需求过细的是,在实施到上面这一行语句之前,抱负的 BLOB 还没有被弃世:

INPUTSTREAM INPUTSTREAM = BLOB.GETBINARYSTREAM();


输入流用于将检索到的 BLOB 存储到一个名为 clonedredbookcover.jpg 的文件中。检索 CLOB 的语法与检索 BLOB 的语法异常雷同。

FILE FILEOUTPUT = ;NEW; 
  FILE("C:\\CLONEDREDBOOKABSTRACT.TXT"); 
FILEOUTPUTSTREAM FO = ;NEW; FILEOUTPUTSTREAM(FILEOUTPUT); 
INPUTSTREAM IS = CLOB.GETASCIISTREAM(); 
INT C; 
WHILE; ((C = IS.READ()) != -1) 
   FO.WRITE(C); 
FO.CLOSE();


在上述 Java 片段中,存储的 CLOB 被弃世到一个名为 clonedredbookabstract.txt 的新文件中。这是议决运用 CLOB 的 getAsciiStream 方式来完成的。就像检索 BLOB 那样,将流指定给一个 InputStream,然后从后者读取数据,顺次将读取的数据写到 FileOutputStream 中。





版权声明: 原创作品,应允转载,转载时请务必以超链接体例标明文章 原始因由 、作者信息和本声明。否则将清查法例责任。

posted @ 2011-03-06 23:51  蓝色的天空III  阅读(182)  评论(0)    收藏  举报