Я думаю, что настоящая проблема заключается в том, что вы смешиваете и сопоставляете разные уровни абстракции.Сохраняя сериализованные объекты Java в реляционную базу данных в виде BLOB, вы должны учитывать несколько недостатков:
- Вы потеряли интероперабельность. Приложения, написанные на других языках, кроме Java, не могут читать данные назад. Даже другие приложения Java должны иметь файлы классов сериализованных классов в своем пути к классам.
- Изменение определений классов хранимых классов закончится в кошмарах обслуживания.
- Вы отказываетесь от преимуществ реляционной базы данных. Сериализация скрывает фактические данные из базы данных. Таким образом, база данных представлена только с черным ящиком. Вы не можете выполнить какой-либо значимый запрос против реальных данных. Все, что у вас есть, это идентификатор и блок байтов.
- Вы должны реализовать обработку данных низкого уровня самостоятельно. Фактически база данных предназначена для эффективной обработки ваших данных, но из-за сериализации вы мешаете ей выполнять свою работу. Итак, вы сами по себе, и сейчас вы сталкиваетесь с этой проблемой.
Так что в большинстве случаев вы получаете от separation of concerns и используя подходящий инструмент для работы.
Вот некоторые предложения:
Отдельного внутренние обработка данных внутри приложения от постоянного хранения. Создайте схему базы данных таким образом, чтобы встроенные функции базы данных могли эффективно обрабатывать данные. В случае реляционной базы данных, такой как MySQL, вы можете выбирать из разных технологий, таких как простые JDBC, объектные реляционные сопоставители, такие как JPA или простые mappers, такие как MyBatis. Разделение здесь означает избегать заражения базы данных конкретными проблемами, связанными с реализацией.
Если у вас есть, например, в вашем приложении Java, экземпляры List of Person и каждое Person состоят из имени и возраста. Затем вы представляете этот список в реляционной базе данных как таблицу, состоящую из поля VARCHAR для имени и числового поля для возраста и, возможно, третьего поля для уникального ключа. Затем база данных может делать то, что она может сделать лучше всего: управление большими объемами данных.
Внутри приложения вы обычно отделяете постоянный уровень от остальной части вашей программы, содержащей код для связи с базой данных.
В некоторых случаях реляционная база данных не может быть подходящим инструментом. Возможно, в одном настольном приложении для пользователя с небольшим набором данных может быть проще просто сериализовать ваш список Person в простой файл и прочитать его при следующем запуске.
Но существуют другие альтернативы для сохранения ваших данных. Возможно, какая-то объектно-ориентированная база данных - это правильный инструмент. В частности, у меня есть опыт работы с Fast Objects. В качестве упрощения это сериализация на стероидах. Нет необходимости использовать такой слой, как JPA или JDBC, между вашим приложением и вашей базой данных. Вы можете хранить экземпляры класса непосредственно в базе данных. Но в отличие от реляционной базы данных со своим полем BLOB, OODB знает ваши классы и фактические данные и может извлечь из этого выгоду.
Другой альтернативой может быть JDBM или Berkeley DB.
Таким образом, разделение проблем и выбор правильной стратегии персистентности (и использование его в правильном направлении) - ключевая задача для успеха вашего проекта. Но делать это правильно сложно даже для опытных разработчиков.
У вас на самом деле есть БД? Или вы используете LinkedLists для хранения данных? – athena
В Java «коллекция» сериализуема, если содержащиеся в ней классы сериализуемы. – Powerlord
@athena, да - я использую mysql. – Bojack