一个JVM中有多个独立的H2数据库

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

我的目标是通过为每个用户/帐户提供自己的数据库来支持多租户 。 每个帐户的数据都很少。 账户之间的数据永远不会被一起访问,比较或分组; 每个帐户与其他帐户完全分开。 每个帐户只能每天访问一次或每月访问几次。 因此,在单个数据库中将数据存储在一起的优势很少,并且存在一些严重的缺点。

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

优点包括最大限度地减少任何时候使用的内存量,以缓存数据和索引,最大限度地减少锁定和其他争用,并允许平滑扩展。

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

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

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

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

您可以对数据库名称使用任何命名约定,前提是您的操作系统允许它:user1,user2等…或者真正的登录名称。

提示:

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

注意事项:

  • 不要使用连接池,因为连接很难重用
  • 您必须确保服务器上未使用IFEXISTS = TRUE
  • 避免在jdbc url上使用调整,比如转LOG = 0,UNDO_LOG = 0等…
  • 我不知道你的操作系统或JVM是否有限制可以像这样打开多少个db文件。
  • 我不知道是否可以从手册页调整这样的设置。 我找不到一个。

有关url参数的疑问,请参阅H2手册 。