Сериализация объектов как BLOB в Oracle - PullRequest
1 голос
/ 16 декабря 2008

У меня есть HashMap, который я сериализую и десериализирую в базу данных Oracle в поле типа данных BLOB. Я хочу выполнить запрос, используя это поле. Например, приложение создаст новый HashMap и будет иметь несколько пар ключ-значение. Я хочу запросить в БД, чтобы увидеть, существует ли в БД HashMap с этими данными. Я не знаю, как это сделать, кажется странным, если мне нужно перейти к каждой записи в БД, десериализовать ее, а затем сравнить, обрабатывает ли SQL сравнение BLOB, так что я мог бы ... выбрать * из ПРОЦЕССОВ, где foo = ? .... а foo это тип BLOB, а? такое экземпляр нового HashMap? Спасибо

Ответы [ 7 ]

4 голосов
/ 16 декабря 2008

Вот статья, которую вы можете прочитать: Стучать по гвоздю: Старая обувь или стеклянная бутылка

Я не очень много слышал о базовой архитектуре вашего приложения, но могу сразу сказать вам, что никогда нет причины, по которой вам нужно использовать HashMap таким образом. Это плохая техника, простая и понятная.

Ответ на ваш вопрос - не умный запрос Oracle, а редизайн архитектуры вашего приложения.

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

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

Как только у вас есть содержимое ваших хеш-карт в вашей базе данных, тривиально запросить базу данных, чтобы увидеть, существуют ли данные, или произвести какие-либо другие виды агрегированных данных:

SELECT Count(*) FROM HashMaps where MapID = ? AND Key = ?
2 голосов
/ 17 декабря 2008

Загляните в dbms_crypto.hash, чтобы создать хэш своего блоба. Храните хэш рядом с BLOB-объектом, и это даст вам возможность сузить поиск до чего-то управляемого. Я не рекомендую хранить хэш-карту, но это общий метод поиска точного соответствия между BLOB-объектами. См. Также SQL - Как вы сравниваете CLOB

2 голосов
/ 16 декабря 2008

Хранение сериализованных объектов в базе данных почти всегда плохая идея, если вы заранее не знаете, что вам не нужно запрашивать их.

Как вы сериализуете HashMap? Существует множество способов сериализации данных и таких объектов, как HashMap. Сравнение двух карт, особенно в сериализованной форме, не тривиально, если ваша техника сериализации не гарантирует, что две эквивалентные карты всегда сериализуются одинаково.

Один из способов обойти эту неразбериху - это использовать сериализацию XML для некоторых объектов, которые редко нужно запрашивать. Например, там, где я работаю, у нас есть таблица журналов, в которой определенное сообщение журнала хранится в виде файла XML в поле CLOB. Эти данные XML представляют сериализованный объект Java. Обычно мы выполняем запросы к другим столбцам в записи и читаем / записываем большой двоичный объект только за один атомарный шаг. Однако один или два раза необходимо было провести глубокую проверку большого двоичного объекта, и использование XML позволило это сделать (Oracle поддерживает запросы XML в полях varchar2 или CLOB, а также в нативных объектах XML). Это полезный метод, если его использовать экономно.

1 голос
/ 16 декабря 2008

Я не могу не согласиться, но мне говорят, что нужно это сделать. Я ценю ваше решение, и это то, что я имел ранее. спасибо

0 голосов
/ 23 января 2010

Если вы сериализовали свои данные в xml и сохранили данные в xml, вы можете использовать xpaths в вашем sql запросе. (Извините, так как я больше являюсь человеком SqlServer, я не знаю деталей, как это сделать в Oracle.)

  • Если вам КАЖДОЕ нужно обновить только часть сериализованных данных, не делайте этого.
  • Аналогично, если на какие-либо данные указывают другие данные или они указывают на другие данные, не делайте этого.
0 голосов
/ 23 января 2010

Oracle может иметь новые типы данных, определенные с помощью Java (или .net в Windows), вы можете определить тип данных для вашего сериализованного объекта и определить, как с ним работают запросы.

Хорошо, если ты попробуешь это ...

0 голосов
/ 16 декабря 2008

У меня не было необходимости сравнивать BLOB, но похоже, что он поддерживается через пакет dbms_lob.

См. dbms_lob.compare() в http://www.psoug.org/reference/dbms_lob.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...