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

#java #database #serialization

#java #База данных #сериализация

Вопрос:

Итак, отчасти из-за разочарования синтаксисом SQL, я решил попробовать реализовать свою собственную базу данных. Мне не нужно выполнять очень сложные операции — нужно только выполнять поиск строк и добавление новых строк. У меня есть две структуры данных, User и Circle . Затем они помещаются в список Java, и конечный объект базы данных выглядит следующим образом (обратите внимание, что это implements Serializable ):

 public class Database implements Serializable {
    private static final long serialVersionUID = 5790642843089065198L;

    List<User> users; 
    List<Circle> circles;

    public Database() {
        users = new ArrayList<User>();
        circles = new ArrayList<Circle>();
    }

}
 

Всякий раз, когда я обновляю объект, я также использую ObjectOutputStream для «сохранения» объекта в виде файла. Всякий раз, когда я читаю из базы данных, я использую ObjectInputStream «get» объект из файла. У меня также есть DatabaseHelper класс, который extends Thread . Этот класс довольно длинный, но, проще говоря, он инициализирует Database объект как статическую переменную. Мой вопрос не о конкретной проблеме, с которой я столкнулся, на самом деле я подтвердил, что мой код работает так, как я ожидаю, что он будет работать. База данных сохраняется навсегда, когда программа завершает работу или даже завершается сбоем. Я также могу вызвать несколько клиентов, которые все имеют независимое подключение к базе данных, но также могут видеть коммиты друг друга.

Проблема, с которой я сталкиваюсь, связана с дизайном. Всякий раз, когда я открываю поток, читается вся база данных (она обновляется только при выполнении коммита). Как работают корпоративные базы данных, скажем, когда вам нужно выполнить поиск по строке? Вся эта таблица считывается в память из файла?

Это может быть лучшим вопросом для cs.stackexchange.com , но любое руководство приветствуется.

Ответ №1:

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

В Java это означает отображение ваших файлов из кучи и перенос данных в кучу по мере необходимости. Как только вы запишете данные из кучи, они будут асинхронно сохранены ОС.

У меня есть SharedHashMap, который предназначен для сериализации без GC, параллельного доступа между процессами / потоками и отложенного сохранения. Использование файлов с отображением в памяти означает, что вы можете прочитать ключ / значение, коснувшись / прочитав только очень небольшое количество страниц, остальные данные не обязательно должны быть в памяти.

Комментарии:

1. Интересные подходы. Спасибо. Похоже, в будущем я должен придерживаться стандартных библиотек.

2. @ijkilchenko Возможно, эта статья покажется вам интересной infoq.com/articles/Open-JDK-and-HashMap-Off-Heap

Ответ №2:

Реализация базы данных самостоятельно — не очень хорошая идея, поскольку даже элементарные функции группировки / сокращения карты будут стоить вам времени, которое вы, безусловно, лучше потратить на бизнес-логику, которую вы собираетесь разработать.

Java предлагает множество возможностей для легкого доступа к данным; безусловно, самыми продвинутыми являются JPA (Java Persistence API; официальный обобщенный API для доступа практически к любой системе баз данных без необходимости написания необработанных SQL-запросов) и Hibernate.

Возможно, вы захотите использовать один из них, поскольку они реализуют именно то, что вы хотите (сериализация / гидратация объектов), быстры, надежны и используют стандартные СУБД в фоновом режиме.

Комментарии:

1. Похоже, я создал интересную образовательную вещь, но в будущем я должен придерживаться стандартных библиотек. Я проверю JPA. Спасибо.