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 压缩包文件。如下图:
(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 - 李二