一个 JVM 内多个独立的 H2 数据库

Multiple independent H2 databases within one JVM

是否可以在一个 JVM 中启动和关闭多个 H2 数据库?

我的目标是通过为每个 user/account 提供自己的数据库来支持 multi-tenancy。每个帐户的数据很少。帐户之间的数据永远不会一起访问、比较或分组;每个帐户都与其他帐户完全分开。每个帐户每天仅被短暂访问一次或每月访问几次。因此,将数据一起存放在一个数据库中几乎没有什么好处,但也有一些严重的缺点。

所以我的想法是,当用户登录特定帐户时,会加载该帐户的数据库。当该用户注销或他们的 Web 应用程序会话(Vaadin 应用程序)超时时,该帐户的数据库将关闭,将数据刷新到存储中,并可能执行备份。这种打开和关闭将同时发生在任意数量的数据库上。

好处包括最大限度地减少任何时候用于缓存数据和索引的内存量,最大限度地减少锁定和其他争用,并允许平滑缩放。

我是H2的新手,所以我不确定它的架构是否支持这个。我要求拒绝或确认此功能,以及任何提示或警告。

是的,可以这样做。每个数据库将包含自己的迷你环境,数据库之间没有可能的污染。

例如,您可以根据用户 ID 使用 jdbc url 或从用户登录:

  • jdbc:h2:user1 在 H2 1.3.x 嵌入模式
  • jdbc:h2:./user1 在 H2 1.4.x 嵌入模式
  • jdbc:h2:tcp://localhost/user1 在 tcp 模式下

您可以对数据库名称使用任何命名约定,前提是您的 OS 允许:user1、user2 等...或真正的登录名。

提示:

  • 使用服务器模式而不是嵌入式模式,允许来自多个sessions/hosts
  • 的同一用户多个连接
  • 有一个模式迁移器(如flyway)来初始化每个新创建的数据库
  • 确保您在应用程序的顶层管理名称冲突,并尽可能将这些数据库和相应的登录信息存储在专用数据库中

注意事项:

  • 不要使用连接池,因为连接很难重用
  • 您必须确保服务器上未使用 IFEXISTS=TRUE
  • 避免在 jdbc url 上使用调整,例如将 LOG=0、UNDO_LOG=0 等...
  • 我不知道您的 OS 或 JVM 是否会限制可以像这样打开多少个数据库文件。
  • 我不知道是否可以从手册页中调整此类设置。我找不到。

url参数有疑问请参考H2 manual