H2 Zip 或 Jar 文件中的只读数据库

H2 在 Zip 或 Jar 文件中的只读数据库是一种特殊的数据库存储形式。这种数据库通常被打包在 Zip 或 Jar 文件中,具有以下特点:

(1)它处于只读状态。这意味着你可以查询数据库中的数据,但不能进行写入、更新或删除操作。这种只读特性可以保证数据的稳定性和一致性,防止意外的数据修改。

(2)存储在 Zip 或 Jar 文件中使得数据库的部署和分发更加方便。可以将数据库与应用程序一起打包,确保在不同环境中都能快速访问到特定的数据集合,而无需额外的数据库安装和配置步骤。

创建只读数据库

要在 Zip 文件中创建只读数据库,首先要创建常规的持久数据库,然后创建备份。数据库必须没有待处理的更改,这意味着需要先关闭与数据库的所有连接。为加快打开只读数据库和运行查询的速度,应使用 SHUTDOWN DEFRAG 关闭数据库。

如果使用的是名为 test 的数据库,使用备份工具创建压缩文件是一种简单的方法。您可以通过命令行或 H2 控制台(工具 - 备份)启动该工具。请注意,创建备份时必须关闭数据库。因此,不能使用 SQL 语句 BACKUP TO。

创建压缩文件后,可以使用以下数据库 URL 打开压缩文件中的数据库:

jdbc:h2:zip:~/data.zip!/test

压缩文件中的数据库是只读的。由于压缩文件不支持随机访问(只支持流式访问),因此某些查询的性能会比使用普通数据库时慢。这对性能的影响程度取决于查询和数据。数据库不在内存中读取,因此也支持大型数据库。使用与普通数据库相同的索引。

如果数据库大于几兆字节,将数据库文件分割成多个较小的文件会大大提高性能,因为在压缩文件中无法进行随机存取。

示例

创建两个嵌入式数据库,然后将两个数据库文件打包成 zip 压缩包,最后,通过 jdbc:h2:zip: 方式查询数据。

(1)创建 data1 和 data2 示例数据库,如下:

{
    Connection connection = DriverManager.getConnection("jdbc:h2:~/data1");
    Statement statement = connection.createStatement();
    statement.execute("CREATE TABLE IF NOT EXISTS users (id INT PRIMARY KEY, name VARCHAR(255))");
    // 插入数据
    statement.execute("INSERT INTO users VALUES (1, '张三')");
    statement.execute("INSERT INTO users VALUES (2, '李四')");
    statement.execute("INSERT INTO users VALUES (3, '王五')");
    statement.execute("INSERT INTO users VALUES (4, '赵六')");
    statement.execute("INSERT INTO users VALUES (5, '李二')");
    statement.close();
    connection.close();
}

{
    Connection connection = DriverManager.getConnection("jdbc:h2:~/data2");
    Statement statement = connection.createStatement();
    statement.execute("CREATE TABLE IF NOT EXISTS person (id INT PRIMARY KEY, name VARCHAR(255))");
    // 插入数据
    statement.execute("INSERT INTO person VALUES (1, 'Barbara')");
    statement.execute("INSERT INTO person VALUES (2, 'Karen')");
    statement.execute("INSERT INTO person VALUES (3, 'Thomas')");
    statement.execute("INSERT INTO person VALUES (4, 'George')");
    statement.execute("INSERT INTO person VALUES (5, 'William')");
    statement.close();
    connection.close();
}

(2)将上面创建的 data1 和 data2 数据打包到 data.zip 压缩包文件。如下图:

df808170baa6c9c5454b5e01e24d4b96_1727249007455-69fba74b-0a20-4ef4-bc55-d4a076f44be9_x-oss-process=image%2Fformat%2Cwebp.png

(3)使用 jdbc:h2:zip:~/data.zip!/data1 访问 data1 数据库中的 users 表的数据,如下:

Connection connection = DriverManager.getConnection("jdbc:h2:zip:~/data.zip!/data1");
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("SELECT * FROM users");
while(resultSet.next()) {
    System.out.println(resultSet.getInt("id") + " - " + resultSet.getString("name"));
}
resultSet.close();
statement.close();
connection.close();

运行示例,输出如下:

1 - 张三
2 - 李四
3 - 王五
4 - 赵六
5 - 李二


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