一个 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 相关(可能还有数据库损坏)?