H2支持通过在JDBC Url中添加 AUTO_SERVER=TRUE 参数使用Automatic Mixed Mode访问数据库

在这种模式下

  • 第一个打开数据库的程序将通过文件方式访问数据库

    同时作为服务器, 启动一个daemon thread在随机端口号上启用TCP访问

    并将IP地址及端口号写入数据库的 .lock.db 文件中

  • 后续访问此数据库的程序在发现 .lock.db 文件存在时

    将读取lock中的地址, 通过TCP方式连接到数据库

  • 当第一个程序退出后, 仍在运行中的程序将决定出一个新的服务器, 供其他程序连接

此设计模式是为了同一主机上的多个程序共享数据库访问而设计的, 当需要通过网络访问时, 使用H2的Server mode仍然是更优的选择

那如果一定要通过网络访问Mixed mode的数据库呢?

  • 修改JDBC Url, 带参数 AUTO_SERVER_PORT=端口号 连接数据库
  • 读取 .lock.db , 使用id字段的值作为 serverKey
  • 使用 jdbc:h2:tcp://<address>:<port>/<serverKey> 通过网络访问数据库

需要注意的是 serverKey 是一个随机密钥, 在每次daemon thread启动时都会更换

因此该方法不适用于经常需要远程连接数据库的情景

在偶尔可能需要远程看看数据, 大部分情况下仅由本地程序访问的情况下还是比较合适的

能省掉一个单独跑着的H2 Server, 降低业务服务对外部环境的依赖性