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

时间:2015-06-30 23:26:22

标签: java database h2 multi-tenant

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

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

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

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

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

1 个答案:

答案 0 :(得分:3)

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

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

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

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

<强>提示:

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

<强>注意事项:

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

有关网址参数的疑问,请参阅H2 manual