Встраиваемые базы данных в Java

16631160-abstract-word-cloud-for-embedded-database-with-related-tags-and-termsКогда говорят о базах данных, чаще всего имеют ввиду либо enterprise монстров, вроде Oracle или DB2, либо распространённые опенсорсные базы, вроде MySQL или PostgreSQL. Все эти базы имеют свою нишу и своё предназначение. И все они имеют объединящий их недостаток: они большие и их неудобно распространять.

В самом деле, в приложениих регулярно хочется иметь какую-нибудь базу данных, к которой и требований вообщем-то никаких не выдвигается, ни по производительности, но по устойчивости. Распространённые решения, подобные перечисленным выше, неудобны тем, что требуют дополнительной установки и настройки. Хорошо бы иметь базу, которая распространяется прямо внутри приложения. В мире C/C++ существуют SQLite и MySQL embedded, а в мире — базы данных, написанные на pure .

Pure java databases не так хорошо масштабируются, не очень быстро работают и не так уж много функционала имеют. С другой стороны, они маленькие (в среднем добавляют 1-2 мегабайта к вашему приложению), встраиваются прямо в приложение и имеют возможность работать с данными прямо в памяти. Типичных областей применения у таких баз данных несколько: замена основной базе в интеграционных тестах, собственная база данных приложения для внутренних данны, механизм обработки данных в приложении и т.д.

Наиболее распространены три java базы данных и каждую из них мы опробуем.

H2 я уже показывал в Hello, JDBC. Это наиболее молодая из рассматриваемых баз данных, разработка которой началась в 2004. Ключевые возможности:

  • Поддерживается и встроенный режим работы и отдельно стоящий сервер. Во встроенном режиме поддерживаются внешние соединения.
  • Поддержка баз в памяти и на диске, шифрование данных.
  • MVCC и двухфазные транзакции.
  • Встроенная консоль для доступа к базе.

Использовать H2 в приложении крайне просто: её достаточно добавить в classpath и можно сразу подключаться к ней.

В embedded режиме url «jdbc:h2:/file» создаёт (или открывает) базу данных «/file» на диске. Jdbc url «jdbc:h2:mem:database» создаёт в памяти базу с именем «database». Если параметр имени опустить, то будет создана анонимная база, к которой можно создать лишь одно соединение. Для соединения с удалённой базой, работающей в серверном режиме, в jdbc url следует указывать имя сервера: «jdbc:h2:tcp://server/file»

HyperSQL

HyperSQL, она же , была основана в 2001 году, тем же автором, который позднее ушёл писать H2. Ключевые возможности:

  • Поддерживается и встроенный режим работы и отдельно стоящий сервер.
  • Самая быстрая из java баз данных, за счёт уменьшения надёжности
  • Три разных варианта реализации транзакций.
  • Поддержка java в sql функциях и тригерах.
  • Поддержка csv файлов как источников данных.

Так же как и H2, для использования достаточно добавить в classpath и можно сразу подключаться:

Так как автор тот же, то и jdbc url’ы похожи, но более последовательны: «jdbc:hsqldb:proto:location». Протокол in-memory режима «mem», но поддержки анонимных баз нет, только именованные. «res» протокол существует для открытия баз данных непосредственно из jar файлов приложения. «file» для работы с базами данных в файловой системе. Оба протокола, и «res» и «file», требуют указания пути к файлу базы. Протоколы «hsql»,»hsqls»,»http»,»https» позволяют открыть базу, расположенную на отдельно стоящем сервере. Во всех случаях требуется указать адрес сервера и имя базы: «jdbc:hsqldb:hsql://server/database».

Самая старая из ныне живых java баз данных, появившаяся в 1996 году под именем Cloudscape, потом приобретённая IBM и получившая соответствующую приставку к имени. Позднее она была передана в Apahe foundation и стала называться Apache Derby. Соответственно, родовые травмы у Apache Derby самые застарелые. Это сравнительно медленная база, которая не поддерживает MVCC. С другой стороны, есть и уникальные возможности:

  • Полная совместимость с IBM DB2 SQL
  • Поддержка полноценного встроенного сервера, который способен принимать соединения из внешних процессов, будучи запущенным внутри приложения
  • Поддержка in-memory баз данных

Использование Apache Derby, по крайней мере, не сложнее других java баз данных:

Из-за участия в процессе разработки IBM (да и Apache, что уж там) форма jdbc url несколько вычурная: «jdbc:derby:протокол:база:переменная=значение». Протокол бывает «memory», для обращения к базе данных в памяти. «directory» для обращения к данным в файловой системе. «classpath» и «jar» для доступа к базам в classpath или в jar файле приложения. База в этом случае будет доступна только для чтения. Во всех случаях передаётся путь к файлу базы.

Код примера доступен на github.