1. 概要

インメモリデータベースは、データの保存にディスクスペースではなく、システムメモリに依存しています。 メモリアクセスはディスクアクセスよりも高速であるため、これらのデータベースは当然高速です。

もちろん、インメモリデータベースは、データを永続化する必要がないアプリケーションやシナリオで、またはテストをより高速に実行する目的でのみ使用できます。 多くの場合、組み込みデータベースとして実行されます。つまり、プロセスの開始時に作成され、プロセスの終了時に破棄されます。これは、外部データベースをセットアップする必要がないため、テストに非常に適しています。

次のセクションでは、 Java環境で最も一般的に使用されるインメモリデータベースのいくつかと、それらのそれぞれに必要な構成を見ていきます

2. H2データベース

H2 は、Javaで記述されたオープンソースデータベースであり、組み込みデータベースとスタンドアロンデータベースの両方で標準SQLをサポートします。 これは非常に高速で、約1.5MBのJARに含まれています。

2.1. Mavenの依存関係

アプリケーションでH2データベースを使用するには、次の依存関係を追加する必要があります。

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.194</version>
</dependency>

H2データベースの最新バージョンはMavenCentralからダウンロードできます。

2.2. 構成

H2 インメモリデータベースに接続するには、プロトコル mem、の後にデータベース名が続く接続Stringを使用できます。 driverClassName、URL、username 、および password プロパティは、 .properties ファイルに配置して、アプリケーションで読み取ることができます。

driverClassName=org.h2.Driver
url=jdbc:h2:mem:myDb;DB_CLOSE_DELAY=-1
username=sa
password=sa

これらのプロパティにより、アプリケーションの起動時にmyDbデータベースが自動的に作成されます。

デフォルトでは、データベースへの接続が閉じられると、データベースも閉じられます。 JVMが実行されている限りデータベースを存続させたい場合は、プロパティ DB_CLOSE_DELAY =-1を指定できます。

Hibernateでデータベースを使用している場合は、Hibernate方言も指定する必要があります。

hibernate.dialect=org.hibernate.dialect.H2Dialect

H2 データベースは定期的に保守されており、h2database.comでより詳細なドキュメントを提供しています。

3. HSQLDB HyperSQL データベース)

HSQLDB はオープンソースプロジェクトであり、これもJavaで記述されており、リレーショナルデータベースを表しています。 SQLおよびJDBC標準に準拠し、ストアドプロシージャやトリガーなどのSQL機能をサポートします。

インメモリモードで使用することも、ディスクストレージを使用するように構成することもできます。

3.1. Mavenの依存関係

HSQLDB を使用してアプリケーションを開発するには、Mavenの依存関係が必要です。

<dependency>
    <groupId>org.hsqldb</groupId>
    <artifactId>hsqldb</artifactId>
    <version>2.3.4</version>
</dependency>

HSQLDBの最新バージョンはMavenCentralにあります。

3.2. 構成

必要な接続プロパティの形式は次のとおりです。

driverClassName=org.hsqldb.jdbc.JDBCDriver
url=jdbc:hsqldb:mem:myDb
username=sa
password=sa

これにより、データベースは起動時に自動的に作成され、アプリケーションの実行中はメモリに常駐し、プロセスの終了時に削除されます。

HSQLDBHibernateダイアレクトプロパティは次のとおりです。

hibernate.dialect=org.hibernate.dialect.HSQLDialect

JARファイルには、GUIを備えたデータベース・マネージャーも含まれています。 詳細については、hsqldb.orgのWebサイトを参照してください。

4. ApacheDerbyデータベース

Apache Derby は、 Apache SoftwareFoundationによって作成されたリレーショナルデータベース管理システムを含む別のオープンソースプロジェクトです。

Derby はSQLおよびJDBC標準に基づいており、主に組み込みデータベースとして使用されますが、 Derby NetworkServerフレームワークを使用してクライアントサーバーモードで実行することもできます。

4.1. Mavenの依存関係

アプリケーションでDerbyデータベースを使用するには、次のMaven依存関係を追加する必要があります。

<dependency>
    <groupId>org.apache.derby</groupId>
    <artifactId>derby</artifactId>
    <version>10.13.1.1</version>
</dependency>

Derbyデータベースの最新バージョンはMavenCentralにあります。

4.2. 構成

接続文字列はmemoryプロトコルを使用します。

driverClassName=org.apache.derby.jdbc.EmbeddedDriver
url=jdbc:derby:memory:myDb;create=true
username=sa
password=sa

起動時にデータベースを自動的に作成するには、接続文字列に create =trueを指定する必要があります。 データベースは閉じられ、JVMの終了時にデフォルトで削除されます。

Hibernate でデータベースを使用する場合は、方言を定義する必要があります。

hibernate.dialect=org.hibernate.dialect.DerbyDialect

Derby データベースの詳細については、db.apache.org/derbyを参照してください。

5. SQLiteデータベース

SQLite は、メモリ内またはファイルとして保存された埋め込みモードでのみ実行されるSQLデータベースです。 C言語で書かれていますが、Javaでも使用できます。

5.1. Mavenの依存関係

SQLite データベースを使用するには、JDBCドライバーJARを追加する必要があります。

<dependency>
    <groupId>org.xerial</groupId>
    <artifactId>sqlite-jdbc</artifactId>
    <version>3.16.1</version>
</dependency>

sqlite-jdbc 依存関係は、MavenCentralからダウンロードできます。

5.2. 構成

接続プロパティは、接続文字列にorg.sqlite.JDBCドライバークラスとmemoryプロトコルを使用します。

driverClassName=org.sqlite.JDBC
url=jdbc:sqlite:memory:myDb
username=sa
password=sa

これにより、 myDb データベースが存在しない場合は、自動的に作成されます。

現在、 Hibernate は、 SQLite の方言を提供していませんが、将来的には提供される可能性が非常に高くなります。 SQLiteHibernateと一緒に使用する場合は、HibernateDialectクラスを作成する必要があります。

SQLite の詳細については、sqlite.orgにアクセスしてください。

6. SpringBootのインメモリデータベース

Spring Bootを使用すると、 H2 HSQLDB、、および Derby の構成を自動的に作成できるため、インメモリデータベースを特に簡単に使用できます。

Spring Bootで3つのタイプのいずれかのデータベースを使用するために必要なのは、その依存関係をpom.xmlに追加することだけです。 フレームワークがクラスパスへの依存関係に遭遇すると、データベースを自動的に構成します。

7. 結論

この記事では、Javaエコシステムで最も一般的に使用されるインメモリデータベースと、それらの基本的な構成について簡単に説明しました。 これらはテストには役立ちますが、多くの場合、元のスタンドアロンのものとまったく同じ機能を提供しないことに注意してください。

この記事で使用されているコード例はGithubにあります。