H2 除了上述设置外,还有一些其他设置。
在 H2 数据库中,可以通过连接 URL 参数来设置页面大小。
页面大小决定了数据库在磁盘上存储数据的基本单位大小。较大的页面大小可能会减少磁盘 I/O 次数,但也可能会浪费更多的空间(如果数据量较小)。较小的页面大小可能更适合小型数据集,但可能会增加磁盘 I/O 操作。
H2 新数据库的页面大小为 4 KiB(4096 字节),除非在创建数据库时使用“PAGE_SIZE=”参数在数据库 URL 中明确设置页面大小。以下是在连接 URL 中设置页面大小的方法:
jdbc:h2:databaseName;PAGE_SIZE=页面大小值
示例:
jdbc:h2:myDB;PAGE_SIZE=2048
这里将页面大小设置为 2048 字节。
注意:
(1)现有数据库的页面大小不能更改,因此需要在创建数据库时设置该属性。
(2)加密数据库的页面大小必须是 4096 的倍数(4096, 8192, ...)。
除上述设置外,还可在数据库 URL 中传递其他数据库设置。在数据库 URL 末尾添加 ;setting=value 与连接后执行 SET 设置值语句的效果相同。格式:
jdbc:h2:<url>;<setting>=<value>[;<setting>=<value>...]
示例:
jdbc:h2:file:~/sample;TRACE_LEVEL_SYSTEM_OUT=3
如果连接丢失,自动重新连接功能会使 JDBC 驱动程序重新连接数据库。自动重新连接仅在启用自动提交后才会发生;如果禁用了自动提交,则会出现异常。要启用该模式,请在数据库 URL 中添加 ;AUTO_RECONNECT=TRUE。
重新连接将打开一个新会话。自动重新连接后,将重新创建变量和本地临时表定义(不包括数据)。系统表 INFORMATION_SCHEMA.SESSION_STATE 的内容包含重新创建的所有客户端状态。
如果另一个连接以独占模式使用数据库(使用 SET EXCLUSIVE 1 或 SET EXCLUSIVE 2 启用),则此连接将尝试重新连接,直到独占模式结束。
示例:
jdbc:h2:tcp://localhost/~/test;AUTO_RECONNECT=TRUE
上面 JDBC 连接字符串,用于连接到本地主机上的 H2 数据库 “test”,并设置了自动重新连接属性为 TRUE,以在连接中断时尝试自动重新连接数据库。
无论何时打开数据库,都会创建一个锁文件,向其他进程发出数据库正在使用的信号。如果数据库关闭,或者打开数据库的进程终止,则会删除该锁定文件。
H2 数据库实现了以下文件锁定方法:
默认方法是 FILE,使用看门狗线程保护数据库文件。看门狗每秒读取一次锁文件。
第二种方法是 SOCKET,用于打开服务器套接字。套接字方法不需要每秒读取锁文件。只有当数据库文件只被一台(且始终是同一台)计算机访问时,才应使用套接字方法。
第三种方法是 FS。这种方法将使用 FileChannel.lock 进行本地文件锁定。
在这种情况下,应用程序必须保护数据库文件。否则将导致数据库损坏。使用 “NO” 方法会强制数据库不创建锁定文件。请注意,这是不安全的,因为另一个进程可以打开同一个数据库,可能导致数据损坏。
要使用不同的文件锁定方法打开数据库,请使用参数 FILE_LOCK。下面的代码使用 “socket ”锁定方法打开数据库:
jdbc:h2:~/test;FILE_LOCK=SOCKET
点击查看关于“文件锁定协议”相关知识。
默认情况下,如果应用程序使用嵌入式 URL 调用 DriverManager.getConnection(url,...),而 URL 中指定的数据库尚未存在,则会创建一个新的空数据库。在某些情况下,最好限制创建新数据库,只允许打开现有数据库。为此,可在数据库 URL 中添加 ;IFEXISTS=TRUE。在这种情况下,如果数据库不存在,则在尝试连接时会出现异常。只有当数据库已经存在时,连接才会成功。
示例:
jdbc:h2:/data/sample;IFEXISTS=TRUE
默认情况下,数据库会在最后一个连接关闭时关闭。但是,如果从未关闭数据库,则会在虚拟机正常退出时使用关闭钩子关闭持久数据库。在某些情况下,数据库不应在这种情况下关闭,例如,因为数据库在虚拟机关闭时仍在使用(例如,在数据库中存储关闭进程)。在这种情况下,可以在数据库 URL 中禁用自动关闭数据库。第一个连接(打开数据库的连接)需要在数据库 URL 中设置该选项(之后无法更改设置)。
示例:
jdbc:h2:~/test;DB_CLOSE_ON_EXIT=FALSE
警告:禁用退出时关闭数据库后,应用程序必须在完成对数据库的所有操作后,在自己的关机钩子中执行 SHUTDOWN 命令,以避免数据丢失,并且在此之后不应尝试建立与数据库的新连接。