进修基本看法
运用大型对象
什么是大型对象?
一些大型数据对象,比如图像和音频,频频需求存储在数据库中。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 中。
版权声明:
原创作品,应允转载,转载时请务必以超链接体例标明文章 原始因由 、作者信息和本声明。否则将清查法例责任。