1. 概述
内存数据库依赖于系统内存而不是磁盘空间来存储数据。因为内存访问比磁盘访问快,所以这些数据库自然更快。
当然,我们只能在不需要持久化数据或为了更快地执行测试的应用和场景中使用内存数据库。它们通常作为嵌入式数据库运行,这意味着它们在进程开始时创建并在进程结束时被丢弃,这对于测试来说非常舒适,因为您不需要设置外部数据库。
在下面的部分中,我们将了解一些最常用的 Java 环境内存数据库以及每个数据库所需的配置。
2. H2 数据库
H2是一个用 Java 编写的开源数据库,支持嵌入式和独立数据库的标准 SQL。它非常快,并且包含在一个只有 1.5 MB 左右的 JAR 中。
2.1. Maven 依赖
要在应用程序中使用H2数据库,我们需要添加以下依赖项:
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.194</version>
</dependency>
可以从 Maven Central 下载最新版本的H2数据库。
2.2. 配置
要连接到H2内存数据库,我们可以使用带有协议mem的连接字符串,后跟数据库名称。该driverClassName,网址,用户名和密码属性可以被放置在一个的.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>
您可以在 Maven Central 上找到最新版本的HSQLDB 。
3.2. 配置
我们需要的连接属性具有以下格式:
driverClassName=org.hsqldb.jdbc.JDBCDriver
url=jdbc:hsqldb:mem:myDb
username=sa
password=sa
这确保数据库将在启动时自动创建,在应用程序期间驻留在内存中,并在进程结束时被删除。
HSQLDB的Hibernate方言属性是:
hibernate.dialect=org.hibernate.dialect.HSQLDialect
JAR 文件还包含一个带有 GUI 的数据库管理器。更多信息可以在hsqldb.org网站上找到。
4. Apache Derby 数据库
Apache Derby是另一个包含由Apache Software Foundation创建的关系数据库管理系统的开源项目。
Derby基于 SQL 和 JDBC 标准,主要用作嵌入式数据库,但也可以使用Derby Network Server框架以客户端-服务器模式运行。
4.1. Maven 依赖
要在应用程序中使用Derby数据库,我们需要添加以下 Maven 依赖项:
<dependency>
<groupId>org.apache.derby</groupId>
<artifactId>derby</artifactId>
<version>10.13.1.1</version>
</dependency>
可以在 Maven Central 上找到最新版本的Derby数据库。
4.2. 配置
连接字符串使用内存协议:
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
您可以在db.apache.org/derby 上阅读有关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>
该源码-JDBC的依赖可以从Maven的中央下载。
5.2. 配置
连接属性使用org.sqlite.JDBC驱动程序类和连接字符串的内存协议:
driverClassName=org.sqlite.JDBC
url=jdbc:sqlite:memory:myDb
username=sa
password=sa
如果它不存在,这将自动创建myDb数据库。
目前,Hibernate没有为SQLite提供方言,尽管将来很可能会提供。如果你想使用的SQLite与Hibernate的,你必须创建HibernateDialect类。
要了解有关SQLite 的更多信息,请访问sqlite.org。
6. Spring Boot 中的内存数据库
Spring Boot 使得使用内存数据库变得特别容易——因为它可以自动为H2、HSQLDB和Derby创建配置。
要在 Spring Boot 中使用三种类型之一的数据库,我们需要做的就是将其依赖项添加到pom.xml。当框架遇到对类路径的依赖时,它会自动配置数据库。
7. 结论
在本文中,我们快速浏览了 Java 生态系统中最常用的内存数据库,以及它们的基本配置。尽管它们对测试很有用,但请记住,在许多情况下,它们提供的功能与原始独立的功能不完全相同。
您可以在 Github 上找到本文中使用的代码示例。