Обзор возможностей Oracle Multimedia

Источник: oracle
Александр Рындин, Oracle СНГ

Архитектура

Oracle Multimedia (в прошлом Oracle interMedia)  - это возможность Oracle Database 11g для управления мультимедийным контентом (изображения, звук, видео).  Использование этой функции позволяет управлять мультимедийными данными интегрированно с реляционной информацией. Oracle Multimedia умеет работать с большинством популярных мультимедийных форматов. Хранить такие мультимедийные данные можно разными способами (внутри и вовне базы). Также предоставляется целый спектр интерфейсов для использования этих сервисов (объектный, реляционный). Для разработки приложений Oracle поставляет набор Java интерфейсов и компонентов.

На слайде ниже показана общая архитектура Oracle Multimedia

Типы данных

Поддержка мультимедийных данных реализована через использование объектно-реляционных типов данных:

  • ORDAudio - имеет специфичные для звукового файла свойства
  • ORDImage - имеет специфичные для графического файла свойства
  • ORDVideo - имеет специфичные для видео файла свойства
  • ORDDoc -  имеет общие для всех мультимедиа файлов свойства

Как и любые объектные типы экземляры ORDAudio, ORDDoc, ORDImage и ORDVideo состоят из атрибутов (включает метаданные и медиаданные) и методов. Медиаданные - это реальное видео, аудио или графическое изображение. Метаданные - это информация о данных: длина объекта, метод компрессии, формат. Методы - это процедуры, которые могут быть выполнены для объекта, такие как getContent() и setProperties().

Все четыре типа данных хранят информацию в объектно реляционном типе данных ORDSource.

Медиаданные могут храниться как в виде BLOB (большой плюс - транзакционный контроль), а могут вовне базы данных. В последнем случае в базе данных будет храниться указатель на медиаданные. Указатель может быть в одном из следующих видов:

  • BFILE
  • HTTP URL
  • Пользовательский источник для media data server (RealNetworks Streaming Servers или Microsoft Windows Media Services), а также других серверов
Примеры приложений

Некоторые примеры приложений, которые могут использовать Oracle Multimedia:

  • Электронный архив с медицинскими записями (включая DICOM изображения)
  • Удаленное обучение
  • Агенство недвижимости
  • Архив фотографий (художественная галерея или профессональные фотографы)
  • Электронный архив документов
  • Публикация в web

Отдельного упоминания заслуживает возможность хранения DICOM данных. Это стандартный формат для хранения медицинских изображений. Этот формат включает в себя также набор метаданных (ФИО пациента, дату снимка и т.д.). Более подробно я опишу этот формат в отдельной статье.

Загрузка данных

Мультимедийные данные перед использованием в базе данных должны быть туда загружены. Для этого можно использовать следующие инструменты:

  • SQL*Loader - встроенная утилита Oracle, позволяющая загружать данные в базу. В нашем случае - LOB данные и внешние мультимедийные файлы в таблицу

Пример загрузки с помощью SQL*Loader

The lob_test_data.txt file contains regular data and references to the files holding the CLOB and BLOB data.                    
1,one,01-JAN-2006,clob_test1.txt,blob_test1.doc
2,two,02-JAN-2006,clob_test2.txt,blob_test2.doc

Now we have all the data, we need a table to load the data into.

DROP TABLE lob_tab;

CREATE TABLE lob_tab (
  number_content    NUMBER(10),
  varchar2_content  VARCHAR2(100),
  date_content      DATE,
  clob_content      CLOB,
  blob_content      BLOB
);

Next, we define the SQL*Loader controlfile, called lob_test.ctl, that will allow us to load the data.

LOAD DATA
INFILE 'lob_test_data.txt'
   INTO TABLE lob_tab
   FIELDS TERMINATED BY ','
   (number_content    CHAR(10),
    varchar2_content  CHAR(100),
    date_content      DATE "DD-MON-YYYY" ":date_content",
    clob_filename     FILLER CHAR(100),
    clob_content      LOBFILE(clob_filename) TERMINATED BY EOF,
    blob_filename     FILLER CHAR(100),
    blob_content      LOBFILE(blob_filename) TERMINATED BY EOF)

Notice that the filename columns in the datafile are marked as FILLERs, so they are not loaded into the table, but they are used in the LOBFILE definition to identify the loacation of the LOB information.

The data is then loaded using the following SQL*Loader command, run from the command line in the same directory as files.

