#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. Спасибо.