H2 嵌入式模式

b844d0d3ce1ddb1cb0cac62c9c5b4dcc_1708240218250-4d20e466-bdb0-4324-b46f-a436eacabc94_x-oss-process=image%2Fformat%2Cwebp.png

在嵌入式模式下,应用程序使用 JDBC 在同一 JVM 中打开数据库。这是最快、最简单的连接模式。缺点是数据库在任何时候都只能在一个虚拟机(和类加载器)中打开。与所有模式一样,持久数据库和内存数据库均受支持。同时打开的数据库数量或打开的连接数量没有限制。

在嵌入式模式下,I/O 操作可由执行 SQL 命令的应用程序线程执行。应用程序不得中断这些线程,否则会导致数据库损坏,因为 JVM 会在线程中断时关闭 I/O 句柄。请考虑以其他方式控制应用程序的执行。当可能出现中断时,可以使用 async: 文件系统作为一种变通方法,但不能保证完全安全。建议改用客户端-服务器模式,因为客户端可能会中断自己的线程。

特点

  • 轻便性:H2 数据库可以直接嵌入到 Java 应用程序中,不需要单独的数据库服务器进程。这使得应用程序的部署更加简单,只需要包含 H2 数据库的相关库文件即可。

  • 本地持久化:数据可以持久化到本地磁盘文件。可以指定数据库文件的存储位置,如jdbc:h2:~/test(这里~/test表示将数据库文件存储在用户主目录下的test文件中)。

  • 应用程序控制:应用程序可以完全控制数据库的启动、停止和管理操作,因为数据库是作为应用程序的一部分运行的。

适用场景

  • 小型应用程序:对于一些小型的桌面应用程序或者移动应用程序的后端存储,嵌入式模式的 H2 数据库是一个很好的选择。它不需要复杂的数据库服务器安装和配置,同时能够满足小型应用的数据存储和管理需求。

  • 独立运行的 Java 应用:当 Java 应用需要独立管理自己的数据库,并且不需要与其他应用共享数据库资源时,嵌入式模式可以提供便捷的解决方案。

简单示例

添加 Maven 依赖

在项目的pom.xml文件中添加以下依赖:

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

Java 示例代码

在 Java 代码中,可以使用 DriverManager 来创建与 H2 嵌入式数据库的连接。然后,使用 Statement、ResultSet 来操作数据。例如:

package com.hxstrive.h2.embedded_database;

import java.sql.*;

/**
 * H2嵌入式数据库的示例代码
 * @author hxstrive.com
 * @since 1.0.0  2024/9/20 11:38
 */
public class H2EmbeddedDatabaseExample {

    public static void main(String[] args) {
        try {
            // 创建连接,这里假设数据库文件存储在当前目录下名为test.db
            Connection connection = DriverManager.getConnection("jdbc:h2:./test.db");

            Statement statement = connection.createStatement();
            // 创建一个名为users的表,包含id和name两列
            statement.execute("CREATE TABLE users (id INT PRIMARY KEY, name VARCHAR(255))");

            // 插入一条数据到users表
            statement.execute("INSERT INTO users (id, name) VALUES (1, 'John')");

            // 查询users表中的数据
            ResultSet resultSet = statement.executeQuery("SELECT * FROM users");
            while (resultSet.next()) {
                int id = resultSet.getInt("id");
                String name = resultSet.getString("name");
                System.out.println("id: " + id + ", name: " + name);
            }

            // 关闭资源
            resultSet.close();
            statement.close();
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

}

运行示例,输出如下:

id: 1, name: John

上面示例中,jdbc:h2:./test.db 是连接字符串,表示使用 H2 嵌入式模式,并且数据库文件 test.db 位于当前目录下。

注意:我们可以在连接字符串中指定更多的参数,例如:

jdbc:h2:./test.db;MODE=MySQL;DB_CLOSE_ON_EXIT=FALSE

其中:

  • MODE=MySQL   表示让 H2 数据库模拟 MySQL 的一些行为模式,对于从 MySQL 迁移到 H2 进行测试等场景可能会很有用。

  • DB_CLOSE_ON_EXIT=FALSE   表示在应用程序退出时不关闭数据库连接,这对于需要保持数据库状态或者在应用程序下次启动时继续使用数据库的情况比较有用。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号