sqlldr userid=test/test@db10g control=lob_test.ctl log=lob_test.log bad=lob_test.bad

  • PL/SQL 
      Доступ к данным, хранящимся в Oracle Multimedia

      Приложения могут получать доступ к данным в Oracle Multimedia с помощью SQL, PL/SQL, OCI или Java:

      • Oracle Multimedia Java API
        Позволяет Java приложениям в любом звене (база данных, сервер приложений, клиент) получать и модифицировать мультимедийные данные. Oracle Multimedia Java API позволяет включать в JDBC result set как традиционные реляционные, так и Oracle Multimedia данныею
      • Streaming Content from Oracle Database
        Можно также использовать специальный plug-in от Oracle для распространения данных через RealNetworks и Microsoft Windows Media сервера.
        Plug-in можно скачать по адресу: http://www.oracle.com/technology/software/products/intermedia/index.html

      Java-приложение для Oracle Multimedia

      1. Прежде чем начинать разработку приложения давайте проинсталлируем базу данных с примерами. По этой ссылку нужно выполнить пункты 1 и 2. 
      2. Кроме того, необходимо проинсталлировать JDK от Sun. Скачать ее можно вот здесь.
      3. Также давайте проинсталлируем Standalone OC4J. Можно взять тот, который идет в поставке JDeveloper, но я сейчас буду говорить об обычном OC4J, который можно скачать здесь.
      4. Распаковать OC4J на сервере. 
      5. После инсталляции нужно будет прописать переменную JAVA_HOME, указывающую на папку, куда был проинсталлирован JDK. В моем случае это папка /u01/app/oracle/product/11.1.0/db_1/jdk1.6.0_11, т.е. команда
        export JAVA_HOME=/u01/app/oracle/product/11.1.0/db_1/jdk1.6.0_11

        Также нужно подредактировать файл $OC4J_HOME/bin/oc4j. В этом файле нужно прописать переменную ORACLE_HOME, чтобы она указывала на папку $OC4J_HOME. Я сделал вот так (у меня глобальная переменная ORACLE_HOME указывает на /u01/app/oc4j):
        #########################################################
        ########## START CONFIGURATION SECTION ##################
        #########################################################
        ORACLE_HOME=/u01/app/oc4j
        J2EE_HOME=$ORACLE_HOME/j2ee/home
      6. Создадим таблицы для нашего приложения:
        Создадим пользователя scott:
        create user scott identified by tiger;
        grant connect,resource to scott;
        

      Наше приложение будет демонстрировать применение сервлетов для загрузки и выгрузки мультимедийных данных в и из базы данных. Пользователи получают доступ к фотоальбому для просмотра содержимого фотоальбома, включая предпосмотровые (thumbnail) версии полноразмерных изображений. Доступна также возможность загрузки фотографий в альбом. Наше приложение будет использовать таблицу photos и последовательность (sequence) photos_sequence. Создадим их

      CREATE TABLE photos( id          NUMBER PRIMARY KEY,
                          description VARCHAR2(40) NOT NULL,
                          location    VARCHAR2(40),
      
                          image       ORDSYS.ORDIMAGE,
                          thumb       ORDSYS.ORDIMAGE ) tablespace USERS
      --
      -- store full-size images and thumbnail images as SecureFile LOBs
      --
      LOB(image.source.localdata)  STORE AS SECUREFILE
      LOB(thumb.source.localdata)  STORE AS SECUREFILE;
      
      CREATE SEQUENCE photos_sequence;
      
      

      Типы данных для столбцов image и thumb определены как Oracle Multimedia image объекты. Они буду содержать соответственно полноразмерную и уменьшенную версии изображения.

      1. В поставке Examples у нас уже есть написанное приложение для Oracle Multimedia и оно находится в папке $ORACLE_HOME/ord/http/demo/servlet. В этой папке есть файл README.TXT. В нем описано как проинсталлировать это приложение.
        • Отредактируйте файл $ORACLE_HOME/ord/http/demo/servlet/PhotoAlbumServlet.java, введя корректную информацию для подключения к базе:
              private final static String JDBC_CONNECT_STRING =
               "jdbc:oracle:thin:@localhost:1521:orcl";  // JDBC Thin driver
          
              private final static String JDBC_USER_NAME = "scott";
              private final static String JDBC_PASSWORD  = "tiger";
          
        • Скомпилируйте файл PhotoAlbumServlet.java и полученный PhotoAlbumServlet.class 
          /u01/app/oracle/product/11.1.0/db_1/jdk1.6.0_11/bin/javac
          -cp $ORACLE_HOME/ord/jlib/ordhttp.jar:$ORACLE_HOME/ord/jlib/ordim.jar:
          $ORACLE_HOME/jdbc/lib/ojdbc6.jar:$ORACLE_HOME/sqlj/lib/runtime12.jar:
          $ORACLE_HOME/oc4j/j2ee/home/lib/servlet.jar PhotoAlbumServlet.java
        • Cкопируйте полученный файл в папку $OC4J_HOME/j2ee/home/default-web-app/WEB-INF/classes 
        • Cкопируйте также уже заранее скомпилированный класс файл PhotoAlbumRequest.class в папку $OC4J_HOME/j2ee/home/default-web-app/WEB-INF/classes 
        • Скопируйте из папки $ORACLE_HOME/ord/jlib в $OC4J_HOME/j2ee/home/lib/ 2 файла: ordim.jar и ordhttp.jar. 
        • В файл $OC4J_HOME/j2ee/home/config/application.xml добавьте строки для ссылки на библиотеки
                 <library path="../../home/lib/ordim.jar" />
                 <library path="../../home/lib/ordhttp.jar" />
        • В файле $OC4J_HOME/j2ee/home/default-web-app/WEB-INF/web.xml необходимо прописать mapping для сервлета:
           <servlet>
            <servlet-name>PhotoAlbumServlet</servlet-name>
            <servlet-class>PhotoAlbumServlet</servlet-class>
           </servlet>
           <servlet-mapping>
            <servlet-name>PhotoAlbumServlet</servlet-name>
          
            <url-pattern>/PhotoAlbumServlet</url-pattern>
           </servlet-mapping>
          
        • Пользователем root разрешите запуск oc4j:
          chmod a+x $OC4J_HOME/bin/oc4j 
        • Запустите OC4J 
          $OC4J_HOME/bin/oc4j -start
          
        • Зайдите через Internet Explorer в альбом 
          http://server:8888/PhotoAlbumServlet

        Страница сайта http://www.interface.ru
        Оригинал находится по адресу http://www.interface.ru/home.asp?artId=20889