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

Posted

技术标签:

【中文标题】一个 JVM 中的多个独立 H2 数据库【英文标题】:Multiple independent H2 databases within one JVM 【发布时间】:2015-06-30 23:26:21 【问题描述】:

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

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

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

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

我是 H2 的新手,所以我不确定它的架构是否可以支持这一点。我要求您拒绝或确认此功能,以及任何提示或注意事项。

【问题讨论】:

我正在考虑为一个项目使用相同的框架,鉴于您提出问题已经两年了,您能否详细说明您选择做什么?您是否遇到任何连接限制? 【参考方案1】:

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

例如,您可以使用基于用户 ID 或用户登录的 jdbc url:

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

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

提示:

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

注意事项:

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

url参数疑问请参考H2 manual。

【讨论】:

以上是关于一个 JVM 中的多个独立 H2 数据库的主要内容,如果未能解决你的问题,请参考以下文章

H2 数据库:NIO JVM 错误消息是不是与 H2 相关(可能还有数据库损坏)?

H2 数据库中的错误,同时运行多个测试

提供多个表时,简单连接在 H2 数据库中不起作用

[h2两个数据库同步更新]h2数据库配置多个连接

H2 数据库 1.3.156(或之前)和 1.3.157(及更高版本)之间的数据库连接问题

如何在 H2 中初始化视图