Когда говорят о базах данных, чаще всего имеют ввиду либо enterprise монстров, вроде Oracle или DB2, либо распространённые опенсорсные SQL базы, вроде MySQL или PostgreSQL. Все эти базы имеют свою нишу и своё предназначение. И все они имеют объединящий их недостаток: они большие и их неудобно распространять.
В самом деле, в приложениих регулярно хочется иметь какую-нибудь базу данных, к которой и требований вообщем-то никаких не выдвигается, ни по производительности, но по устойчивости. Распространённые решения, подобные перечисленным выше, неудобны тем, что требуют дополнительной установки и настройки. Хорошо бы иметь базу, которая распространяется прямо внутри приложения. В мире C/C++ существуют SQLite и MySQL embedded, а в мире Java — базы данных, написанные на pure java.
Pure java databases не так хорошо масштабируются, не очень быстро работают и не так уж много функционала имеют. С другой стороны, они маленькие (в среднем добавляют 1-2 мегабайта к вашему приложению), встраиваются прямо в приложение и имеют возможность работать с данными прямо в памяти. Типичных областей применения у таких баз данных несколько: замена основной базе в интеграционных тестах, собственная база данных приложения для внутренних данны, механизм обработки данных в приложении и т.д.
Наиболее распространены три java базы данных и каждую из них мы опробуем.
H2
H2 я уже показывал в Hello, JDBC. Это наиболее молодая из рассматриваемых баз данных, разработка которой началась в 2004. Ключевые возможности:
- Поддерживается и встроенный режим работы и отдельно стоящий сервер. Во встроенном режиме поддерживаются внешние соединения.
- Поддержка баз в памяти и на диске, шифрование данных.
- MVCC и двухфазные транзакции.
- Встроенная консоль для доступа к базе.
Использовать H2 в приложении крайне просто: её достаточно добавить в classpath и можно сразу подключаться к ней.
1
2
3
4
5
6
7
8
9
10
11
12
|
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<h2.version>1.4.190</h2.version>
</properties>
<dependencies>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>${h2.version}</version>
</dependency>
</dependencies>
|
1
2
3
|
private static Connection getH2Connection() throws SQLException {
return DriverManager.getConnection("jdbc:h2:mem:");
}
|
В embedded режиме jdbc url «jdbc:h2:/file» создаёт (или открывает) базу данных «/file» на диске. Jdbc url «jdbc:h2:mem:database» создаёт в памяти базу с именем «database». Если параметр имени опустить, то будет создана анонимная база, к которой можно создать лишь одно соединение. Для соединения с удалённой базой, работающей в серверном режиме, в jdbc url следует указывать имя сервера: «jdbc:h2:tcp://server/file»
HyperSQL
HyperSQL, она же HSQLDB, была основана в 2001 году, тем же автором, который позднее ушёл писать H2. Ключевые возможности:
- Поддерживается и встроенный режим работы и отдельно стоящий сервер.
- Самая быстрая из java баз данных, за счёт уменьшения надёжности
- Три разных варианта реализации транзакций.
- Поддержка java в sql функциях и тригерах.
- Поддержка csv файлов как источников данных.
Так же как и H2, для использования достаточно добавить в classpath и можно сразу подключаться:
1
2
3
4
5
6
7
8
9
10
11
12
|
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<hsqldb.version>2.3.3</hsqldb.version>
</properties>
<dependencies>
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<version>${hsqldb.version}</version>
</dependency>
</dependencies>
|
1
2
3
|
private static Connection getHsqldbConnection() throws SQLException {
return DriverManager.getConnection("jdbc:hsqldb:mem:test");
}
|
Так как автор тот же, то и jdbc url’ы похожи, но более последовательны: «jdbc:hsqldb:proto:location». Протокол in-memory режима «mem», но поддержки анонимных баз нет, только именованные. «res» протокол существует для открытия баз данных непосредственно из jar файлов приложения. «file» для работы с базами данных в файловой системе. Оба протокола, и «res» и «file», требуют указания пути к файлу базы. Протоколы «hsql»,»hsqls»,»http»,»https» позволяют открыть базу, расположенную на отдельно стоящем сервере. Во всех случаях требуется указать адрес сервера и имя базы: «jdbc:hsqldb:hsql://server/database».
Derby
Самая старая из ныне живых java баз данных, появившаяся в 1996 году под именем Cloudscape, потом приобретённая IBM и получившая соответствующую приставку к имени. Позднее она была передана в Apahe foundation и стала называться Apache Derby. Соответственно, родовые травмы у Apache Derby самые застарелые. Это сравнительно медленная база, которая не поддерживает MVCC. С другой стороны, есть и уникальные возможности:
- Полная совместимость с IBM DB2 SQL
- Поддержка полноценного встроенного сервера, который способен принимать соединения из внешних процессов, будучи запущенным внутри приложения
- Поддержка in-memory баз данных
Использование Apache Derby, по крайней мере, не сложнее других java баз данных:
1
2
3
4
5
6
7
8
9
10
|
<properties>
<derby.version>10.12.1.1</derby.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.derby</groupId>
<artifactId>derby</artifactId>
<version>${derby.version}</version>
</dependency>
|
1
2
3
|
private static Connection getDerbyConnection() throws SQLException {
return DriverManager.getConnection("jdbc:derby:memory:test;create=true");
}
|
Из-за участия в процессе разработки IBM (да и Apache, что уж там) форма jdbc url несколько вычурная: «jdbc:derby:протокол:база:переменная=значение». Протокол бывает «memory», для обращения к базе данных в памяти. «directory» для обращения к данным в файловой системе. «classpath» и «jar» для доступа к базам в classpath или в jar файле приложения. База в этом случае будет доступна только для чтения. Во всех случаях передаётся путь к файлу базы.
Код примера доступен на github.